diff --git a/src/python/grpcio/Android.bp b/src/python/grpcio/Android.bp
new file mode 100644
index 0000000..0a44405
--- /dev/null
+++ b/src/python/grpcio/Android.bp
@@ -0,0 +1,39 @@
+package {
+    default_applicable_licenses: ["external_grpc-grpc_license"],
+}
+
+python_library_host {
+    name: "py-grpcio",
+    srcs: [
+        "grpc/**/*.py",
+    ],
+    libs: [
+        "py-grpcio-cygrpc",
+    ],
+}
+
+python_library_host {
+    name: "py-grpcio-cygrpc",
+    shared_libs: [
+        "cygrpc",
+    ],
+    pkg_path: "grpc/_cython",
+    visibility: ["//visibility:private"],
+}
+
+cc_library_host_shared {
+    name: "cygrpc",
+    srcs: [
+        "grpc/_cython/cygrpc.cpp",
+    ],
+    compile_multilib: "64",
+    shared_libs: [
+        "libgrpc++",
+    ],
+    allow_undefined_symbols: true,
+    header_libs: [
+        "libgrpc++_internal_headers",
+        "py3-headers",
+    ],
+    visibility: ["//visibility:private"],
+}
diff --git a/src/python/grpcio/grpc/_cython/cygrpc.cpp b/src/python/grpcio/grpc/_cython/cygrpc.cpp
new file mode 100644
index 0000000..d088b14
--- /dev/null
+++ b/src/python/grpcio/grpc/_cython/cygrpc.cpp
@@ -0,0 +1,183730 @@
+/* Generated by Cython 3.0.11 */
+
+#ifndef PY_SSIZE_T_CLEAN
+#define PY_SSIZE_T_CLEAN
+#endif /* PY_SSIZE_T_CLEAN */
+#if defined(CYTHON_LIMITED_API) && 0
+  #ifndef Py_LIMITED_API
+    #if CYTHON_LIMITED_API+0 > 0x03030000
+      #define Py_LIMITED_API CYTHON_LIMITED_API
+    #else
+      #define Py_LIMITED_API 0x03030000
+    #endif
+  #endif
+#endif
+
+#include "Python.h"
+
+    #if PY_MAJOR_VERSION >= 3
+      #define __Pyx_PyFloat_FromString(obj)  PyFloat_FromString(obj)
+    #else
+      #define __Pyx_PyFloat_FromString(obj)  PyFloat_FromString(obj, NULL)
+    #endif
+    
+
+    #if PY_MAJOR_VERSION <= 2
+    #define PyDict_GetItemWithError _PyDict_GetItemWithError
+    #endif
+    
+
+    #if (PY_VERSION_HEX < 0x030700b1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030600)) && !defined(PyContextVar_Get)
+    #define PyContextVar_Get(var, d, v)         ((d) ?             ((void)(var), Py_INCREF(d), (v)[0] = (d), 0) :             ((v)[0] = NULL, 0)         )
+    #endif
+    
+#ifndef Py_PYTHON_H
+    #error Python headers needed to compile C extensions, please install development version of Python.
+#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)
+    #error Cython requires Python 2.7+ or Python 3.3+.
+#else
+#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API
+#define __PYX_EXTRA_ABI_MODULE_NAME "limited"
+#else
+#define __PYX_EXTRA_ABI_MODULE_NAME ""
+#endif
+#define CYTHON_ABI "3_0_11" __PYX_EXTRA_ABI_MODULE_NAME
+#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI
+#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "."
+#define CYTHON_HEX_VERSION 0x03000BF0
+#define CYTHON_FUTURE_DIVISION 1
+#include <stddef.h>
+#ifndef offsetof
+  #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
+#endif
+#if !defined(_WIN32) && !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
+#define __PYX_COMMA ,
+#ifndef HAVE_LONG_LONG
+  #define HAVE_LONG_LONG
+#endif
+#ifndef PY_LONG_LONG
+  #define PY_LONG_LONG LONG_LONG
+#endif
+#ifndef Py_HUGE_VAL
+  #define Py_HUGE_VAL HUGE_VAL
+#endif
+#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX
+#if defined(GRAALVM_PYTHON)
+  /* For very preliminary testing purposes. Most variables are set the same as PyPy.
+     The existence of this section does not imply that anything works or is even tested */
+  #define CYTHON_COMPILING_IN_PYPY 0
+  #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_LIMITED_API 0
+  #define CYTHON_COMPILING_IN_GRAAL 1
+  #define CYTHON_COMPILING_IN_NOGIL 0
+  #undef CYTHON_USE_TYPE_SLOTS
+  #define CYTHON_USE_TYPE_SLOTS 0
+  #undef CYTHON_USE_TYPE_SPECS
+  #define CYTHON_USE_TYPE_SPECS 0
+  #undef CYTHON_USE_PYTYPE_LOOKUP
+  #define CYTHON_USE_PYTYPE_LOOKUP 0
+  #if PY_VERSION_HEX < 0x03050000
+    #undef CYTHON_USE_ASYNC_SLOTS
+    #define CYTHON_USE_ASYNC_SLOTS 0
+  #elif !defined(CYTHON_USE_ASYNC_SLOTS)
+    #define CYTHON_USE_ASYNC_SLOTS 1
+  #endif
+  #undef CYTHON_USE_PYLIST_INTERNALS
+  #define CYTHON_USE_PYLIST_INTERNALS 0
+  #undef CYTHON_USE_UNICODE_INTERNALS
+  #define CYTHON_USE_UNICODE_INTERNALS 0
+  #undef CYTHON_USE_UNICODE_WRITER
+  #define CYTHON_USE_UNICODE_WRITER 0
+  #undef CYTHON_USE_PYLONG_INTERNALS
+  #define CYTHON_USE_PYLONG_INTERNALS 0
+  #undef CYTHON_AVOID_BORROWED_REFS
+  #define CYTHON_AVOID_BORROWED_REFS 1
+  #undef CYTHON_ASSUME_SAFE_MACROS
+  #define CYTHON_ASSUME_SAFE_MACROS 0
+  #undef CYTHON_UNPACK_METHODS
+  #define CYTHON_UNPACK_METHODS 0
+  #undef CYTHON_FAST_THREAD_STATE
+  #define CYTHON_FAST_THREAD_STATE 0
+  #undef CYTHON_FAST_GIL
+  #define CYTHON_FAST_GIL 0
+  #undef CYTHON_METH_FASTCALL
+  #define CYTHON_METH_FASTCALL 0
+  #undef CYTHON_FAST_PYCALL
+  #define CYTHON_FAST_PYCALL 0
+  #ifndef CYTHON_PEP487_INIT_SUBCLASS
+    #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3)
+  #endif
+  #undef CYTHON_PEP489_MULTI_PHASE_INIT
+  #define CYTHON_PEP489_MULTI_PHASE_INIT 1
+  #undef CYTHON_USE_MODULE_STATE
+  #define CYTHON_USE_MODULE_STATE 0
+  #undef CYTHON_USE_TP_FINALIZE
+  #define CYTHON_USE_TP_FINALIZE 0
+  #undef CYTHON_USE_DICT_VERSIONS
+  #define CYTHON_USE_DICT_VERSIONS 0
+  #undef CYTHON_USE_EXC_INFO_STACK
+  #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 0
+  #endif
+  #undef CYTHON_USE_FREELISTS
+  #define CYTHON_USE_FREELISTS 0
+#elif defined(PYPY_VERSION)
+  #define CYTHON_COMPILING_IN_PYPY 1
+  #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_LIMITED_API 0
+  #define CYTHON_COMPILING_IN_GRAAL 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
+  #undef CYTHON_USE_TYPE_SLOTS
+  #define CYTHON_USE_TYPE_SLOTS 0
+  #ifndef CYTHON_USE_TYPE_SPECS
+    #define CYTHON_USE_TYPE_SPECS 0
+  #endif
+  #undef CYTHON_USE_PYTYPE_LOOKUP
+  #define CYTHON_USE_PYTYPE_LOOKUP 0
+  #if PY_VERSION_HEX < 0x03050000
+    #undef CYTHON_USE_ASYNC_SLOTS
+    #define CYTHON_USE_ASYNC_SLOTS 0
+  #elif !defined(CYTHON_USE_ASYNC_SLOTS)
+    #define CYTHON_USE_ASYNC_SLOTS 1
+  #endif
+  #undef CYTHON_USE_PYLIST_INTERNALS
+  #define CYTHON_USE_PYLIST_INTERNALS 0
+  #undef CYTHON_USE_UNICODE_INTERNALS
+  #define CYTHON_USE_UNICODE_INTERNALS 0
+  #undef CYTHON_USE_UNICODE_WRITER
+  #define CYTHON_USE_UNICODE_WRITER 0
+  #undef CYTHON_USE_PYLONG_INTERNALS
+  #define CYTHON_USE_PYLONG_INTERNALS 0
+  #undef CYTHON_AVOID_BORROWED_REFS
+  #define CYTHON_AVOID_BORROWED_REFS 1
+  #undef CYTHON_ASSUME_SAFE_MACROS
+  #define CYTHON_ASSUME_SAFE_MACROS 0
+  #undef CYTHON_UNPACK_METHODS
+  #define CYTHON_UNPACK_METHODS 0
+  #undef CYTHON_FAST_THREAD_STATE
+  #define CYTHON_FAST_THREAD_STATE 0
+  #undef CYTHON_FAST_GIL
+  #define CYTHON_FAST_GIL 0
+  #undef CYTHON_METH_FASTCALL
+  #define CYTHON_METH_FASTCALL 0
+  #undef CYTHON_FAST_PYCALL
+  #define CYTHON_FAST_PYCALL 0
+  #ifndef CYTHON_PEP487_INIT_SUBCLASS
+    #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3)
+  #endif
+  #if PY_VERSION_HEX < 0x03090000
+    #undef CYTHON_PEP489_MULTI_PHASE_INIT
+    #define CYTHON_PEP489_MULTI_PHASE_INIT 0
+  #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT)
+    #define CYTHON_PEP489_MULTI_PHASE_INIT 1
+  #endif
+  #undef CYTHON_USE_MODULE_STATE
+  #define CYTHON_USE_MODULE_STATE 0
+  #undef CYTHON_USE_TP_FINALIZE
+  #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00)
+  #undef CYTHON_USE_DICT_VERSIONS
+  #define CYTHON_USE_DICT_VERSIONS 0
+  #undef CYTHON_USE_EXC_INFO_STACK
+  #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 0
+  #endif
+  #undef CYTHON_USE_FREELISTS
+  #define CYTHON_USE_FREELISTS 0
+#elif defined(CYTHON_LIMITED_API)
+  #ifdef Py_LIMITED_API
+    #undef __PYX_LIMITED_VERSION_HEX
+    #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API
+  #endif
+  #define CYTHON_COMPILING_IN_PYPY 0
+  #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_LIMITED_API 1
+  #define CYTHON_COMPILING_IN_GRAAL 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
+  #undef CYTHON_CLINE_IN_TRACEBACK
+  #define CYTHON_CLINE_IN_TRACEBACK 0
+  #undef CYTHON_USE_TYPE_SLOTS
+  #define CYTHON_USE_TYPE_SLOTS 0
+  #undef CYTHON_USE_TYPE_SPECS
+  #define CYTHON_USE_TYPE_SPECS 1
+  #undef CYTHON_USE_PYTYPE_LOOKUP
+  #define CYTHON_USE_PYTYPE_LOOKUP 0
+  #undef CYTHON_USE_ASYNC_SLOTS
+  #define CYTHON_USE_ASYNC_SLOTS 0
+  #undef CYTHON_USE_PYLIST_INTERNALS
+  #define CYTHON_USE_PYLIST_INTERNALS 0
+  #undef CYTHON_USE_UNICODE_INTERNALS
+  #define CYTHON_USE_UNICODE_INTERNALS 0
+  #ifndef CYTHON_USE_UNICODE_WRITER
+    #define CYTHON_USE_UNICODE_WRITER 0
+  #endif
+  #undef CYTHON_USE_PYLONG_INTERNALS
+  #define CYTHON_USE_PYLONG_INTERNALS 0
+  #ifndef CYTHON_AVOID_BORROWED_REFS
+    #define CYTHON_AVOID_BORROWED_REFS 0
+  #endif
+  #undef CYTHON_ASSUME_SAFE_MACROS
+  #define CYTHON_ASSUME_SAFE_MACROS 0
+  #undef CYTHON_UNPACK_METHODS
+  #define CYTHON_UNPACK_METHODS 0
+  #undef CYTHON_FAST_THREAD_STATE
+  #define CYTHON_FAST_THREAD_STATE 0
+  #undef CYTHON_FAST_GIL
+  #define CYTHON_FAST_GIL 0
+  #undef CYTHON_METH_FASTCALL
+  #define CYTHON_METH_FASTCALL 0
+  #undef CYTHON_FAST_PYCALL
+  #define CYTHON_FAST_PYCALL 0
+  #ifndef CYTHON_PEP487_INIT_SUBCLASS
+    #define CYTHON_PEP487_INIT_SUBCLASS 1
+  #endif
+  #undef CYTHON_PEP489_MULTI_PHASE_INIT
+  #define CYTHON_PEP489_MULTI_PHASE_INIT 0
+  #undef CYTHON_USE_MODULE_STATE
+  #define CYTHON_USE_MODULE_STATE 1
+  #ifndef CYTHON_USE_TP_FINALIZE
+    #define CYTHON_USE_TP_FINALIZE 0
+  #endif
+  #undef CYTHON_USE_DICT_VERSIONS
+  #define CYTHON_USE_DICT_VERSIONS 0
+  #undef CYTHON_USE_EXC_INFO_STACK
+  #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 0
+  #endif
+  #undef CYTHON_USE_FREELISTS
+  #define CYTHON_USE_FREELISTS 0
+#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL)
+  #define CYTHON_COMPILING_IN_PYPY 0
+  #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_LIMITED_API 0
+  #define CYTHON_COMPILING_IN_GRAAL 0
+  #define CYTHON_COMPILING_IN_NOGIL 1
+  #ifndef CYTHON_USE_TYPE_SLOTS
+    #define CYTHON_USE_TYPE_SLOTS 1
+  #endif
+  #ifndef CYTHON_USE_TYPE_SPECS
+    #define CYTHON_USE_TYPE_SPECS 0
+  #endif
+  #undef CYTHON_USE_PYTYPE_LOOKUP
+  #define CYTHON_USE_PYTYPE_LOOKUP 0
+  #ifndef CYTHON_USE_ASYNC_SLOTS
+    #define CYTHON_USE_ASYNC_SLOTS 1
+  #endif
+  #ifndef CYTHON_USE_PYLONG_INTERNALS
+    #define CYTHON_USE_PYLONG_INTERNALS 0
+  #endif
+  #undef CYTHON_USE_PYLIST_INTERNALS
+  #define CYTHON_USE_PYLIST_INTERNALS 0
+  #ifndef CYTHON_USE_UNICODE_INTERNALS
+    #define CYTHON_USE_UNICODE_INTERNALS 1
+  #endif
+  #undef CYTHON_USE_UNICODE_WRITER
+  #define CYTHON_USE_UNICODE_WRITER 0
+  #ifndef CYTHON_AVOID_BORROWED_REFS
+    #define CYTHON_AVOID_BORROWED_REFS 0
+  #endif
+  #ifndef CYTHON_ASSUME_SAFE_MACROS
+    #define CYTHON_ASSUME_SAFE_MACROS 1
+  #endif
+  #ifndef CYTHON_UNPACK_METHODS
+    #define CYTHON_UNPACK_METHODS 1
+  #endif
+  #undef CYTHON_FAST_THREAD_STATE
+  #define CYTHON_FAST_THREAD_STATE 0
+  #undef CYTHON_FAST_GIL
+  #define CYTHON_FAST_GIL 0
+  #ifndef CYTHON_METH_FASTCALL
+    #define CYTHON_METH_FASTCALL 1
+  #endif
+  #undef CYTHON_FAST_PYCALL
+  #define CYTHON_FAST_PYCALL 0
+  #ifndef CYTHON_PEP487_INIT_SUBCLASS
+    #define CYTHON_PEP487_INIT_SUBCLASS 1
+  #endif
+  #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
+    #define CYTHON_PEP489_MULTI_PHASE_INIT 1
+  #endif
+  #ifndef CYTHON_USE_MODULE_STATE
+    #define CYTHON_USE_MODULE_STATE 0
+  #endif
+  #ifndef CYTHON_USE_TP_FINALIZE
+    #define CYTHON_USE_TP_FINALIZE 1
+  #endif
+  #undef CYTHON_USE_DICT_VERSIONS
+  #define CYTHON_USE_DICT_VERSIONS 0
+  #undef CYTHON_USE_EXC_INFO_STACK
+  #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 1
+  #endif
+  #ifndef CYTHON_USE_FREELISTS
+    #define CYTHON_USE_FREELISTS 0
+  #endif
+#else
+  #define CYTHON_COMPILING_IN_PYPY 0
+  #define CYTHON_COMPILING_IN_CPYTHON 1
+  #define CYTHON_COMPILING_IN_LIMITED_API 0
+  #define CYTHON_COMPILING_IN_GRAAL 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
+  #ifndef CYTHON_USE_TYPE_SLOTS
+    #define CYTHON_USE_TYPE_SLOTS 1
+  #endif
+  #ifndef CYTHON_USE_TYPE_SPECS
+    #define CYTHON_USE_TYPE_SPECS 0
+  #endif
+  #ifndef CYTHON_USE_PYTYPE_LOOKUP
+    #define CYTHON_USE_PYTYPE_LOOKUP 1
+  #endif
+  #if PY_MAJOR_VERSION < 3
+    #undef CYTHON_USE_ASYNC_SLOTS
+    #define CYTHON_USE_ASYNC_SLOTS 0
+  #elif !defined(CYTHON_USE_ASYNC_SLOTS)
+    #define CYTHON_USE_ASYNC_SLOTS 1
+  #endif
+  #ifndef CYTHON_USE_PYLONG_INTERNALS
+    #define CYTHON_USE_PYLONG_INTERNALS 1
+  #endif
+  #ifndef CYTHON_USE_PYLIST_INTERNALS
+    #define CYTHON_USE_PYLIST_INTERNALS 1
+  #endif
+  #ifndef CYTHON_USE_UNICODE_INTERNALS
+    #define CYTHON_USE_UNICODE_INTERNALS 1
+  #endif
+  #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2
+    #undef CYTHON_USE_UNICODE_WRITER
+    #define CYTHON_USE_UNICODE_WRITER 0
+  #elif !defined(CYTHON_USE_UNICODE_WRITER)
+    #define CYTHON_USE_UNICODE_WRITER 1
+  #endif
+  #ifndef CYTHON_AVOID_BORROWED_REFS
+    #define CYTHON_AVOID_BORROWED_REFS 0
+  #endif
+  #ifndef CYTHON_ASSUME_SAFE_MACROS
+    #define CYTHON_ASSUME_SAFE_MACROS 1
+  #endif
+  #ifndef CYTHON_UNPACK_METHODS
+    #define CYTHON_UNPACK_METHODS 1
+  #endif
+  #ifndef CYTHON_FAST_THREAD_STATE
+    #define CYTHON_FAST_THREAD_STATE 1
+  #endif
+  #ifndef CYTHON_FAST_GIL
+    #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6)
+  #endif
+  #ifndef CYTHON_METH_FASTCALL
+    #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1)
+  #endif
+  #ifndef CYTHON_FAST_PYCALL
+    #define CYTHON_FAST_PYCALL 1
+  #endif
+  #ifndef CYTHON_PEP487_INIT_SUBCLASS
+    #define CYTHON_PEP487_INIT_SUBCLASS 1
+  #endif
+  #if PY_VERSION_HEX < 0x03050000
+    #undef CYTHON_PEP489_MULTI_PHASE_INIT
+    #define CYTHON_PEP489_MULTI_PHASE_INIT 0
+  #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT)
+    #define CYTHON_PEP489_MULTI_PHASE_INIT 1
+  #endif
+  #ifndef CYTHON_USE_MODULE_STATE
+    #define CYTHON_USE_MODULE_STATE 0
+  #endif
+  #if PY_VERSION_HEX < 0x030400a1
+    #undef CYTHON_USE_TP_FINALIZE
+    #define CYTHON_USE_TP_FINALIZE 0
+  #elif !defined(CYTHON_USE_TP_FINALIZE)
+    #define CYTHON_USE_TP_FINALIZE 1
+  #endif
+  #if PY_VERSION_HEX < 0x030600B1
+    #undef CYTHON_USE_DICT_VERSIONS
+    #define CYTHON_USE_DICT_VERSIONS 0
+  #elif !defined(CYTHON_USE_DICT_VERSIONS)
+    #define CYTHON_USE_DICT_VERSIONS  (PY_VERSION_HEX < 0x030C00A5)
+  #endif
+  #if PY_VERSION_HEX < 0x030700A3
+    #undef CYTHON_USE_EXC_INFO_STACK
+    #define CYTHON_USE_EXC_INFO_STACK 0
+  #elif !defined(CYTHON_USE_EXC_INFO_STACK)
+    #define CYTHON_USE_EXC_INFO_STACK 1
+  #endif
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 1
+  #endif
+  #ifndef CYTHON_USE_FREELISTS
+    #define CYTHON_USE_FREELISTS 1
+  #endif
+#endif
+#if !defined(CYTHON_FAST_PYCCALL)
+#define CYTHON_FAST_PYCCALL  (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1)
+#endif
+#if !defined(CYTHON_VECTORCALL)
+#define CYTHON_VECTORCALL  (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1)
+#endif
+#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1)
+#if CYTHON_USE_PYLONG_INTERNALS
+  #if PY_MAJOR_VERSION < 3
+    #include "longintrepr.h"
+  #endif
+  #undef SHIFT
+  #undef BASE
+  #undef MASK
+  #ifdef SIZEOF_VOID_P
+    enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
+  #endif
+#endif
+#ifndef __has_attribute
+  #define __has_attribute(x) 0
+#endif
+#ifndef __has_cpp_attribute
+  #define __has_cpp_attribute(x) 0
+#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
+#ifndef CYTHON_UNUSED
+  #if defined(__cplusplus)
+    /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17
+     * but leads to warnings with -pedantic, since it is a C++17 feature */
+    #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
+      #if __has_cpp_attribute(maybe_unused)
+        #define CYTHON_UNUSED [[maybe_unused]]
+      #endif
+    #endif
+  #endif
+#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
+#ifndef CYTHON_UNUSED_VAR
+#  if defined(__cplusplus)
+     template<class T> void CYTHON_UNUSED_VAR( const T& ) { }
+#  else
+#    define CYTHON_UNUSED_VAR(x) (void)(x)
+#  endif
+#endif
+#ifndef CYTHON_MAYBE_UNUSED_VAR
+  #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x)
+#endif
+#ifndef CYTHON_NCP_UNUSED
+# if CYTHON_COMPILING_IN_CPYTHON
+#  define CYTHON_NCP_UNUSED
+# else
+#  define CYTHON_NCP_UNUSED CYTHON_UNUSED
+# endif
+#endif
+#ifndef CYTHON_USE_CPP_STD_MOVE
+  #if defined(__cplusplus) && (\
+    __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600))
+    #define CYTHON_USE_CPP_STD_MOVE 1
+  #else
+    #define CYTHON_USE_CPP_STD_MOVE 0
+  #endif
+#endif
+#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None)
+#ifdef _MSC_VER
+    #ifndef _MSC_STDINT_H_
+        #if _MSC_VER < 1300
+            typedef unsigned char     uint8_t;
+            typedef unsigned short    uint16_t;
+            typedef unsigned int      uint32_t;
+        #else
+            typedef unsigned __int8   uint8_t;
+            typedef unsigned __int16  uint16_t;
+            typedef unsigned __int32  uint32_t;
+        #endif
+    #endif
+    #if _MSC_VER < 1300
+        #ifdef _WIN64
+            typedef unsigned long long  __pyx_uintptr_t;
+        #else
+            typedef unsigned int        __pyx_uintptr_t;
+        #endif
+    #else
+        #ifdef _WIN64
+            typedef unsigned __int64    __pyx_uintptr_t;
+        #else
+            typedef unsigned __int32    __pyx_uintptr_t;
+        #endif
+    #endif
+#else
+    #include <stdint.h>
+    typedef uintptr_t  __pyx_uintptr_t;
+#endif
+#ifndef CYTHON_FALLTHROUGH
+  #if defined(__cplusplus)
+    /* for clang __has_cpp_attribute(fallthrough) is true even before C++17
+     * but leads to warnings with -pedantic, since it is a C++17 feature */
+    #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
+      #if __has_cpp_attribute(fallthrough)
+        #define CYTHON_FALLTHROUGH [[fallthrough]]
+      #endif
+    #endif
+    #ifndef CYTHON_FALLTHROUGH
+      #if __has_cpp_attribute(clang::fallthrough)
+        #define CYTHON_FALLTHROUGH [[clang::fallthrough]]
+      #elif __has_cpp_attribute(gnu::fallthrough)
+        #define CYTHON_FALLTHROUGH [[gnu::fallthrough]]
+      #endif
+    #endif
+  #endif
+  #ifndef CYTHON_FALLTHROUGH
+    #if __has_attribute(fallthrough)
+      #define CYTHON_FALLTHROUGH __attribute__((fallthrough))
+    #else
+      #define CYTHON_FALLTHROUGH
+    #endif
+  #endif
+  #if defined(__clang__) && defined(__apple_build_version__)
+    #if __apple_build_version__ < 7000000
+      #undef  CYTHON_FALLTHROUGH
+      #define CYTHON_FALLTHROUGH
+    #endif
+  #endif
+#endif
+#ifdef __cplusplus
+  template <typename T>
+  struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);};
+  #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL<type>::value)
+#else
+  #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0)
+#endif
+#if CYTHON_COMPILING_IN_PYPY == 1
+  #define __PYX_NEED_TP_PRINT_SLOT  (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000)
+#else
+  #define __PYX_NEED_TP_PRINT_SLOT  (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000)
+#endif
+#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer))
+
+#ifndef __cplusplus
+  #error "Cython files generated with the C++ option must be compiled with a C++ compiler."
+#endif
+#ifndef CYTHON_INLINE
+  #if defined(__clang__)
+    #define CYTHON_INLINE __inline__ __attribute__ ((__unused__))
+  #else
+    #define CYTHON_INLINE inline
+  #endif
+#endif
+template<typename T>
+void __Pyx_call_destructor(T& x) {
+    x.~T();
+}
+template<typename T>
+class __Pyx_FakeReference {
+  public:
+    __Pyx_FakeReference() : ptr(NULL) { }
+    __Pyx_FakeReference(const T& ref) : ptr(const_cast<T*>(&ref)) { }
+    T *operator->() { return ptr; }
+    T *operator&() { return ptr; }
+    operator T&() { return *ptr; }
+    template<typename U> bool operator ==(const U& other) const { return *ptr == other; }
+    template<typename U> bool operator !=(const U& other) const { return *ptr != other; }
+    template<typename U> bool operator==(const __Pyx_FakeReference<U>& other) const { return *ptr == *other.ptr; }
+    template<typename U> bool operator!=(const __Pyx_FakeReference<U>& other) const { return *ptr != *other.ptr; }
+  private:
+    T *ptr;
+};
+
+#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_DefaultClassType PyClass_Type
+  #define __Pyx_PyCode_New(a, p, 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)
+#else
+  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
+  #define __Pyx_DefaultClassType PyType_Type
+#if CYTHON_COMPILING_IN_LIMITED_API
+    static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f,
+                                                    PyObject *code, PyObject *c, PyObject* n, PyObject *v,
+                                                    PyObject *fv, PyObject *cell, PyObject* fn,
+                                                    PyObject *name, int fline, PyObject *lnos) {
+        PyObject *exception_table = NULL;
+        PyObject *types_module=NULL, *code_type=NULL, *result=NULL;
+        #if __PYX_LIMITED_VERSION_HEX < 0x030B0000
+        PyObject *version_info;
+        PyObject *py_minor_version = NULL;
+        #endif
+        long minor_version = 0;
+        PyObject *type, *value, *traceback;
+        PyErr_Fetch(&type, &value, &traceback);
+        #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000
+        minor_version = 11;
+        #else
+        if (!(version_info = PySys_GetObject("version_info"))) goto end;
+        if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end;
+        minor_version = PyLong_AsLong(py_minor_version);
+        Py_DECREF(py_minor_version);
+        if (minor_version == -1 && PyErr_Occurred()) goto end;
+        #endif
+        if (!(types_module = PyImport_ImportModule("types"))) goto end;
+        if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end;
+        if (minor_version <= 7) {
+            (void)p;
+            result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code,
+                          c, n, v, fn, name, fline, lnos, fv, cell);
+        } else if (minor_version <= 10) {
+            result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code,
+                          c, n, v, fn, name, fline, lnos, fv, cell);
+        } else {
+            if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end;
+            result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code,
+                          c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell);
+        }
+    end:
+        Py_XDECREF(code_type);
+        Py_XDECREF(exception_table);
+        Py_XDECREF(types_module);
+        if (type) {
+            PyErr_Restore(type, value, traceback);
+        }
+        return result;
+    }
+    #ifndef CO_OPTIMIZED
+    #define CO_OPTIMIZED 0x0001
+    #endif
+    #ifndef CO_NEWLOCALS
+    #define CO_NEWLOCALS 0x0002
+    #endif
+    #ifndef CO_VARARGS
+    #define CO_VARARGS 0x0004
+    #endif
+    #ifndef CO_VARKEYWORDS
+    #define CO_VARKEYWORDS 0x0008
+    #endif
+    #ifndef CO_ASYNC_GENERATOR
+    #define CO_ASYNC_GENERATOR 0x0200
+    #endif
+    #ifndef CO_GENERATOR
+    #define CO_GENERATOR 0x0020
+    #endif
+    #ifndef CO_COROUTINE
+    #define CO_COROUTINE 0x0080
+    #endif
+#elif PY_VERSION_HEX >= 0x030B0000
+  static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f,
+                                                    PyObject *code, PyObject *c, PyObject* n, PyObject *v,
+                                                    PyObject *fv, PyObject *cell, PyObject* fn,
+                                                    PyObject *name, int fline, PyObject *lnos) {
+    PyCodeObject *result;
+    PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0);
+    if (!empty_bytes) return NULL;
+    result =
+      #if PY_VERSION_HEX >= 0x030C0000
+        PyUnstable_Code_NewWithPosOnlyArgs
+      #else
+        PyCode_NewWithPosOnlyArgs
+      #endif
+        (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes);
+    Py_DECREF(empty_bytes);
+    return result;
+  }
+#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY
+  #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
+          PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+#else
+  #define __Pyx_PyCode_New(a, p, 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)
+#endif
+#endif
+#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE)
+  #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type)
+#else
+  #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type))
+#endif
+#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is)
+  #define __Pyx_Py_Is(x, y)  Py_Is(x, y)
+#else
+  #define __Pyx_Py_Is(x, y) ((x) == (y))
+#endif
+#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone)
+  #define __Pyx_Py_IsNone(ob) Py_IsNone(ob)
+#else
+  #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None)
+#endif
+#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue)
+  #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob)
+#else
+  #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True)
+#endif
+#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse)
+  #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob)
+#else
+  #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False)
+#endif
+#define __Pyx_NoneAsNull(obj)  (__Pyx_Py_IsNone(obj) ? NULL : (obj))
+#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY
+  #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o)
+#else
+  #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o)
+#endif
+#ifndef CO_COROUTINE
+  #define CO_COROUTINE 0x80
+#endif
+#ifndef CO_ASYNC_GENERATOR
+  #define CO_ASYNC_GENERATOR 0x200
+#endif
+#ifndef Py_TPFLAGS_CHECKTYPES
+  #define Py_TPFLAGS_CHECKTYPES 0
+#endif
+#ifndef Py_TPFLAGS_HAVE_INDEX
+  #define Py_TPFLAGS_HAVE_INDEX 0
+#endif
+#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
+  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
+#endif
+#ifndef Py_TPFLAGS_HAVE_FINALIZE
+  #define Py_TPFLAGS_HAVE_FINALIZE 0
+#endif
+#ifndef Py_TPFLAGS_SEQUENCE
+  #define Py_TPFLAGS_SEQUENCE 0
+#endif
+#ifndef Py_TPFLAGS_MAPPING
+  #define Py_TPFLAGS_MAPPING 0
+#endif
+#ifndef METH_STACKLESS
+  #define METH_STACKLESS 0
+#endif
+#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL)
+  #ifndef METH_FASTCALL
+     #define METH_FASTCALL 0x80
+  #endif
+  typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs);
+  typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args,
+                                                          Py_ssize_t nargs, PyObject *kwnames);
+#else
+  #if PY_VERSION_HEX >= 0x030d00A4
+  #  define __Pyx_PyCFunctionFast PyCFunctionFast
+  #  define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords
+  #else
+  #  define __Pyx_PyCFunctionFast _PyCFunctionFast
+  #  define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords
+  #endif
+#endif
+#if CYTHON_METH_FASTCALL
+  #define __Pyx_METH_FASTCALL METH_FASTCALL
+  #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast
+  #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords
+#else
+  #define __Pyx_METH_FASTCALL METH_VARARGS
+  #define __Pyx_PyCFunction_FastCall PyCFunction
+  #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords
+#endif
+#if CYTHON_VECTORCALL
+  #define __pyx_vectorcallfunc vectorcallfunc
+  #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET  PY_VECTORCALL_ARGUMENTS_OFFSET
+  #define __Pyx_PyVectorcall_NARGS(n)  PyVectorcall_NARGS((size_t)(n))
+#elif CYTHON_BACKPORT_VECTORCALL
+  typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args,
+                                            size_t nargsf, PyObject *kwnames);
+  #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET  ((size_t)1 << (8 * sizeof(size_t) - 1))
+  #define __Pyx_PyVectorcall_NARGS(n)  ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET))
+#else
+  #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET  0
+  #define __Pyx_PyVectorcall_NARGS(n)  ((Py_ssize_t)(n))
+#endif
+#if PY_MAJOR_VERSION >= 0x030900B1
+#define __Pyx_PyCFunction_CheckExact(func)  PyCFunction_CheckExact(func)
+#else
+#define __Pyx_PyCFunction_CheckExact(func)  PyCFunction_Check(func)
+#endif
+#define __Pyx_CyOrPyCFunction_Check(func)  PyCFunction_Check(func)
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func)  (((PyCFunctionObject*)(func))->m_ml->ml_meth)
+#elif !CYTHON_COMPILING_IN_LIMITED_API
+#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func)  PyCFunction_GET_FUNCTION(func)
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_CyOrPyCFunction_GET_FLAGS(func)  (((PyCFunctionObject*)(func))->m_ml->ml_flags)
+static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) {
+    return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self;
+}
+#endif
+static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) {
+#if CYTHON_COMPILING_IN_LIMITED_API
+    return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc;
+#else
+    return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc;
+#endif
+}
+#define __Pyx_IsSameCFunction(func, cfunc)   __Pyx__IsSameCFunction(func, cfunc)
+#if __PYX_LIMITED_VERSION_HEX < 0x030900B1
+  #define __Pyx_PyType_FromModuleAndSpec(m, s, b)  ((void)m, PyType_FromSpecWithBases(s, b))
+  typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *);
+#else
+  #define __Pyx_PyType_FromModuleAndSpec(m, s, b)  PyType_FromModuleAndSpec(m, s, b)
+  #define __Pyx_PyCMethod  PyCMethod
+#endif
+#ifndef METH_METHOD
+  #define METH_METHOD 0x200
+#endif
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc)
+  #define PyObject_Malloc(s)   PyMem_Malloc(s)
+  #define PyObject_Free(p)     PyMem_Free(p)
+  #define PyObject_Realloc(p)  PyMem_Realloc(p)
+#endif
+#if CYTHON_COMPILING_IN_LIMITED_API
+  #define __Pyx_PyCode_HasFreeVars(co)  (PyCode_GetNumFree(co) > 0)
+  #define __Pyx_PyFrame_SetLineNumber(frame, lineno)
+#else
+  #define __Pyx_PyCode_HasFreeVars(co)  (PyCode_GetNumFree(co) > 0)
+  #define __Pyx_PyFrame_SetLineNumber(frame, lineno)  (frame)->f_lineno = (lineno)
+#endif
+#if CYTHON_COMPILING_IN_LIMITED_API
+  #define __Pyx_PyThreadState_Current PyThreadState_Get()
+#elif !CYTHON_FAST_THREAD_STATE
+  #define __Pyx_PyThreadState_Current PyThreadState_GET()
+#elif PY_VERSION_HEX >= 0x030d00A1
+  #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked()
+#elif PY_VERSION_HEX >= 0x03060000
+  #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet()
+#elif PY_VERSION_HEX >= 0x03000000
+  #define __Pyx_PyThreadState_Current PyThreadState_GET()
+#else
+  #define __Pyx_PyThreadState_Current _PyThreadState_Current
+#endif
+#if CYTHON_COMPILING_IN_LIMITED_API
+static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op)
+{
+    void *result;
+    result = PyModule_GetState(op);
+    if (!result)
+        Py_FatalError("Couldn't find the module state");
+    return result;
+}
+#endif
+#define __Pyx_PyObject_GetSlot(obj, name, func_ctype)  __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype)
+#if CYTHON_COMPILING_IN_LIMITED_API
+  #define __Pyx_PyType_GetSlot(type, name, func_ctype)  ((func_ctype) PyType_GetSlot((type), Py_##name))
+#else
+  #define __Pyx_PyType_GetSlot(type, name, func_ctype)  ((type)->name)
+#endif
+#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT)
+#include "pythread.h"
+#define Py_tss_NEEDS_INIT 0
+typedef int Py_tss_t;
+static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) {
+  *key = PyThread_create_key();
+  return 0;
+}
+static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) {
+  Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t));
+  *key = Py_tss_NEEDS_INIT;
+  return key;
+}
+static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) {
+  PyObject_Free(key);
+}
+static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) {
+  return *key != Py_tss_NEEDS_INIT;
+}
+static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) {
+  PyThread_delete_key(*key);
+  *key = Py_tss_NEEDS_INIT;
+}
+static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) {
+  return PyThread_set_key_value(*key, value);
+}
+static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
+  return PyThread_get_key_value(*key);
+}
+#endif
+#if PY_MAJOR_VERSION < 3
+    #if CYTHON_COMPILING_IN_PYPY
+        #if PYPY_VERSION_NUM < 0x07030600
+            #if defined(__cplusplus) && __cplusplus >= 201402L
+                [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]]
+            #elif defined(__GNUC__) || defined(__clang__)
+                __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")))
+            #elif defined(_MSC_VER)
+                __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))
+            #endif
+            static CYTHON_INLINE int PyGILState_Check(void) {
+                return 0;
+            }
+        #else  // PYPY_VERSION_NUM < 0x07030600
+        #endif  // PYPY_VERSION_NUM < 0x07030600
+    #else
+        static CYTHON_INLINE int PyGILState_Check(void) {
+            PyThreadState * tstate = _PyThreadState_Current;
+            return tstate && (tstate == PyGILState_GetThisThreadState());
+        }
+    #endif
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized)
+#define __Pyx_PyDict_NewPresized(n)  ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n))
+#else
+#define __Pyx_PyDict_NewPresized(n)  PyDict_New()
+#endif
+#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION
+  #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_Divide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS
+#define __Pyx_PyDict_GetItemStrWithError(dict, name)  _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash)
+static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) {
+    PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name);
+    if (res == NULL) PyErr_Clear();
+    return res;
+}
+#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000)
+#define __Pyx_PyDict_GetItemStrWithError  PyDict_GetItemWithError
+#define __Pyx_PyDict_GetItemStr           PyDict_GetItem
+#else
+static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) {
+#if CYTHON_COMPILING_IN_PYPY
+    return PyDict_GetItem(dict, name);
+#else
+    PyDictEntry *ep;
+    PyDictObject *mp = (PyDictObject*) dict;
+    long hash = ((PyStringObject *) name)->ob_shash;
+    assert(hash != -1);
+    ep = (mp->ma_lookup)(mp, name, hash);
+    if (ep == NULL) {
+        return NULL;
+    }
+    return ep->me_value;
+#endif
+}
+#define __Pyx_PyDict_GetItemStr           PyDict_GetItem
+#endif
+#if CYTHON_USE_TYPE_SLOTS
+  #define __Pyx_PyType_GetFlags(tp)   (((PyTypeObject *)tp)->tp_flags)
+  #define __Pyx_PyType_HasFeature(type, feature)  ((__Pyx_PyType_GetFlags(type) & (feature)) != 0)
+  #define __Pyx_PyObject_GetIterNextFunc(obj)  (Py_TYPE(obj)->tp_iternext)
+#else
+  #define __Pyx_PyType_GetFlags(tp)   (PyType_GetFlags((PyTypeObject *)tp))
+  #define __Pyx_PyType_HasFeature(type, feature)  PyType_HasFeature(type, feature)
+  #define __Pyx_PyObject_GetIterNextFunc(obj)  PyIter_Next
+#endif
+#if CYTHON_COMPILING_IN_LIMITED_API
+  #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v)
+#else
+  #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v)
+#endif
+#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000
+#define __Pyx_PyHeapTypeObject_GC_Del(obj)  {\
+    PyTypeObject *type = Py_TYPE((PyObject*)obj);\
+    assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\
+    PyObject_GC_Del(obj);\
+    Py_DECREF(type);\
+}
+#else
+#define __Pyx_PyHeapTypeObject_GC_Del(obj)  PyObject_GC_Del(obj)
+#endif
+#if CYTHON_COMPILING_IN_LIMITED_API
+  #define CYTHON_PEP393_ENABLED 1
+  #define __Pyx_PyUnicode_READY(op)       (0)
+  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GetLength(u)
+  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i)
+  #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u)   ((void)u, 1114111U)
+  #define __Pyx_PyUnicode_KIND(u)         ((void)u, (0))
+  #define __Pyx_PyUnicode_DATA(u)         ((void*)u)
+  #define __Pyx_PyUnicode_READ(k, d, i)   ((void)k, PyUnicode_ReadChar((PyObject*)(d), i))
+  #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != PyUnicode_GetLength(u))
+#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
+  #define CYTHON_PEP393_ENABLED 1
+  #if PY_VERSION_HEX >= 0x030C0000
+    #define __Pyx_PyUnicode_READY(op)       (0)
+  #else
+    #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ?\
+                                                0 : _PyUnicode_Ready((PyObject *)(op)))
+  #endif
+  #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_MAX_CHAR_VALUE(u)   PyUnicode_MAX_CHAR_VALUE(u)
+  #define __Pyx_PyUnicode_KIND(u)         ((int)PyUnicode_KIND(u))
+  #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
+  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
+  #define __Pyx_PyUnicode_WRITE(k, d, i, ch)  PyUnicode_WRITE(k, d, i, (Py_UCS4) ch)
+  #if PY_VERSION_HEX >= 0x030C0000
+    #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != PyUnicode_GET_LENGTH(u))
+  #else
+    #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000
+    #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length))
+    #else
+    #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u)))
+    #endif
+  #endif
+#else
+  #define CYTHON_PEP393_ENABLED 0
+  #define PyUnicode_1BYTE_KIND  1
+  #define PyUnicode_2BYTE_KIND  2
+  #define PyUnicode_4BYTE_KIND  4
+  #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_MAX_CHAR_VALUE(u)   ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U)
+  #define __Pyx_PyUnicode_KIND(u)         ((int)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]))
+  #define __Pyx_PyUnicode_WRITE(k, d, i, ch)  (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch)
+  #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != PyUnicode_GET_SIZE(u))
+#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)
+#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))
+#endif
+#if CYTHON_COMPILING_IN_PYPY
+  #if !defined(PyUnicode_DecodeUnicodeEscape)
+    #define PyUnicode_DecodeUnicodeEscape(s, size, errors)  PyUnicode_Decode(s, size, "unicode_escape", errors)
+  #endif
+  #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500)
+    #undef PyUnicode_Contains
+    #define PyUnicode_Contains(u, s)  PySequence_Contains(u, s)
+  #endif
+  #if !defined(PyByteArray_Check)
+    #define PyByteArray_Check(obj)  PyObject_TypeCheck(obj, &PyByteArray_Type)
+  #endif
+  #if !defined(PyObject_Format)
+    #define PyObject_Format(obj, fmt)  PyObject_CallMethod(obj, "__format__", "O", fmt)
+  #endif
+#endif
+#define __Pyx_PyString_FormatSafe(a, b)   ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
+#define __Pyx_PyUnicode_FormatSafe(a, b)  ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? 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 && !defined(PyObject_ASCII)
+  #define PyObject_ASCII(o)            PyObject_Repr(o)
+#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
+#ifndef PyObject_Unicode
+  #define PyObject_Unicode             PyObject_Str
+#endif
+#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
+#if CYTHON_COMPILING_IN_CPYTHON
+  #define __Pyx_PySequence_ListKeepNew(obj)\
+    (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj))
+#else
+  #define __Pyx_PySequence_ListKeepNew(obj)  PySequence_List(obj)
+#endif
+#ifndef PySet_CheckExact
+  #define PySet_CheckExact(obj)        __Pyx_IS_TYPE(obj, &PySet_Type)
+#endif
+#if PY_VERSION_HEX >= 0x030900A4
+  #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt)
+  #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size)
+#else
+  #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt)
+  #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size)
+#endif
+#if CYTHON_ASSUME_SAFE_MACROS
+  #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i)
+  #define __Pyx_PySequence_SIZE(seq)  Py_SIZE(seq)
+  #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0))
+  #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0))
+  #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o)
+  #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o)
+  #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o)
+  #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o)
+  #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o)
+#else
+  #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i)
+  #define __Pyx_PySequence_SIZE(seq)  PySequence_Size(seq)
+  #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v)
+  #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v)
+  #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o)
+  #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o)
+  #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o)
+  #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o)
+  #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o)
+#endif
+#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1
+  #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name)
+#else
+  static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) {
+      PyObject *module = PyImport_AddModule(name);
+      Py_XINCREF(module);
+      return module;
+  }
+#endif
+#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 __Pyx_Py3Int_Check(op)       PyLong_Check(op)
+  #define __Pyx_Py3Int_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
+#else
+  #define __Pyx_Py3Int_Check(op)       (PyLong_Check(op) || PyInt_Check(op))
+  #define __Pyx_Py3Int_CheckExact(op)  (PyLong_CheckExact(op) || PyInt_CheckExact(op))
+#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   __Pyx_PyIndex_AsHash_t
+#else
+  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
+  #define __Pyx_PyInt_AsHash_t   __Pyx_PyIndex_AsSsize_t
+#endif
+#if CYTHON_USE_ASYNC_SLOTS
+  #if PY_VERSION_HEX >= 0x030500B1
+    #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
+    #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
+  #else
+    #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
+  #endif
+#else
+  #define __Pyx_PyType_AsAsync(obj) NULL
+#endif
+#ifndef __Pyx_PyAsyncMethodsStruct
+    typedef struct {
+        unaryfunc am_await;
+        unaryfunc am_aiter;
+        unaryfunc am_anext;
+    } __Pyx_PyAsyncMethodsStruct;
+#endif
+
+#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS)
+  #if !defined(_USE_MATH_DEFINES)
+    #define _USE_MATH_DEFINES
+  #endif
+#endif
+#include <math.h>
+#ifdef NAN
+#define __PYX_NAN() ((float) NAN)
+#else
+static CYTHON_INLINE float __PYX_NAN() {
+  float value;
+  memset(&value, 0xFF, sizeof(value));
+  return value;
+}
+#endif
+#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL)
+#define __Pyx_truncl trunc
+#else
+#define __Pyx_truncl truncl
+#endif
+
+#define __PYX_MARK_ERR_POS(f_index, lineno) \
+    { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__;  (void)__pyx_clineno; }
+#define __PYX_ERR(f_index, lineno, Ln_error) \
+    { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; }
+
+#ifdef CYTHON_EXTERN_C
+    #undef __PYX_EXTERN_C
+    #define __PYX_EXTERN_C CYTHON_EXTERN_C
+#elif defined(__PYX_EXTERN_C)
+    #ifdef _MSC_VER
+    #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.")
+    #else
+    #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.
+    #endif
+#else
+    #define __PYX_EXTERN_C extern "C++"
+#endif
+
+#define __PYX_HAVE___cython__cygrpc
+#define __PYX_HAVE_API___cython__cygrpc
+/* Early includes */
+#include <string.h>
+#include <stdio.h>
+#include <stddef.h>
+#include "pythread.h"
+#include <string>
+#include "ios"
+#include "new"
+#include "stdexcept"
+#include "typeinfo"
+#include <time.h>
+#include <queue>
+#include <mutex>
+#include <condition_variable>
+#include "src/core/lib/channel/call_tracer.h"
+#include "src/core/lib/channel/context.h"
+#include "src/core/lib/surface/call.h"
+#include "grpc/support/alloc.h"
+#include "grpc/byte_buffer_reader.h"
+#include "grpc/impl/codegen/grpc_types.h"
+#include "grpc/grpc.h"
+#include "grpc/grpc_security.h"
+#include "grpc/compression.h"
+#include "grpc/impl/codegen/compression_types.h"
+#include "grpc/grpc_security_constants.h"
+#include "src/core/lib/config/config_vars.h"
+#include "grpc/impl/propagation_bits.h"
+#include "src/core/lib/iomgr/timer_manager.h"
+#include "src/core/lib/iomgr/iomgr_internal.h"
+#include "src/core/lib/iomgr/executor.h"
+#include <sys/types.h>
+#include <unistd.h>
+#ifdef _OPENMP
+#include <omp.h>
+#endif /* _OPENMP */
+
+#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS)
+#define CYTHON_WITHOUT_ASSERTIONS
+#endif
+
+typedef struct {PyObject **p; const 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_UTF8 0
+#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8)
+#define __PYX_DEFAULT_STRING_ENCODING ""
+#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
+#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
+#define __Pyx_uchar_cast(c) ((unsigned char)c)
+#define __Pyx_long_cast(x) ((long)x)
+#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 int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) {
+    return (size_t) i < (size_t) limit;
+}
+#if defined (__cplusplus) && __cplusplus >= 201103L
+    #include <cstdlib>
+    #define __Pyx_sst_abs(value) std::abs(value)
+#elif SIZEOF_INT >= SIZEOF_SIZE_T
+    #define __Pyx_sst_abs(value) abs(value)
+#elif SIZEOF_LONG >= SIZEOF_SIZE_T
+    #define __Pyx_sst_abs(value) labs(value)
+#elif defined (_MSC_VER)
+    #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value))
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+    #define __Pyx_sst_abs(value) llabs(value)
+#elif defined (__GNUC__)
+    #define __Pyx_sst_abs(value) __builtin_llabs(value)
+#else
+    #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
+#endif
+static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s);
+static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*);
+static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
+static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*);
+#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_PyBytes_AsWritableString(s)     ((char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsWritableSString(s)    ((signed char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsWritableUString(s)    ((unsigned char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsString(s)     ((const char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsSString(s)    ((const signed char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsUString(s)    ((const unsigned char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyObject_AsWritableString(s)    ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_AsWritableSString(s)    ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_AsWritableUString(s)    ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_AsSString(s)    ((const signed char*) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_AsUString(s)    ((const unsigned char*) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_FromCString(s)  __Pyx_PyObject_FromString((const char*)s)
+#define __Pyx_PyBytes_FromCString(s)   __Pyx_PyBytes_FromString((const char*)s)
+#define __Pyx_PyByteArray_FromCString(s)   __Pyx_PyByteArray_FromString((const char*)s)
+#define __Pyx_PyStr_FromCString(s)     __Pyx_PyStr_FromString((const char*)s)
+#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
+#define __Pyx_PyUnicode_FromOrdinal(o)       PyUnicode_FromOrdinal((int)o)
+#define __Pyx_PyUnicode_AsUnicode            PyUnicode_AsUnicode
+#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
+#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
+static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b);
+static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
+static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*);
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
+#define __Pyx_PySequence_Tuple(obj)\
+    (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj))
+static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
+static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
+static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*);
+#if CYTHON_ASSUME_SAFE_MACROS
+#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
+#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x))
+#else
+#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x))
+#endif
+#if CYTHON_USE_PYLONG_INTERNALS
+  #if PY_VERSION_HEX >= 0x030C00A7
+  #ifndef _PyLong_SIGN_MASK
+    #define _PyLong_SIGN_MASK 3
+  #endif
+  #ifndef _PyLong_NON_SIZE_BITS
+    #define _PyLong_NON_SIZE_BITS 3
+  #endif
+  #define __Pyx_PyLong_Sign(x)  (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK)
+  #define __Pyx_PyLong_IsNeg(x)  ((__Pyx_PyLong_Sign(x) & 2) != 0)
+  #define __Pyx_PyLong_IsNonNeg(x)  (!__Pyx_PyLong_IsNeg(x))
+  #define __Pyx_PyLong_IsZero(x)  (__Pyx_PyLong_Sign(x) & 1)
+  #define __Pyx_PyLong_IsPos(x)  (__Pyx_PyLong_Sign(x) == 0)
+  #define __Pyx_PyLong_CompactValueUnsigned(x)  (__Pyx_PyLong_Digits(x)[0])
+  #define __Pyx_PyLong_DigitCount(x)  ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS))
+  #define __Pyx_PyLong_SignedDigitCount(x)\
+        ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x))
+  #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue)
+    #define __Pyx_PyLong_IsCompact(x)     PyUnstable_Long_IsCompact((PyLongObject*) x)
+    #define __Pyx_PyLong_CompactValue(x)  PyUnstable_Long_CompactValue((PyLongObject*) x)
+  #else
+    #define __Pyx_PyLong_IsCompact(x)     (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS))
+    #define __Pyx_PyLong_CompactValue(x)  ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0])
+  #endif
+  typedef Py_ssize_t  __Pyx_compact_pylong;
+  typedef size_t  __Pyx_compact_upylong;
+  #else
+  #define __Pyx_PyLong_IsNeg(x)  (Py_SIZE(x) < 0)
+  #define __Pyx_PyLong_IsNonNeg(x)  (Py_SIZE(x) >= 0)
+  #define __Pyx_PyLong_IsZero(x)  (Py_SIZE(x) == 0)
+  #define __Pyx_PyLong_IsPos(x)  (Py_SIZE(x) > 0)
+  #define __Pyx_PyLong_CompactValueUnsigned(x)  ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0])
+  #define __Pyx_PyLong_DigitCount(x)  __Pyx_sst_abs(Py_SIZE(x))
+  #define __Pyx_PyLong_SignedDigitCount(x)  Py_SIZE(x)
+  #define __Pyx_PyLong_IsCompact(x)  (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1)
+  #define __Pyx_PyLong_CompactValue(x)\
+        ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0]))
+  typedef sdigit  __Pyx_compact_pylong;
+  typedef digit  __Pyx_compact_upylong;
+  #endif
+  #if PY_VERSION_HEX >= 0x030C00A5
+  #define __Pyx_PyLong_Digits(x)  (((PyLongObject*)x)->long_value.ob_digit)
+  #else
+  #define __Pyx_PyLong_Digits(x)  (((PyLongObject*)x)->ob_digit)
+  #endif
+#endif
+#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
+#include <string.h>
+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*) "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] = (char) 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
+#include <string.h>
+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) + 1);
+    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 CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; }
+
+#if !CYTHON_USE_MODULE_STATE
+static PyObject *__pyx_m = NULL;
+#endif
+static int __pyx_lineno;
+static int __pyx_clineno = 0;
+static const char * __pyx_cfilenm = __FILE__;
+static const char *__pyx_filename;
+
+/* #### Code section: filename_table ### */
+
+static const char *__pyx_f[] = {
+  "src/python/grpcio/grpc/_cython/cygrpc.pyx",
+  "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi",
+  "<stringsource>",
+  "contextvars.pxd",
+  "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pxd.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pxd.pxi",
+  "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi",
+  "type.pxd",
+  "bool.pxd",
+  "complex.pxd",
+  "src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi",
+};
+/* #### Code section: utility_code_proto_before_types ### */
+/* ForceInitThreads.proto */
+#ifndef __PYX_FORCE_INIT_THREADS
+  #define __PYX_FORCE_INIT_THREADS 0
+#endif
+
+/* NoFastGil.proto */
+#define __Pyx_PyGILState_Ensure PyGILState_Ensure
+#define __Pyx_PyGILState_Release PyGILState_Release
+#define __Pyx_FastGIL_Remember()
+#define __Pyx_FastGIL_Forget()
+#define __Pyx_FastGilFuncInit()
+
+/* #### Code section: numeric_typedefs ### */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":19
+ * cimport libc.time
+ * 
+ * ctypedef          ssize_t   intptr_t             # <<<<<<<<<<<<<<
+ * ctypedef          size_t    uintptr_t
+ * ctypedef   signed char      int8_t
+ */
+typedef Py_ssize_t __pyx_t_7_cython_6cygrpc_intptr_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":20
+ * 
+ * ctypedef          ssize_t   intptr_t
+ * ctypedef          size_t    uintptr_t             # <<<<<<<<<<<<<<
+ * ctypedef   signed char      int8_t
+ * ctypedef   signed short     int16_t
+ */
+typedef size_t __pyx_t_7_cython_6cygrpc_uintptr_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":21
+ * ctypedef          ssize_t   intptr_t
+ * ctypedef          size_t    uintptr_t
+ * ctypedef   signed char      int8_t             # <<<<<<<<<<<<<<
+ * ctypedef   signed short     int16_t
+ * ctypedef   signed int       int32_t
+ */
+typedef signed char __pyx_t_7_cython_6cygrpc_int8_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":22
+ * ctypedef          size_t    uintptr_t
+ * ctypedef   signed char      int8_t
+ * ctypedef   signed short     int16_t             # <<<<<<<<<<<<<<
+ * ctypedef   signed int       int32_t
+ * ctypedef   signed long long int64_t
+ */
+typedef short __pyx_t_7_cython_6cygrpc_int16_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":23
+ * ctypedef   signed char      int8_t
+ * ctypedef   signed short     int16_t
+ * ctypedef   signed int       int32_t             # <<<<<<<<<<<<<<
+ * ctypedef   signed long long int64_t
+ * ctypedef unsigned char      uint8_t
+ */
+typedef int __pyx_t_7_cython_6cygrpc_int32_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":24
+ * ctypedef   signed short     int16_t
+ * ctypedef   signed int       int32_t
+ * ctypedef   signed long long int64_t             # <<<<<<<<<<<<<<
+ * ctypedef unsigned char      uint8_t
+ * ctypedef unsigned short     uint16_t
+ */
+typedef PY_LONG_LONG __pyx_t_7_cython_6cygrpc_int64_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":25
+ * ctypedef   signed int       int32_t
+ * ctypedef   signed long long int64_t
+ * ctypedef unsigned char      uint8_t             # <<<<<<<<<<<<<<
+ * ctypedef unsigned short     uint16_t
+ * ctypedef unsigned int       uint32_t
+ */
+typedef unsigned char __pyx_t_7_cython_6cygrpc_uint8_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":26
+ * ctypedef   signed long long int64_t
+ * ctypedef unsigned char      uint8_t
+ * ctypedef unsigned short     uint16_t             # <<<<<<<<<<<<<<
+ * ctypedef unsigned int       uint32_t
+ * ctypedef unsigned long long uint64_t
+ */
+typedef unsigned short __pyx_t_7_cython_6cygrpc_uint16_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":27
+ * ctypedef unsigned char      uint8_t
+ * ctypedef unsigned short     uint16_t
+ * ctypedef unsigned int       uint32_t             # <<<<<<<<<<<<<<
+ * ctypedef unsigned long long uint64_t
+ * 
+ */
+typedef unsigned int __pyx_t_7_cython_6cygrpc_uint32_t;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi":28
+ * ctypedef unsigned short     uint16_t
+ * ctypedef unsigned int       uint32_t
+ * ctypedef unsigned long long uint64_t             # <<<<<<<<<<<<<<
+ * 
+ * # C++ Utilities
+ */
+typedef unsigned PY_LONG_LONG __pyx_t_7_cython_6cygrpc_uint64_t;
+/* #### Code section: complex_type_declarations ### */
+/* #### Code section: type_declarations ### */
+
+/*--- Type declarations ---*/
+struct __pyx_obj_7_cython_6cygrpc__ChannelArg;
+struct __pyx_obj_7_cython_6cygrpc__ChannelArgs;
+struct __pyx_obj_7_cython_6cygrpc_Call;
+struct __pyx_obj_7_cython_6cygrpc__CallState;
+struct __pyx_obj_7_cython_6cygrpc__ChannelState;
+struct __pyx_obj_7_cython_6cygrpc_IntegratedCall;
+struct __pyx_obj_7_cython_6cygrpc_SegregatedCall;
+struct __pyx_obj_7_cython_6cygrpc_Channel;
+struct __pyx_obj_7_cython_6cygrpc_CallHandle;
+struct __pyx_obj_7_cython_6cygrpc_CallCredentials;
+struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials;
+struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials;
+struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials;
+struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU;
+struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials;
+struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials;
+struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials;
+struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig;
+struct __pyx_obj_7_cython_6cygrpc_ServerCredentials;
+struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials;
+struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials;
+struct __pyx_obj_7_cython_6cygrpc__LatentEventArg;
+struct __pyx_obj_7_cython_6cygrpc_CompletionQueue;
+struct __pyx_obj_7_cython_6cygrpc_BaseEvent;
+struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent;
+struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent;
+struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent;
+struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent;
+struct __pyx_obj_7_cython_6cygrpc_Operation;
+struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation;
+struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation;
+struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation;
+struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation;
+struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation;
+struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation;
+struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation;
+struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation;
+struct __pyx_obj_7_cython_6cygrpc_CallDetails;
+struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair;
+struct __pyx_obj_7_cython_6cygrpc_CompressionOptions;
+struct __pyx_obj_7_cython_6cygrpc_Server;
+struct __pyx_obj_7_cython_6cygrpc__Tag;
+struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag;
+struct __pyx_obj_7_cython_6cygrpc__RequestCallTag;
+struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag;
+struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag;
+struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue;
+struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop;
+struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue;
+struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus;
+struct __pyx_obj_7_cython_6cygrpc__AioState;
+struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler;
+struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper;
+struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper;
+struct __pyx_obj_7_cython_6cygrpc__AioCall;
+struct __pyx_obj_7_cython_6cygrpc_AioChannel;
+struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails;
+struct __pyx_obj_7_cython_6cygrpc_RPCState;
+struct __pyx_obj_7_cython_6cygrpc__ServicerContext;
+struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext;
+struct __pyx_obj_7_cython_6cygrpc__MessageReceiver;
+struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter;
+struct __pyx_obj_7_cython_6cygrpc_AioServer;
+struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper;
+struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials;
+struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials;
+struct __pyx_obj_7_cython_6cygrpc_CensusContext;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown;
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination;
+struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg;
+struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_;
+struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args;
+struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_;
+struct __pyx_opt_args_7cpython_11contextvars_get_value;
+struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default;
+
+/* "cpython/contextvars.pxd":112
+ * 
+ * 
+ * cdef inline object get_value(var, default_value=None):             # <<<<<<<<<<<<<<
+ *     """Return a new reference to the value of the context variable,
+ *     or the default value of the context variable,
+ */
+struct __pyx_opt_args_7cpython_11contextvars_get_value {
+  int __pyx_n;
+  PyObject *default_value;
+};
+
+/* "cpython/contextvars.pxd":129
+ * 
+ * 
+ * cdef inline object get_value_no_default(var, default_value=None):             # <<<<<<<<<<<<<<
+ *     """Return a new reference to the value of the context variable,
+ *     or the provided default value if no such value was found.
+ */
+struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default {
+  int __pyx_n;
+  PyObject *default_value;
+};
+struct __pyx_t_7_cython_6cygrpc_CallbackContext;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi":15
+ * # limitations under the License.
+ * 
+ * cdef enum AioChannelStatus:             # <<<<<<<<<<<<<<
+ *     AIO_CHANNEL_STATUS_UNKNOWN
+ *     AIO_CHANNEL_STATUS_READY
+ */
+enum __pyx_t_7_cython_6cygrpc_AioChannelStatus {
+  __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_UNKNOWN,
+  __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_READY,
+  __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_CLOSING,
+  __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_DESTROYED
+};
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":64
+ * 
+ * 
+ * cdef enum AioServerStatus:             # <<<<<<<<<<<<<<
+ *     AIO_SERVER_STATUS_UNKNOWN
+ *     AIO_SERVER_STATUS_READY
+ */
+enum __pyx_t_7_cython_6cygrpc_AioServerStatus {
+  __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_UNKNOWN,
+  __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_READY,
+  __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_RUNNING,
+  __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPED,
+  __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPING
+};
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi":16
+ * 
+ * 
+ * ctypedef queue[grpc_event] cpp_event_queue             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+typedef std::queue<grpc_event>  __pyx_t_7_cython_6cygrpc_cpp_event_queue;
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi":24
+ * 
+ * 
+ * cdef struct CallbackContext:             # <<<<<<<<<<<<<<
+ *     # C struct to store callback context in the form of pointers.
+ *     #
+ */
+struct __pyx_t_7_cython_6cygrpc_CallbackContext {
+  grpc_completion_queue_functor functor;
+  PyObject *waiter;
+  PyObject *loop;
+  PyObject *failure_handler;
+  PyObject *callback_wrapper;
+};
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pxd.pxi":22
+ * 
+ * 
+ * cdef class _ChannelArg:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_arg c_argument
+ */
+struct __pyx_obj_7_cython_6cygrpc__ChannelArg {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArg *__pyx_vtab;
+  grpc_arg c_argument;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pxd.pxi":29
+ * 
+ * 
+ * cdef class _ChannelArgs:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly tuple _arguments
+ */
+struct __pyx_obj_7_cython_6cygrpc__ChannelArgs {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs *__pyx_vtab;
+  PyObject *_arguments;
+  PyObject *_channel_args;
+  PyObject *_references;
+  grpc_channel_args _c_arguments;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pxd.pxi":16
+ * 
+ * 
+ * cdef class Call:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call *c_call
+ */
+struct __pyx_obj_7_cython_6cygrpc_Call {
+  PyObject_HEAD
+  grpc_call *c_call;
+  PyObject *references;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi":25
+ * 
+ * 
+ * cdef class _CallState:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call *c_call
+ */
+struct __pyx_obj_7_cython_6cygrpc__CallState {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc__CallState *__pyx_vtab;
+  grpc_call *c_call;
+  PyObject *due;
+  PyObject *call_tracer_capsule;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi":35
+ * 
+ * 
+ * cdef class _ChannelState:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef bytes target
+ */
+struct __pyx_obj_7_cython_6cygrpc__ChannelState {
+  PyObject_HEAD
+  PyObject *target;
+  PyObject *condition;
+  grpc_channel *c_channel;
+  PyObject *open;
+  PyObject *closed_reason;
+  PyObject *integrated_call_states;
+  grpc_completion_queue *c_call_completion_queue;
+  PyObject *segregated_call_states;
+  PyObject *connectivity_due;
+  grpc_completion_queue *c_connectivity_completion_queue;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi":61
+ * 
+ * 
+ * cdef class IntegratedCall:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef _ChannelState _channel_state
+ */
+struct __pyx_obj_7_cython_6cygrpc_IntegratedCall {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *_channel_state;
+  struct __pyx_obj_7_cython_6cygrpc__CallState *_call_state;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi":67
+ * 
+ * 
+ * cdef class SegregatedCall:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef _ChannelState _channel_state
+ */
+struct __pyx_obj_7_cython_6cygrpc_SegregatedCall {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *_channel_state;
+  struct __pyx_obj_7_cython_6cygrpc__CallState *_call_state;
+  grpc_completion_queue *_c_completion_queue;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi":74
+ * 
+ * 
+ * cdef class Channel:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef _ChannelState _state
+ */
+struct __pyx_obj_7_cython_6cygrpc_Channel {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *_state;
+  PyObject *_registered_call_handles;
+  PyObject *_arguments;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pxd.pxi":83
+ * 
+ * 
+ * cdef class CallHandle:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void *c_call_handle
+ */
+struct __pyx_obj_7_cython_6cygrpc_CallHandle {
+  PyObject_HEAD
+  void *c_call_handle;
+  PyObject *method;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":16
+ * 
+ * 
+ * cdef class CallCredentials:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call_credentials *c(self) except *
+ */
+struct __pyx_obj_7_cython_6cygrpc_CallCredentials {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials *__pyx_vtab;
+  grpc_call_credentials *c_credentials;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":34
+ * 
+ * 
+ * cdef class MetadataPluginCallCredentials(CallCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly object _metadata_plugin
+ */
+struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials __pyx_base;
+  PyObject *_metadata_plugin;
+  PyObject *_name;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":45
+ * 
+ * 
+ * cdef class CompositeCallCredentials(CallCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly tuple _call_credentialses
+ */
+struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials __pyx_base;
+  PyObject *_call_credentialses;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":52
+ * 
+ * 
+ * cdef class ChannelCredentials:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *
+ */
+struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials *__pyx_vtab;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":57
+ * 
+ * 
+ * cdef class SSLSessionCacheLRU:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_ssl_session_cache *_cache
+ */
+struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU {
+  PyObject_HEAD
+  grpc_ssl_session_cache *_cache;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":62
+ * 
+ * 
+ * cdef class SSLChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly object _pem_root_certificates
+ */
+struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+  PyObject *_pem_root_certificates;
+  PyObject *_private_key;
+  PyObject *_certificate_chain;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":71
+ * 
+ * 
+ * cdef class CompositeChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly tuple _call_credentialses
+ */
+struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+  PyObject *_call_credentialses;
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *_channel_credentials;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":79
+ * 
+ * 
+ * cdef class XDSChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly ChannelCredentials _fallback_credentials
+ */
+struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *_fallback_credentials;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":86
+ * 
+ * 
+ * cdef class ServerCertificateConfig:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_ssl_server_certificate_config *c_cert_config
+ */
+struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig {
+  PyObject_HEAD
+  grpc_ssl_server_certificate_config *c_cert_config;
+  char const *c_pem_root_certs;
+  grpc_ssl_pem_key_cert_pair *c_ssl_pem_key_cert_pairs;
+  size_t c_ssl_pem_key_cert_pairs_count;
+  PyObject *references;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":95
+ * 
+ * 
+ * cdef class ServerCredentials:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_server_credentials *c_credentials
+ */
+struct __pyx_obj_7_cython_6cygrpc_ServerCredentials {
+  PyObject_HEAD
+  grpc_server_credentials *c_credentials;
+  grpc_ssl_pem_key_cert_pair *c_ssl_pem_key_cert_pairs;
+  size_t c_ssl_pem_key_cert_pairs_count;
+  PyObject *references;
+  PyObject *initial_cert_config;
+  PyObject *cert_config_fetcher;
+  int initial_cert_config_fetched;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":109
+ * 
+ * 
+ * cdef class LocalChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_local_connect_type _local_connect_type
+ */
+struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+  grpc_local_connect_type _local_connect_type;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":114
+ * 
+ * 
+ * cdef class ALTSChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ *   cdef grpc_alts_credentials_options *c_options
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+  grpc_alts_credentials_options *c_options;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pxd.pxi":22
+ * cdef _interpret_event(grpc_event c_event)
+ * 
+ * cdef class _LatentEventArg:             # <<<<<<<<<<<<<<
+ *   cdef grpc_completion_queue *c_completion_queue
+ *   cdef object deadline
+ */
+struct __pyx_obj_7_cython_6cygrpc__LatentEventArg {
+  PyObject_HEAD
+  grpc_completion_queue *c_completion_queue;
+  PyObject *deadline;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pxd.pxi":26
+ *   cdef object deadline
+ * 
+ * cdef class CompletionQueue:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_completion_queue *c_completion_queue
+ */
+struct __pyx_obj_7_cython_6cygrpc_CompletionQueue {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_CompletionQueue *__pyx_vtab;
+  grpc_completion_queue *c_completion_queue;
+  int is_shutting_down;
+  int is_shutdown;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":15
+ * # limitations under the License.
+ * 
+ * cdef class BaseEvent:             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc_BaseEvent {
+  PyObject_HEAD
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":18
+ *   pass
+ * 
+ * cdef class ConnectivityEvent(BaseEvent):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly grpc_completion_type completion_type
+ */
+struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent {
+  struct __pyx_obj_7_cython_6cygrpc_BaseEvent __pyx_base;
+  grpc_completion_type completion_type;
+  int success;
+  PyObject *tag;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":25
+ * 
+ * 
+ * cdef class RequestCallEvent(BaseEvent):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly grpc_completion_type completion_type
+ */
+struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent {
+  struct __pyx_obj_7_cython_6cygrpc_BaseEvent __pyx_base;
+  grpc_completion_type completion_type;
+  int success;
+  PyObject *tag;
+  struct __pyx_obj_7_cython_6cygrpc_Call *call;
+  struct __pyx_obj_7_cython_6cygrpc_CallDetails *call_details;
+  PyObject *invocation_metadata;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":35
+ * 
+ * 
+ * cdef class BatchOperationEvent(BaseEvent):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly grpc_completion_type completion_type
+ */
+struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent {
+  struct __pyx_obj_7_cython_6cygrpc_BaseEvent __pyx_base;
+  grpc_completion_type completion_type;
+  int success;
+  PyObject *tag;
+  PyObject *batch_operations;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":43
+ * 
+ * 
+ * cdef class ServerShutdownEvent(BaseEvent):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly grpc_completion_type completion_type
+ */
+struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent {
+  struct __pyx_obj_7_cython_6cygrpc_BaseEvent __pyx_base;
+  grpc_completion_type completion_type;
+  int success;
+  PyObject *tag;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":16
+ * 
+ * 
+ * cdef class Operation:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *
+ */
+struct __pyx_obj_7_cython_6cygrpc_Operation {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation *__pyx_vtab;
+  grpc_op c_op;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":25
+ * 
+ * 
+ * cdef class SendInitialMetadataOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly object _initial_metadata;
+ */
+struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation {
+  struct __pyx_obj_7_cython_6cygrpc_Operation __pyx_base;
+  PyObject *_initial_metadata;
+  int _flags;
+  grpc_metadata *_c_initial_metadata;
+  size_t _c_initial_metadata_count;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":36
+ * 
+ * 
+ * cdef class SendMessageOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly bytes _message
+ */
+struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation {
+  struct __pyx_obj_7_cython_6cygrpc_Operation __pyx_base;
+  PyObject *_message;
+  int _flags;
+  grpc_byte_buffer *_c_message_byte_buffer;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":46
+ * 
+ * 
+ * cdef class SendCloseFromClientOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly int _flags
+ */
+struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation {
+  struct __pyx_obj_7_cython_6cygrpc_Operation __pyx_base;
+  int _flags;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":54
+ * 
+ * 
+ * cdef class SendStatusFromServerOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly object _trailing_metadata
+ */
+struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation {
+  struct __pyx_obj_7_cython_6cygrpc_Operation __pyx_base;
+  PyObject *_trailing_metadata;
+  PyObject *_code;
+  PyObject *_details;
+  int _flags;
+  grpc_metadata *_c_trailing_metadata;
+  size_t _c_trailing_metadata_count;
+  grpc_slice _c_details;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":68
+ * 
+ * 
+ * cdef class ReceiveInitialMetadataOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly int _flags
+ */
+struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation {
+  struct __pyx_obj_7_cython_6cygrpc_Operation __pyx_base;
+  int _flags;
+  PyObject *_initial_metadata;
+  grpc_metadata_array _c_initial_metadata;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":78
+ * 
+ * 
+ * cdef class ReceiveMessageOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly int _flags
+ */
+struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation {
+  struct __pyx_obj_7_cython_6cygrpc_Operation __pyx_base;
+  int _flags;
+  grpc_byte_buffer *_c_message_byte_buffer;
+  PyObject *_message;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":88
+ * 
+ * 
+ * cdef class ReceiveStatusOnClientOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly int _flags
+ */
+struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation {
+  struct __pyx_obj_7_cython_6cygrpc_Operation __pyx_base;
+  int _flags;
+  grpc_metadata_array _c_trailing_metadata;
+  grpc_status_code _c_code;
+  grpc_slice _c_details;
+  char const *_c_error_string;
+  PyObject *_trailing_metadata;
+  PyObject *_code;
+  PyObject *_details;
+  PyObject *_error_string;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":104
+ * 
+ * 
+ * cdef class ReceiveCloseOnServerOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly int _flags
+ */
+struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation {
+  struct __pyx_obj_7_cython_6cygrpc_Operation __pyx_base;
+  int _flags;
+  PyObject *_cancelled;
+  int _c_cancelled;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pxd.pxi":21
+ * 
+ * 
+ * cdef class CallDetails:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call_details c_details
+ */
+struct __pyx_obj_7_cython_6cygrpc_CallDetails {
+  PyObject_HEAD
+  grpc_call_details c_details;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pxd.pxi":26
+ * 
+ * 
+ * cdef class SslPemKeyCertPair:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_ssl_pem_key_cert_pair c_pair
+ */
+struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair {
+  PyObject_HEAD
+  grpc_ssl_pem_key_cert_pair c_pair;
+  PyObject *private_key;
+  PyObject *certificate_chain;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pxd.pxi":32
+ * 
+ * 
+ * cdef class CompressionOptions:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_compression_options c_options
+ */
+struct __pyx_obj_7_cython_6cygrpc_CompressionOptions {
+  PyObject_HEAD
+  grpc_compression_options c_options;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pxd.pxi":15
+ * # limitations under the License.
+ * 
+ * cdef class Server:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_server *c_server
+ */
+struct __pyx_obj_7_cython_6cygrpc_Server {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Server *__pyx_vtab;
+  grpc_server *c_server;
+  int is_started;
+  int is_shutting_down;
+  int is_shutdown;
+  struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *backup_shutdown_queue;
+  PyObject *references;
+  PyObject *registered_completion_queues;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":16
+ * 
+ * 
+ * cdef class _Tag:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef BaseEvent event(self, grpc_event c_event)
+ */
+struct __pyx_obj_7_cython_6cygrpc__Tag {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc__Tag *__pyx_vtab;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":21
+ * 
+ * 
+ * cdef class _ConnectivityTag(_Tag):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly object _user_tag
+ */
+struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag {
+  struct __pyx_obj_7_cython_6cygrpc__Tag __pyx_base;
+  PyObject *_user_tag;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":28
+ * 
+ * 
+ * cdef class _RequestCallTag(_Tag):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly object _user_tag
+ */
+struct __pyx_obj_7_cython_6cygrpc__RequestCallTag {
+  struct __pyx_obj_7_cython_6cygrpc__Tag __pyx_base;
+  PyObject *_user_tag;
+  struct __pyx_obj_7_cython_6cygrpc_Call *call;
+  struct __pyx_obj_7_cython_6cygrpc_CallDetails *call_details;
+  grpc_metadata_array c_invocation_metadata;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":39
+ * 
+ * 
+ * cdef class _BatchOperationTag(_Tag):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef object _user_tag
+ */
+struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag {
+  struct __pyx_obj_7_cython_6cygrpc__Tag __pyx_base;
+  PyObject *_user_tag;
+  PyObject *_operations;
+  PyObject *_retained_call;
+  grpc_op *c_ops;
+  size_t c_nops;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":51
+ * 
+ * 
+ * cdef class _ServerShutdownTag(_Tag):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef readonly object _user_tag
+ */
+struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag {
+  struct __pyx_obj_7_cython_6cygrpc__Tag __pyx_base;
+  PyObject *_user_tag;
+  struct __pyx_obj_7_cython_6cygrpc_Server *_shutting_down_server;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi":29
+ * 
+ * 
+ * cdef class BaseCompletionQueue:             # <<<<<<<<<<<<<<
+ *     cdef grpc_completion_queue *_cq
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_BaseCompletionQueue *__pyx_vtab;
+  grpc_completion_queue *_cq;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi":35
+ * 
+ * 
+ * cdef class _BoundEventLoop:             # <<<<<<<<<<<<<<
+ *     cdef readonly object loop
+ *     cdef readonly object read_socket  # socket.socket
+ */
+struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop {
+  PyObject_HEAD
+  PyObject *loop;
+  PyObject *read_socket;
+  int _has_reader;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi":41
+ * 
+ * 
+ * cdef class PollerCompletionQueue(BaseCompletionQueue):             # <<<<<<<<<<<<<<
+ *     cdef bint _shutdown
+ *     cdef cpp_event_queue _queue
+ */
+struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue {
+  struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue __pyx_base;
+  int _shutdown;
+  __pyx_t_7_cython_6cygrpc_cpp_event_queue _queue;
+  std::mutex _queue_mutex;
+  PyObject *_poller_thread;
+  int _write_fd;
+  PyObject *_read_socket;
+  PyObject *_write_socket;
+  PyObject *_loops;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pxd.pxi":17
+ * 
+ * 
+ * cdef class AioRpcStatus(Exception):             # <<<<<<<<<<<<<<
+ *     cdef readonly:
+ *         grpc_status_code _code
+ */
+struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus {
+  PyBaseExceptionObject __pyx_base;
+  struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *__pyx_vtab;
+  grpc_status_code _code;
+  PyObject *_details;
+  PyObject *_trailing_metadata;
+  PyObject *_debug_error_string;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pxd.pxi":16
+ * # distutils: language=c++
+ * 
+ * cdef class _AioState:             # <<<<<<<<<<<<<<
+ *     cdef object lock  # threading.RLock
+ *     cdef int refcount
+ */
+struct __pyx_obj_7_cython_6cygrpc__AioState {
+  PyObject_HEAD
+  PyObject *lock;
+  int refcount;
+  PyObject *engine;
+  struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *cq;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi":16
+ * 
+ * 
+ * cdef class CallbackFailureHandler:             # <<<<<<<<<<<<<<
+ *     cdef str _core_function_name
+ *     cdef object _error_details
+ */
+struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackFailureHandler *__pyx_vtab;
+  PyObject *_core_function_name;
+  PyObject *_error_details;
+  PyObject *_exception_type;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi":43
+ * 
+ * 
+ * cdef class CallbackWrapper:             # <<<<<<<<<<<<<<
+ *     cdef CallbackContext context
+ *     cdef object _reference_of_future
+ */
+struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper *__pyx_vtab;
+  struct __pyx_t_7_cython_6cygrpc_CallbackContext context;
+  PyObject *_reference_of_future;
+  PyObject *_reference_of_failure_handler;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi":56
+ * 
+ * 
+ * cdef class GrpcCallWrapper:             # <<<<<<<<<<<<<<
+ *     cdef grpc_call* call
+ */
+struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper {
+  PyObject_HEAD
+  grpc_call *call;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pxd.pxi":16
+ * 
+ * 
+ * cdef class _AioCall(GrpcCallWrapper):             # <<<<<<<<<<<<<<
+ *     cdef:
+ *         readonly AioChannel _channel
+ */
+struct __pyx_obj_7_cython_6cygrpc__AioCall {
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper __pyx_base;
+  struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *__pyx_vtab;
+  struct __pyx_obj_7_cython_6cygrpc_AioChannel *_channel;
+  PyObject *_references;
+  PyObject *_deadline;
+  PyObject *_done_callbacks;
+  PyObject *_loop;
+  int _is_locally_cancelled;
+  struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *_status;
+  PyObject *_initial_metadata;
+  PyObject *_waiters_status;
+  PyObject *_waiters_initial_metadata;
+  int _send_initial_metadata_flags;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi":21
+ *     AIO_CHANNEL_STATUS_DESTROYED
+ * 
+ * cdef class AioChannel:             # <<<<<<<<<<<<<<
+ *     cdef:
+ *         grpc_channel * channel
+ */
+struct __pyx_obj_7_cython_6cygrpc_AioChannel {
+  PyObject_HEAD
+  grpc_channel *channel;
+  PyObject *loop;
+  PyObject *_target;
+  enum __pyx_t_7_cython_6cygrpc_AioChannelStatus _status;
+  int _is_secure;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":15
+ * # limitations under the License.
+ * 
+ * cdef class _HandlerCallDetails:             # <<<<<<<<<<<<<<
+ *     cdef readonly str method
+ *     cdef readonly tuple invocation_metadata
+ */
+struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails {
+  PyObject_HEAD
+  PyObject *method;
+  PyObject *invocation_metadata;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":20
+ * 
+ * 
+ * cdef class RPCState(GrpcCallWrapper):             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_details details
+ *     cdef grpc_metadata_array request_metadata
+ */
+struct __pyx_obj_7_cython_6cygrpc_RPCState {
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper __pyx_base;
+  struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *__pyx_vtab;
+  grpc_call_details details;
+  grpc_metadata_array request_metadata;
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *server;
+  int client_closed;
+  PyObject *abort_exception;
+  int metadata_sent;
+  int status_sent;
+  grpc_status_code status_code;
+  PyObject *py_status_code;
+  PyObject *status_details;
+  PyObject *trailing_metadata;
+  PyObject *compression_algorithm;
+  int disable_next_compression;
+  PyObject *callbacks;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":46
+ * 
+ * 
+ * cdef class _ServicerContext:             # <<<<<<<<<<<<<<
+ *     cdef RPCState _rpc_state
+ *     cdef object _loop  # asyncio.AbstractEventLoop
+ */
+struct __pyx_obj_7_cython_6cygrpc__ServicerContext {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *_rpc_state;
+  PyObject *_loop;
+  PyObject *_request_deserializer;
+  PyObject *_response_serializer;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":53
+ * 
+ * 
+ * cdef class _SyncServicerContext:             # <<<<<<<<<<<<<<
+ *     cdef _ServicerContext _context
+ *     cdef list _callbacks
+ */
+struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *_context;
+  PyObject *_callbacks;
+  PyObject *_loop;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":59
+ * 
+ * 
+ * cdef class _MessageReceiver:             # <<<<<<<<<<<<<<
+ *     cdef _ServicerContext _servicer_context
+ *     cdef object _agen
+ */
+struct __pyx_obj_7_cython_6cygrpc__MessageReceiver {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *_servicer_context;
+  PyObject *_agen;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":72
+ * 
+ * 
+ * cdef class _ConcurrentRpcLimiter:             # <<<<<<<<<<<<<<
+ *     cdef int _maximum_concurrent_rpcs
+ *     cdef int _active_rpcs
+ */
+struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter {
+  PyObject_HEAD
+  int _maximum_concurrent_rpcs;
+  int _active_rpcs;
+  int limiter_concurrency_exceeded;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":78
+ * 
+ * 
+ * cdef class AioServer:             # <<<<<<<<<<<<<<
+ *     cdef Server _server
+ *     cdef list _generic_handlers
+ */
+struct __pyx_obj_7_cython_6cygrpc_AioServer {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_7_cython_6cygrpc_AioServer *__pyx_vtab;
+  struct __pyx_obj_7_cython_6cygrpc_Server *_server;
+  PyObject *_generic_handlers;
+  enum __pyx_t_7_cython_6cygrpc_AioServerStatus _status;
+  PyObject *_loop;
+  PyObject *_serving_task;
+  PyObject *_shutdown_lock;
+  PyObject *_shutdown_completed;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *_shutdown_callback_wrapper;
+  PyObject *_crash_exception;
+  PyObject *_interceptors;
+  PyObject *_thread_pool;
+  struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *_limiter;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":16
+ * 
+ * 
+ * cdef class _GrpcArgWrapper:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_arg arg
+ */
+struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper {
+  PyObject_HEAD
+  grpc_arg arg;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":373
+ *   return LocalChannelCredentials(local_connect_type)
+ * 
+ * cdef class InsecureChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":429
+ * 
+ * 
+ * cdef class ComputeEngineChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ *   cdef grpc_channel_credentials* _c_creds
+ *   cdef grpc_call_credentials* _call_creds
+ */
+struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials {
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+  grpc_channel_credentials *_c_creds;
+  grpc_call_credentials *_call_creds;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":31
+ *   pass
+ * 
+ * cdef class CensusContext:             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc_CensusContext {
+  PyObject_HEAD
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":336
+ * 
+ * 
+ * cdef IntegratedCall _integrated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, int flags, method, host, object deadline,
+ *     object metadata, CallCredentials credentials, operationses_and_user_tags,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state;
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":384
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ *   def next_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       _process_segregated_call_tag(
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":399
+ * 
+ * 
+ * cdef SegregatedCall _segregated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, int flags, method, host, object deadline,
+ *     object metadata, CallCredentials credentials, operationses_and_user_tags,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state;
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":536
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def next_call_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       if tag is not None:
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":37
+ * 
+ * 
+ * cdef int _get_metadata(void *state,             # <<<<<<<<<<<<<<
+ *                        grpc_auth_metadata_context context,
+ *                        grpc_credentials_plugin_metadata_cb cb,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata {
+  PyObject_HEAD
+  grpc_metadata *__pyx_v_c_metadata;
+  grpc_credentials_plugin_metadata_cb __pyx_v_cb;
+  size_t __pyx_v_metadata_count;
+  void *__pyx_v_user_data;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":68
+ * 
+ * 
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):             # <<<<<<<<<<<<<<
+ *   return tuple(
+ *       _metadatum(
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata {
+  PyObject_HEAD
+  grpc_metadata_array *__pyx_v_c_metadata_array;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":70
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):
+ *   return tuple(
+ *       _metadatum(             # <<<<<<<<<<<<<<
+ *           c_metadata_array.metadata[index].key,
+ *           c_metadata_array.metadata[index].value)
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata *__pyx_outer_scope;
+  size_t __pyx_genexpr_arg_0;
+  size_t __pyx_v_index;
+  size_t __pyx_t_0;
+  size_t __pyx_t_1;
+  size_t __pyx_t_2;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":50
+ * if _contextvars_supported():
+ *     import contextvars
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context {
+  PyObject_HEAD
+  PyObject *__pyx_v_ctx;
+  PyObject *__pyx_v_target;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":56
+ *         return _run
+ * else:
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         def _run(*args):
+ *             target(*args)
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context {
+  PyObject_HEAD
+  PyObject *__pyx_v_target;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":103
+ * 
+ * class ForkManagedThread(object):
+ *     def __init__(self, target, args=()):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ {
+  PyObject_HEAD
+  PyObject *__pyx_v_target;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":123
+ * 
+ * 
+ * def async_generator_to_generator(object agen, object loop):             # <<<<<<<<<<<<<<
+ *     """Converts an async generator into generator."""
+ *     try:
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator {
+  PyObject_HEAD
+  PyObject *__pyx_v_agen;
+  PyObject *__pyx_v_future;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_response;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":141
+ * 
+ * 
+ * async def generator_to_async_generator(object gen, object loop, object thread_pool):             # <<<<<<<<<<<<<<
+ *     """Converts a generator into async generator.
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator {
+  PyObject_HEAD
+  PyObject *__pyx_v_future;
+  PyObject *__pyx_v_gen;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_queue;
+  PyObject *__pyx_v_response;
+  PyObject *__pyx_v_thread_pool;
+  PyObject *__pyx_v_yield_to_queue;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":77
+ * 
+ * 
+ * async def execute_batch(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                tuple operations,
+ *                                object loop):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_batch_operation_tag;
+  grpc_event __pyx_v_c_event;
+  grpc_call_error __pyx_v_error;
+  PyObject *__pyx_v_future;
+  PyObject *__pyx_v_grpc_call_error_string;
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_operations;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_wrapper;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":115
+ * 
+ * 
+ * async def _receive_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                            object loop):
+ *     """Retrives parsed messages from Core.
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message {
+  PyObject_HEAD
+  PyObject *__pyx_v_e;
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_ops;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_receive_op;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":139
+ * 
+ * 
+ * async def _send_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                         bytes message,
+ *                         Operation send_initial_metadata_op,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_message;
+  struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_op;
+  PyObject *__pyx_v_ops;
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_initial_metadata_op;
+  int __pyx_v_write_flag;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":151
+ * 
+ * 
+ * async def _send_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                  tuple metadata,
+ *                                  int flags,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata {
+  PyObject_HEAD
+  int __pyx_v_flags;
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_metadata;
+  struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_op;
+  PyObject *__pyx_v_ops;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":162
+ * 
+ * 
+ * async def _receive_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                     object loop):
+ *     cdef ReceiveInitialMetadataOperation op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper;
+  PyObject *__pyx_v_loop;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_op;
+  PyObject *__pyx_v_ops;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":169
+ *     return op.initial_metadata()
+ * 
+ * async def _send_error_status_from_server(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                          grpc_status_code code,
+ *                                          str details,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server {
+  PyObject_HEAD
+  grpc_status_code __pyx_v_code;
+  PyObject *__pyx_v_details;
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper;
+  PyObject *__pyx_v_loop;
+  struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_op;
+  PyObject *__pyx_v_ops;
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_initial_metadata_op;
+  PyObject *__pyx_v_trailing_metadata;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":235
+ *         return self._status.code() == StatusCode.cancelled
+ * 
+ *     async def status(self):             # <<<<<<<<<<<<<<
+ *         """Returns the status of the RPC call.
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status {
+  PyObject_HEAD
+  PyObject *__pyx_v_future;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":258
+ *         return self.done() and self._status.code() == StatusCode.ok
+ * 
+ *     async def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *         """Returns the initial metadata of the RPC call.
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata {
+  PyObject_HEAD
+  PyObject *__pyx_v_future;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":296
+ *         ))
+ * 
+ *     async def unary_unary(self,             # <<<<<<<<<<<<<<
+ *                           bytes request,
+ *                           tuple outbound_initial_metadata,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary {
+  PyObject_HEAD
+  grpc_status_code __pyx_v_code;
+  PyObject *__pyx_v_context;
+  struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_initial_metadata_op;
+  PyObject *__pyx_v_ops;
+  PyObject *__pyx_v_outbound_initial_metadata;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_receive_initial_metadata_op;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_receive_message_op;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_receive_status_on_client_op;
+  PyObject *__pyx_v_request;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+  struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_send_close_op;
+  struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_send_message_op;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":347
+ *             return None
+ * 
+ *     async def _handle_status_once_received(self):             # <<<<<<<<<<<<<<
+ *         """Handles the status sent by peer once received."""
+ *         cdef ReceiveStatusOnClientOperation op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_op;
+  PyObject *__pyx_v_ops;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":364
+ *         ))
+ * 
+ *     async def receive_serialized_message(self):             # <<<<<<<<<<<<<<
+ *         """Receives one single raw message in bytes."""
+ *         cdef bytes received_message
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message {
+  PyObject_HEAD
+  PyObject *__pyx_v_received_message;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":381
+ *             return EOF
+ * 
+ *     async def send_serialized_message(self, bytes message):             # <<<<<<<<<<<<<<
+ *         """Sends one single raw message in bytes."""
+ *         await _send_message(self,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message {
+  PyObject_HEAD
+  PyObject *__pyx_v_message;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":389
+ *                             self._loop)
+ * 
+ *     async def send_receive_close(self):             # <<<<<<<<<<<<<<
+ *         """Half close the RPC on the client-side."""
+ *         cdef SendCloseFromClientOperation op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_op;
+  PyObject *__pyx_v_ops;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":395
+ *         await execute_batch(self, ops, self._loop)
+ * 
+ *     async def initiate_unary_stream(self,             # <<<<<<<<<<<<<<
+ *                            bytes request,
+ *                            tuple outbound_initial_metadata,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream {
+  PyObject_HEAD
+  PyObject *__pyx_v_batch_error;
+  PyObject *__pyx_v_context;
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_initial_metadata_op;
+  PyObject *__pyx_v_outbound_initial_metadata;
+  PyObject *__pyx_v_outbound_ops;
+  PyObject *__pyx_v_request;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_close_op;
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_message_op;
+  PyObject *__pyx_v_status_task;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+  PyObject *__pyx_t_3;
+  PyObject *__pyx_t_4;
+  PyObject *__pyx_t_5;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":437
+ *             await status_task
+ * 
+ *     async def stream_unary(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary {
+  PyObject_HEAD
+  grpc_status_code __pyx_v_code;
+  PyObject *__pyx_v_context;
+  PyObject *__pyx_v_inbound_ops;
+  PyObject *__pyx_v_metadata_sent_observer;
+  PyObject *__pyx_v_outbound_initial_metadata;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_receive_message_op;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_receive_status_on_client_op;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+  PyObject *__pyx_t_3;
+  PyObject *__pyx_t_4;
+  PyObject *__pyx_t_5;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":496
+ *             return None
+ * 
+ *     async def initiate_stream_stream(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream {
+  PyObject_HEAD
+  PyObject *__pyx_v_batch_error;
+  PyObject *__pyx_v_context;
+  PyObject *__pyx_v_metadata_sent_observer;
+  PyObject *__pyx_v_outbound_initial_metadata;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self;
+  PyObject *__pyx_v_status_task;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+  PyObject *__pyx_t_3;
+  PyObject *__pyx_t_4;
+  PyObject *__pyx_t_5;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":71
+ *             )
+ * 
+ *     async def watch_connectivity_state(self,             # <<<<<<<<<<<<<<
+ *                                        grpc_connectivity_state last_observed_state,
+ *                                        object deadline):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state {
+  PyObject_HEAD
+  gpr_timespec __pyx_v_c_deadline;
+  PyObject *__pyx_v_deadline;
+  PyObject *__pyx_v_future;
+  grpc_connectivity_state __pyx_v_last_observed_state;
+  struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_wrapper;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":127
+ *         self._loop = loop
+ * 
+ *     async def read(self):             # <<<<<<<<<<<<<<
+ *         cdef bytes raw_message
+ *         self._rpc_state.raise_for_termination()
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read {
+  PyObject_HEAD
+  PyObject *__pyx_v_raw_message;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":140
+ *                             raw_message)
+ * 
+ *     async def write(self, object message):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write {
+  PyObject_HEAD
+  PyObject *__pyx_v_message;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":150
+ *         self._rpc_state.metadata_sent = True
+ * 
+ *     async def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata {
+  PyObject_HEAD
+  PyObject *__pyx_v_metadata;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":164
+ *             self._rpc_state.metadata_sent = True
+ * 
+ *     async def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort {
+  PyObject_HEAD
+  grpc_status_code __pyx_v_actual_code;
+  PyObject *__pyx_v_code;
+  PyObject *__pyx_v_details;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self;
+  PyObject *__pyx_v_trailing_metadata;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":203
+ *             raise self._rpc_state.abort_exception
+ * 
+ *     async def abort_with_status(self, object status):             # <<<<<<<<<<<<<<
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self;
+  PyObject *__pyx_v_status;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":354
+ * 
+ * 
+ * async def _run_interceptor(object interceptors, object query_handler,             # <<<<<<<<<<<<<<
+ *                            object handler_call_details):
+ *     interceptor = next(interceptors, None)
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor {
+  PyObject_HEAD
+  PyObject *__pyx_v_continuation;
+  PyObject *__pyx_v_handler_call_details;
+  PyObject *__pyx_v_interceptor;
+  PyObject *__pyx_v_interceptors;
+  PyObject *__pyx_v_query_handler;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":370
+ * 
+ * 
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,             # <<<<<<<<<<<<<<
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler {
+  PyObject_HEAD
+  PyObject *__pyx_v_generic_handlers;
+  struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_handler_call_details;
+  PyObject *__pyx_v_interceptors;
+  PyObject *__pyx_v_metadata;
+  PyObject *__pyx_v_method;
+  PyObject *__pyx_v_query_handlers;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":389
+ * 
+ * 
+ * async def _finish_handler_with_unary_response(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                               object unary_handler,
+ *                                               object request,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response {
+  PyObject_HEAD
+  PyObject *__pyx_v_callback;
+  PyObject *__pyx_v_finish_ops;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_request;
+  PyObject *__pyx_v_response_message;
+  PyObject *__pyx_v_response_raw;
+  PyObject *__pyx_v_response_serializer;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context;
+  struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_sync_servicer_context;
+  PyObject *__pyx_v_unary_handler;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":460
+ * 
+ * 
+ * async def _finish_handler_with_stream_responses(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                                 object stream_handler,
+ *                                                 object request,
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses {
+  PyObject_HEAD
+  PyObject *__pyx_v_async_response_generator;
+  PyObject *__pyx_v_finish_ops;
+  PyObject *__pyx_v_gen;
+  PyObject *__pyx_v_loop;
+  struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_op;
+  PyObject *__pyx_v_request;
+  PyObject *__pyx_v_response_message;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context;
+  PyObject *__pyx_v_stream_handler;
+  struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_sync_servicer_context;
+  PyObject *__pyx_t_0;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":530
+ * 
+ * 
+ * async def _handle_unary_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                   RPCState rpc_state,
+ *                                   object loop):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc {
+  PyObject_HEAD
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_method_handler;
+  PyObject *__pyx_v_request_message;
+  PyObject *__pyx_v_request_raw;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":564
+ * 
+ * 
+ * async def _handle_unary_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc {
+  PyObject_HEAD
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_method_handler;
+  PyObject *__pyx_v_request_message;
+  PyObject *__pyx_v_request_raw;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":603
+ *         self._agen = None
+ * 
+ *     async def _async_message_receiver(self):             # <<<<<<<<<<<<<<
+ *         """An async generator that receives messages."""
+ *         cdef object message
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver {
+  PyObject_HEAD
+  PyObject *__pyx_v_message;
+  struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":619
+ *         return self._agen
+ * 
+ *     async def __anext__(self):             # <<<<<<<<<<<<<<
+ *         return await self.__aiter__().__anext__()
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":623
+ * 
+ * 
+ * async def _handle_stream_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc {
+  PyObject_HEAD
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_method_handler;
+  PyObject *__pyx_v_request_iterator;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":655
+ * 
+ * 
+ * async def _handle_stream_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                     RPCState rpc_state,
+ *                                     object loop):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc {
+  PyObject_HEAD
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_method_handler;
+  PyObject *__pyx_v_request_iterator;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":686
+ * 
+ * 
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         try:
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions {
+  PyObject_HEAD
+  PyObject *__pyx_v_e;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_rpc_coro;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  PyObject *__pyx_v_status_code;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+  PyObject *__pyx_t_3;
+  PyObject *__pyx_t_4;
+  PyObject *__pyx_t_5;
+  PyObject *__pyx_t_6;
+  PyObject *__pyx_t_7;
+  PyObject *__pyx_t_8;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":742
+ * 
+ * 
+ * cdef _add_callback_handler(object rpc_task, RPCState rpc_state):             # <<<<<<<<<<<<<<
+ * 
+ *     def handle_callbacks(object unused_task):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":755
+ * 
+ * 
+ * async def _handle_cancellation_from_core(object rpc_task,             # <<<<<<<<<<<<<<
+ *                                          RPCState rpc_state,
+ *                                          object loop):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core {
+  PyObject_HEAD
+  PyObject *__pyx_v_loop;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_op;
+  PyObject *__pyx_v_ops;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  PyObject *__pyx_v_rpc_task;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":772
+ * 
+ * 
+ * async def _schedule_rpc_coro(object rpc_coro,             # <<<<<<<<<<<<<<
+ *                              RPCState rpc_state,
+ *                              object loop):
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro {
+  PyObject_HEAD
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_rpc_coro;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  PyObject *__pyx_v_rpc_task;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":785
+ * 
+ * 
+ * async def _handle_rpc(list generic_handlers, tuple interceptors,             # <<<<<<<<<<<<<<
+ *                       RPCState rpc_state, object loop, bint concurrency_exceeded):
+ *     cdef object method_handler
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc {
+  PyObject_HEAD
+  int __pyx_v_concurrency_exceeded;
+  PyObject *__pyx_v_generic_handlers;
+  PyObject *__pyx_v_interceptors;
+  PyObject *__pyx_v_loop;
+  PyObject *__pyx_v_method_handler;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":932
+ *                                            server_credentials._credentials)
+ * 
+ *     async def _request_call(self):             # <<<<<<<<<<<<<<
+ *         cdef grpc_call_error error
+ *         cdef RPCState rpc_state = RPCState(self)
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call {
+  PyObject_HEAD
+  grpc_call_error __pyx_v_error;
+  PyObject *__pyx_v_future;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_wrapper;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":952
+ *         return rpc_state
+ * 
+ *     async def _server_main_loop(self,             # <<<<<<<<<<<<<<
+ *                                 object server_started):
+ *         self._server.start(backup_queue=False)
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop {
+  PyObject_HEAD
+  int __pyx_v_concurrency_exceeded;
+  PyObject *__pyx_v_rpc_coro;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state;
+  PyObject *__pyx_v_rpc_task;
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self;
+  PyObject *__pyx_v_server_started;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1005
+ *             self._loop.create_task(self.shutdown(None))
+ * 
+ *     async def start(self):             # <<<<<<<<<<<<<<
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:
+ *             return
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self;
+  PyObject *__pyx_v_server_started;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1019
+ *         await server_started
+ * 
+ *     async def _start_shutting_down(self):             # <<<<<<<<<<<<<<
+ *         """Prepares the server to shutting down.
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1036
+ *             pass
+ * 
+ *     async def shutdown(self, grace):             # <<<<<<<<<<<<<<
+ *         """Gracefully shutdown the Core server.
+ * 
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown {
+  PyObject_HEAD
+  PyObject *__pyx_v_grace;
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+  PyObject *__pyx_t_3;
+  PyObject *__pyx_t_4;
+  PyObject *__pyx_t_5;
+  PyObject *__pyx_t_6;
+  PyObject *__pyx_t_7;
+};
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1076
+ *                 self._status = AIO_SERVER_STATUS_STOPPED
+ * 
+ *     async def wait_for_termination(self, object timeout):             # <<<<<<<<<<<<<<
+ *         if timeout is None:
+ *             await self._shutdown_completed
+ */
+struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination {
+  PyObject_HEAD
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self;
+  PyObject *__pyx_v_timeout;
+  PyObject *__pyx_t_0;
+  PyObject *__pyx_t_1;
+  PyObject *__pyx_t_2;
+};
+
+
+/* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(object (*f)(_LatentEventArg) ):             # <<<<<<<<<<<<<<
+ *     def wrap(_LatentEventArg latent_event_arg):
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ */
+struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg {
+  PyObject_HEAD
+  PyObject *(*__pyx_v_f)(struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *);
+};
+
+struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ {
+  PyObject_HEAD
+  PyObject *(*__pyx_v_f)(void);
+};
+
+struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args {
+  PyObject_HEAD
+  PyObject *(*__pyx_v_f)(PyObject *, PyObject *);
+};
+
+struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ {
+  PyObject_HEAD
+  void (*__pyx_v_f)(void);
+};
+
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":32
+ * 
+ * 
+ * cdef class _ChannelArg:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self, argument, references) except *:
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArg {
+  void (*c)(struct __pyx_obj_7_cython_6cygrpc__ChannelArg *, PyObject *, PyObject *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArg *__pyx_vtabptr_7_cython_6cygrpc__ChannelArg;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":64
+ * 
+ * 
+ * cdef class _ChannelArgs:             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, arguments):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs {
+  grpc_channel_args *(*c_args)(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs *__pyx_vtabptr_7_cython_6cygrpc__ChannelArgs;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":70
+ * 
+ * 
+ * cdef class _CallState:             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__CallState {
+  void (*maybe_set_client_call_tracer_on_call)(struct __pyx_obj_7_cython_6cygrpc__CallState *, PyObject *, PyObject *);
+  void (*maybe_delete_call_tracer)(struct __pyx_obj_7_cython_6cygrpc__CallState *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__CallState *__pyx_vtabptr_7_cython_6cygrpc__CallState;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":31
+ * 
+ * 
+ * cdef class CallCredentials:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials {
+  grpc_call_credentials *(*c)(struct __pyx_obj_7_cython_6cygrpc_CallCredentials *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials *__pyx_vtabptr_7_cython_6cygrpc_CallCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":73
+ * 
+ * 
+ * cdef class MetadataPluginCallCredentials(CallCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, metadata_plugin, name):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_MetadataPluginCallCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_vtabptr_7_cython_6cygrpc_MetadataPluginCallCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":109
+ * 
+ * 
+ * cdef class CompositeCallCredentials(CallCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, call_credentialses):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_CompositeCallCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CompositeCallCredentials *__pyx_vtabptr_7_cython_6cygrpc_CompositeCallCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":118
+ * 
+ * 
+ * cdef class ChannelCredentials:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials {
+  grpc_channel_credentials *(*c)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials *__pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":139
+ * 
+ * 
+ * cdef class SSLChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, pem_root_certificates, private_key, certificate_chain):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_SSLChannelCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SSLChannelCredentials *__pyx_vtabptr_7_cython_6cygrpc_SSLChannelCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":173
+ * 
+ * 
+ * cdef class CompositeChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, call_credentialses, channel_credentials):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_CompositeChannelCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_vtabptr_7_cython_6cygrpc_CompositeChannelCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":192
+ * 
+ * 
+ * cdef class XDSChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *     def __cinit__(self, fallback_credentials):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_XDSChannelCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_XDSChannelCredentials *__pyx_vtabptr_7_cython_6cygrpc_XDSChannelCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":360
+ *   local_tcp = LOCAL_TCP
+ * 
+ * cdef class LocalChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, grpc_local_connect_type local_connect_type):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_LocalChannelCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_LocalChannelCredentials *__pyx_vtabptr_7_cython_6cygrpc_LocalChannelCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":399
+ *   return credentials
+ * 
+ * cdef class ALTSChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, list service_accounts):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_ALTSChannelCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_vtabptr_7_cython_6cygrpc_ALTSChannelCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":80
+ *       return _internal_latent_event(latent_event_arg)
+ * 
+ * cdef class CompletionQueue:             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, shutdown_cq=False):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_CompletionQueue {
+  PyObject *(*_interpret_event)(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *, grpc_event);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CompletionQueue *__pyx_vtabptr_7_cython_6cygrpc_CompletionQueue;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":16
+ * 
+ * 
+ * cdef class Operation:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_Operation {
+  void (*c)(struct __pyx_obj_7_cython_6cygrpc_Operation *);
+  void (*un_c)(struct __pyx_obj_7_cython_6cygrpc_Operation *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_Operation *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":25
+ * 
+ * 
+ * cdef class SendInitialMetadataOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, initial_metadata, flags):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_SendInitialMetadataOperation {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_vtabptr_7_cython_6cygrpc_SendInitialMetadataOperation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":49
+ * 
+ * 
+ * cdef class SendMessageOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, bytes message, int flags):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_SendMessageOperation {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SendMessageOperation *__pyx_vtabptr_7_cython_6cygrpc_SendMessageOperation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":75
+ * 
+ * 
+ * cdef class SendCloseFromClientOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, int flags):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_SendCloseFromClientOperation {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_vtabptr_7_cython_6cygrpc_SendCloseFromClientOperation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":91
+ * 
+ * 
+ * cdef class SendStatusFromServerOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, trailing_metadata, code, object details, int flags):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_SendStatusFromServerOperation {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_vtabptr_7_cython_6cygrpc_SendStatusFromServerOperation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":122
+ * 
+ * 
+ * cdef class ReceiveInitialMetadataOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, flags):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveInitialMetadataOperation {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_vtabptr_7_cython_6cygrpc_ReceiveInitialMetadataOperation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":145
+ * 
+ * 
+ * cdef class ReceiveMessageOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, flags):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveMessageOperation {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_vtabptr_7_cython_6cygrpc_ReceiveMessageOperation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":187
+ * 
+ * 
+ * cdef class ReceiveStatusOnClientOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, flags):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveStatusOnClientOperation {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_vtabptr_7_cython_6cygrpc_ReceiveStatusOnClientOperation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":233
+ * 
+ * 
+ * cdef class ReceiveCloseOnServerOperation(Operation):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, flags):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveCloseOnServerOperation {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_vtabptr_7_cython_6cygrpc_ReceiveCloseOnServerOperation;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":16
+ * 
+ * 
+ * cdef class Server:             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, object arguments, bint xds):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_Server {
+  PyObject *(*_c_shutdown)(struct __pyx_obj_7_cython_6cygrpc_Server *, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *, PyObject *);
+  PyObject *(*notify_shutdown_complete)(struct __pyx_obj_7_cython_6cygrpc_Server *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_Server *__pyx_vtabptr_7_cython_6cygrpc_Server;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":16
+ * 
+ * 
+ * cdef class _Tag:             # <<<<<<<<<<<<<<
+ * 
+ *   cdef BaseEvent event(self, grpc_event c_event):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__Tag {
+  struct __pyx_obj_7_cython_6cygrpc_BaseEvent *(*event)(struct __pyx_obj_7_cython_6cygrpc__Tag *, grpc_event);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__Tag *__pyx_vtabptr_7_cython_6cygrpc__Tag;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":22
+ * 
+ * 
+ * cdef class _ConnectivityTag(_Tag):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, user_tag):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__ConnectivityTag {
+  struct __pyx_vtabstruct_7_cython_6cygrpc__Tag __pyx_base;
+  struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *(*event)(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *, grpc_event);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__ConnectivityTag *__pyx_vtabptr_7_cython_6cygrpc__ConnectivityTag;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":31
+ * 
+ * 
+ * cdef class _RequestCallTag(_Tag):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, user_tag):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__RequestCallTag {
+  struct __pyx_vtabstruct_7_cython_6cygrpc__Tag __pyx_base;
+  void (*prepare)(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *);
+  struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *(*event)(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *, grpc_event);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__RequestCallTag *__pyx_vtabptr_7_cython_6cygrpc__RequestCallTag;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":51
+ * 
+ * 
+ * cdef class _BatchOperationTag:             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, user_tag, operations, call):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__BatchOperationTag {
+  struct __pyx_vtabstruct_7_cython_6cygrpc__Tag __pyx_base;
+  void (*prepare)(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *);
+  struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *(*event)(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *, grpc_event);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__BatchOperationTag *__pyx_vtabptr_7_cython_6cygrpc__BatchOperationTag;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":80
+ * 
+ * 
+ * cdef class _ServerShutdownTag(_Tag):             # <<<<<<<<<<<<<<
+ * 
+ *   def __cinit__(self, user_tag, shutting_down_server):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__ServerShutdownTag {
+  struct __pyx_vtabstruct_7_cython_6cygrpc__Tag __pyx_base;
+  struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *(*event)(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *, grpc_event);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__ServerShutdownTag *__pyx_vtabptr_7_cython_6cygrpc__ServerShutdownTag;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":38
+ * 
+ * 
+ * cdef class BaseCompletionQueue:             # <<<<<<<<<<<<<<
+ * 
+ *     cdef grpc_completion_queue* c_ptr(self):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_BaseCompletionQueue {
+  grpc_completion_queue *(*c_ptr)(struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_BaseCompletionQueue *__pyx_vtabptr_7_cython_6cygrpc_BaseCompletionQueue;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":72
+ * 
+ * 
+ * cdef class PollerCompletionQueue(BaseCompletionQueue):             # <<<<<<<<<<<<<<
+ * 
+ *     def __cinit__(self):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_PollerCompletionQueue {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_BaseCompletionQueue __pyx_base;
+  void (*_poll)(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *);
+  PyObject *(*shutdown)(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_PollerCompletionQueue *__pyx_vtabptr_7_cython_6cygrpc_PollerCompletionQueue;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":17
+ * 
+ * 
+ * cdef class AioRpcStatus(Exception):             # <<<<<<<<<<<<<<
+ * 
+ *     # The final status of gRPC is represented by three trailing metadata:
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus {
+  grpc_status_code (*code)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *, int __pyx_skip_dispatch);
+  PyObject *(*details)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *, int __pyx_skip_dispatch);
+  PyObject *(*trailing_metadata)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *, int __pyx_skip_dispatch);
+  PyObject *(*debug_error_string)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *, int __pyx_skip_dispatch);
+  grpc_status_code (*c_code)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *__pyx_vtabptr_7_cython_6cygrpc_AioRpcStatus;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":16
+ * 
+ * 
+ * cdef class CallbackFailureHandler:             # <<<<<<<<<<<<<<
+ * 
+ *     def __cinit__(self,
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackFailureHandler {
+  PyObject *(*handle)(struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *, PyObject *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackFailureHandler *__pyx_vtabptr_7_cython_6cygrpc_CallbackFailureHandler;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":33
+ * 
+ * 
+ * cdef class CallbackWrapper:             # <<<<<<<<<<<<<<
+ * 
+ *     def __cinit__(self, object future, object loop, CallbackFailureHandler failure_handler):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper {
+  void (*functor_run)(grpc_completion_queue_functor *, int);
+  grpc_completion_queue_functor *(*c_functor)(struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper *__pyx_vtabptr_7_cython_6cygrpc_CallbackWrapper;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":45
+ * 
+ * 
+ * cdef class _AioCall(GrpcCallWrapper):             # <<<<<<<<<<<<<<
+ * 
+ *     def __cinit__(self, AioChannel channel, object deadline,
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall {
+  void (*_create_grpc_call)(struct __pyx_obj_7_cython_6cygrpc__AioCall *, PyObject *, PyObject *, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *);
+  void (*_set_status)(struct __pyx_obj_7_cython_6cygrpc__AioCall *, struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *);
+  void (*_set_initial_metadata)(struct __pyx_obj_7_cython_6cygrpc__AioCall *, PyObject *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *__pyx_vtabptr_7_cython_6cygrpc__AioCall;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":45
+ * 
+ * 
+ * cdef class RPCState:             # <<<<<<<<<<<<<<
+ * 
+ *     def __cinit__(self, AioServer server):
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState {
+  PyObject *(*method)(struct __pyx_obj_7_cython_6cygrpc_RPCState *);
+  PyObject *(*invocation_metadata)(struct __pyx_obj_7_cython_6cygrpc_RPCState *);
+  void (*raise_for_termination)(struct __pyx_obj_7_cython_6cygrpc_RPCState *);
+  int (*get_write_flag)(struct __pyx_obj_7_cython_6cygrpc_RPCState *);
+  struct __pyx_obj_7_cython_6cygrpc_Operation *(*create_send_initial_metadata_op_if_not_sent)(struct __pyx_obj_7_cython_6cygrpc_RPCState *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *__pyx_vtabptr_7_cython_6cygrpc_RPCState;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":884
+ * 
+ * 
+ * cdef class AioServer:             # <<<<<<<<<<<<<<
+ * 
+ *     def __init__(self, loop, thread_pool, generic_handlers, interceptors,
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_AioServer {
+  PyObject *(*thread_pool)(struct __pyx_obj_7_cython_6cygrpc_AioServer *);
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_AioServer *__pyx_vtabptr_7_cython_6cygrpc_AioServer;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":373
+ *   return LocalChannelCredentials(local_connect_type)
+ * 
+ * cdef class InsecureChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_InsecureChannelCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_InsecureChannelCredentials *__pyx_vtabptr_7_cython_6cygrpc_InsecureChannelCredentials;
+
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":429
+ * 
+ * 
+ * cdef class ComputeEngineChannelCredentials(ChannelCredentials):             # <<<<<<<<<<<<<<
+ *   cdef grpc_channel_credentials* _c_creds
+ *   cdef grpc_call_credentials* _call_creds
+ */
+
+struct __pyx_vtabstruct_7_cython_6cygrpc_ComputeEngineChannelCredentials {
+  struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials __pyx_base;
+};
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_vtabptr_7_cython_6cygrpc_ComputeEngineChannelCredentials;
+/* #### Code section: utility_code_proto ### */
+
+/* --- Runtime support code (head) --- */
+/* Refnanny.proto */
+#ifndef CYTHON_REFNANNY
+  #define CYTHON_REFNANNY 0
+#endif
+#if CYTHON_REFNANNY
+  typedef struct {
+    void (*INCREF)(void*, PyObject*, Py_ssize_t);
+    void (*DECREF)(void*, PyObject*, Py_ssize_t);
+    void (*GOTREF)(void*, PyObject*, Py_ssize_t);
+    void (*GIVEREF)(void*, PyObject*, Py_ssize_t);
+    void* (*SetupContext)(const char*, Py_ssize_t, 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__));\
+          }
+  #define __Pyx_RefNannyFinishContextNogil() {\
+              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
+              __Pyx_RefNannyFinishContext();\
+              PyGILState_Release(__pyx_gilstate_save);\
+          }
+#else
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
+          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__))
+  #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext()
+#endif
+  #define __Pyx_RefNannyFinishContextNogil() {\
+              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
+              __Pyx_RefNannyFinishContext();\
+              PyGILState_Release(__pyx_gilstate_save);\
+          }
+  #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); else {__Pyx_INCREF(r); }} while(0)
+  #define __Pyx_XDECREF(r)  do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0)
+  #define __Pyx_XGOTREF(r)  do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0)
+  #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0)
+#else
+  #define __Pyx_RefNannyDeclarations
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)
+  #define __Pyx_RefNannyFinishContextNogil()
+  #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_Py_XDECREF_SET(r, v) do {\
+        PyObject *tmp = (PyObject *) r;\
+        r = v; Py_XDECREF(tmp);\
+    } while (0)
+#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)
+
+/* PyErrExceptionMatches.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err)
+static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err);
+#else
+#define __Pyx_PyErr_ExceptionMatches(err)  PyErr_ExceptionMatches(err)
+#endif
+
+/* PyThreadStateGet.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyThreadState_declare  PyThreadState *__pyx_tstate;
+#define __Pyx_PyThreadState_assign  __pyx_tstate = __Pyx_PyThreadState_Current;
+#if PY_VERSION_HEX >= 0x030C00A6
+#define __Pyx_PyErr_Occurred()  (__pyx_tstate->current_exception != NULL)
+#define __Pyx_PyErr_CurrentExceptionType()  (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL)
+#else
+#define __Pyx_PyErr_Occurred()  (__pyx_tstate->curexc_type != NULL)
+#define __Pyx_PyErr_CurrentExceptionType()  (__pyx_tstate->curexc_type)
+#endif
+#else
+#define __Pyx_PyThreadState_declare
+#define __Pyx_PyThreadState_assign
+#define __Pyx_PyErr_Occurred()  (PyErr_Occurred() != NULL)
+#define __Pyx_PyErr_CurrentExceptionType()  PyErr_Occurred()
+#endif
+
+/* PyErrFetchRestore.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL)
+#define __Pyx_ErrRestoreWithState(type, value, tb)  __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
+#define __Pyx_ErrFetchWithState(type, value, tb)    __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
+#define __Pyx_ErrRestore(type, value, tb)  __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb)
+#define __Pyx_ErrFetch(type, value, tb)    __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
+static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6
+#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL))
+#else
+#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
+#endif
+#else
+#define __Pyx_PyErr_Clear() PyErr_Clear()
+#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
+#define __Pyx_ErrRestoreWithState(type, value, tb)  PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetchWithState(type, value, tb)  PyErr_Fetch(type, value, tb)
+#define __Pyx_ErrRestoreInState(tstate, type, value, tb)  PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetchInState(tstate, type, value, tb)  PyErr_Fetch(type, value, tb)
+#define __Pyx_ErrRestore(type, value, tb)  PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetch(type, value, tb)  PyErr_Fetch(type, value, tb)
+#endif
+
+/* PyObjectGetAttrStr.proto */
+#if CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name);
+#else
+#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
+#endif
+
+/* PyObjectGetAttrStrNoError.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name);
+
+/* GetBuiltinName.proto */
+static PyObject *__Pyx_GetBuiltinName(PyObject *name);
+
+/* TupleAndListFromArray.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n);
+static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n);
+#endif
+
+/* IncludeStringH.proto */
+#include <string.h>
+
+/* BytesEquals.proto */
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);
+
+/* UnicodeEquals.proto */
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals);
+
+/* fastcall.proto */
+#if CYTHON_AVOID_BORROWED_REFS
+    #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i)
+#elif CYTHON_ASSUME_SAFE_MACROS
+    #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i)
+#else
+    #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i)
+#endif
+#if CYTHON_AVOID_BORROWED_REFS
+    #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg)
+    #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg)
+#else
+    #define __Pyx_Arg_NewRef_VARARGS(arg) arg
+    #define __Pyx_Arg_XDECREF_VARARGS(arg)
+#endif
+#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds)
+#define __Pyx_KwValues_VARARGS(args, nargs) NULL
+#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s)
+#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw)
+#if CYTHON_METH_FASTCALL
+    #define __Pyx_Arg_FASTCALL(args, i) args[i]
+    #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds)
+    #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs))
+    static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s);
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000
+    CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues);
+  #else
+    #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw)
+  #endif
+    #define __Pyx_Arg_NewRef_FASTCALL(arg) arg  /* no-op, __Pyx_Arg_FASTCALL is direct and this needs
+                                                   to have the same reference counting */
+    #define __Pyx_Arg_XDECREF_FASTCALL(arg)
+#else
+    #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS
+    #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS
+    #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS
+    #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS
+    #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS
+    #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg)
+    #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg)
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start)
+#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start)
+#else
+#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop)
+#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop)
+#endif
+
+/* RaiseDoubleKeywords.proto */
+static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
+
+/* ParseKeywords.proto */
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues,
+    PyObject **argnames[],
+    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,
+    const char* function_name);
+
+/* RaiseArgTupleInvalid.proto */
+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);
+
+/* ArgTypeTest.proto */
+#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\
+    ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\
+        __Pyx__ArgTypeTest(obj, type, name, exact))
+static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact);
+
+/* IncludeStructmemberH.proto */
+#include <structmember.h>
+
+/* FixUpExtensionType.proto */
+#if CYTHON_USE_TYPE_SPECS
+static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type);
+#endif
+
+/* FetchSharedCythonModule.proto */
+static PyObject *__Pyx_FetchSharedCythonABIModule(void);
+
+/* FetchCommonType.proto */
+#if !CYTHON_USE_TYPE_SPECS
+static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);
+#else
+static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases);
+#endif
+
+/* PyMethodNew.proto */
+#if CYTHON_COMPILING_IN_LIMITED_API
+static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) {
+    PyObject *typesModule=NULL, *methodType=NULL, *result=NULL;
+    CYTHON_UNUSED_VAR(typ);
+    if (!self)
+        return __Pyx_NewRef(func);
+    typesModule = PyImport_ImportModule("types");
+    if (!typesModule) return NULL;
+    methodType = PyObject_GetAttrString(typesModule, "MethodType");
+    Py_DECREF(typesModule);
+    if (!methodType) return NULL;
+    result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL);
+    Py_DECREF(methodType);
+    return result;
+}
+#elif PY_MAJOR_VERSION >= 3
+static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) {
+    CYTHON_UNUSED_VAR(typ);
+    if (!self)
+        return __Pyx_NewRef(func);
+    return PyMethod_New(func, self);
+}
+#else
+    #define __Pyx_PyMethod_New PyMethod_New
+#endif
+
+/* PyVectorcallFastCallDict.proto */
+#if CYTHON_METH_FASTCALL
+static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw);
+#endif
+
+/* CythonFunctionShared.proto */
+#define __Pyx_CyFunction_USED
+#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
+#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
+#define __Pyx_CYFUNCTION_CCLASS        0x04
+#define __Pyx_CYFUNCTION_COROUTINE     0x08
+#define __Pyx_CyFunction_GetClosure(f)\
+    (((__pyx_CyFunctionObject *) (f))->func_closure)
+#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API
+  #define __Pyx_CyFunction_GetClassObj(f)\
+      (((__pyx_CyFunctionObject *) (f))->func_classobj)
+#else
+  #define __Pyx_CyFunction_GetClassObj(f)\
+      ((PyObject*) ((PyCMethodObject *) (f))->mm_class)
+#endif
+#define __Pyx_CyFunction_SetClassObj(f, classobj)\
+    __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (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 {
+#if CYTHON_COMPILING_IN_LIMITED_API
+    PyObject_HEAD
+    PyObject *func;
+#elif PY_VERSION_HEX < 0x030900B1
+    PyCFunctionObject func;
+#else
+    PyCMethodObject func;
+#endif
+#if CYTHON_BACKPORT_VECTORCALL
+    __pyx_vectorcallfunc func_vectorcall;
+#endif
+#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API
+    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;
+#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API
+    PyObject *func_classobj;
+#endif
+    void *defaults;
+    int defaults_pyobjects;
+    size_t defaults_size;
+    int flags;
+    PyObject *defaults_tuple;
+    PyObject *defaults_kwdict;
+    PyObject *(*defaults_getter)(PyObject *);
+    PyObject *func_annotations;
+    PyObject *func_is_coroutine;
+} __pyx_CyFunctionObject;
+#undef __Pyx_CyOrPyCFunction_Check
+#define __Pyx_CyFunction_Check(obj)  __Pyx_TypeCheck(obj, __pyx_CyFunctionType)
+#define __Pyx_CyOrPyCFunction_Check(obj)  __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type)
+#define __Pyx_CyFunction_CheckExact(obj)  __Pyx_IS_TYPE(obj, __pyx_CyFunctionType)
+static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc);
+#undef __Pyx_IsSameCFunction
+#define __Pyx_IsSameCFunction(func, cfunc)   __Pyx__IsSameCyOrCFunction(func, cfunc)
+static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml,
+                                      int flags, PyObject* qualname,
+                                      PyObject *closure,
+                                      PyObject *module, PyObject *globals,
+                                      PyObject* code);
+static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj);
+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(PyObject *module);
+#if CYTHON_METH_FASTCALL
+static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames);
+static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames);
+static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames);
+static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames);
+#if CYTHON_BACKPORT_VECTORCALL
+#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall)
+#else
+#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall)
+#endif
+#endif
+
+/* CythonFunction.proto */
+static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml,
+                                      int flags, PyObject* qualname,
+                                      PyObject *closure,
+                                      PyObject *module, PyObject *globals,
+                                      PyObject* code);
+
+/* RaiseUnexpectedTypeError.proto */
+static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj);
+
+/* PyFunctionFastCall.proto */
+#if CYTHON_FAST_PYCALL
+#if !CYTHON_VECTORCALL
+#define __Pyx_PyFunction_FastCall(func, args, nargs)\
+    __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL)
+static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs);
+#endif
+#define __Pyx_BUILD_ASSERT_EXPR(cond)\
+    (sizeof(char [1 - 2*!(cond)]) - 1)
+#ifndef Py_MEMBER_SIZE
+#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
+#endif
+#if !CYTHON_VECTORCALL
+#if PY_VERSION_HEX >= 0x03080000
+  #include "frameobject.h"
+#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
+  #define __Pxy_PyFrame_Initialize_Offsets()
+  #define __Pyx_PyFrame_GetLocalsplus(frame)  ((frame)->f_localsplus)
+#else
+  static size_t __pyx_pyframe_localsplus_offset = 0;
+  #include "frameobject.h"
+  #define __Pxy_PyFrame_Initialize_Offsets()\
+    ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\
+     (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
+  #define __Pyx_PyFrame_GetLocalsplus(frame)\
+    (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
+#endif
+#endif
+#endif
+
+/* PyObjectCall.proto */
+#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
+
+/* PyObjectCallMethO.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
+#endif
+
+/* PyObjectFastCall.proto */
+#define __Pyx_PyObject_FastCall(func, args, nargs)  __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL)
+static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs);
+
+/* PyObjectCallOneArg.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
+
+/* RaiseException.proto */
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
+
+/* decode_c_string_utf16.proto */
+static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) {
+    int byteorder = 0;
+    return PyUnicode_DecodeUTF16(s, size, errors, &byteorder);
+}
+static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) {
+    int byteorder = -1;
+    return PyUnicode_DecodeUTF16(s, size, errors, &byteorder);
+}
+static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) {
+    int byteorder = 1;
+    return PyUnicode_DecodeUTF16(s, size, errors, &byteorder);
+}
+
+/* decode_c_bytes.proto */
+static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes(
+         const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop,
+         const char* encoding, const char* errors,
+         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors));
+
+/* decode_bytes.proto */
+static CYTHON_INLINE PyObject* __Pyx_decode_bytes(
+         PyObject* string, Py_ssize_t start, Py_ssize_t stop,
+         const char* encoding, const char* errors,
+         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
+    char* as_c_string;
+    Py_ssize_t size;
+#if CYTHON_ASSUME_SAFE_MACROS
+    as_c_string = PyBytes_AS_STRING(string);
+    size = PyBytes_GET_SIZE(string);
+#else
+    if (PyBytes_AsStringAndSize(string, &as_c_string, &size) < 0) {
+        return NULL;
+    }
+#endif
+    return __Pyx_decode_c_bytes(
+        as_c_string, size,
+        start, stop, encoding, errors, decode_func);
+}
+
+/* GetTopmostException.proto */
+#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE
+static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
+#endif
+
+/* SaveResetException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_ExceptionSave(type, value, tb)  __Pyx__ExceptionSave(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#define __Pyx_ExceptionReset(type, value, tb)  __Pyx__ExceptionReset(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
+#else
+#define __Pyx_ExceptionSave(type, value, tb)   PyErr_GetExcInfo(type, value, tb)
+#define __Pyx_ExceptionReset(type, value, tb)  PyErr_SetExcInfo(type, value, tb)
+#endif
+
+/* GetException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_GetException(type, value, tb)  __Pyx__GetException(__pyx_tstate, type, value, tb)
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#else
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);
+#endif
+
+/* PyDictVersioning.proto */
+#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
+#define __PYX_DICT_VERSION_INIT  ((PY_UINT64_T) -1)
+#define __PYX_GET_DICT_VERSION(dict)  (((PyDictObject*)(dict))->ma_version_tag)
+#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\
+    (version_var) = __PYX_GET_DICT_VERSION(dict);\
+    (cache_var) = (value);
+#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\
+    static PY_UINT64_T __pyx_dict_version = 0;\
+    static PyObject *__pyx_dict_cached_value = NULL;\
+    if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\
+        (VAR) = __pyx_dict_cached_value;\
+    } else {\
+        (VAR) = __pyx_dict_cached_value = (LOOKUP);\
+        __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\
+    }\
+}
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj);
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj);
+static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version);
+#else
+#define __PYX_GET_DICT_VERSION(dict)  (0)
+#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)
+#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP)  (VAR) = (LOOKUP);
+#endif
+
+/* GetModuleGlobalName.proto */
+#if CYTHON_USE_DICT_VERSIONS
+#define __Pyx_GetModuleGlobalName(var, name)  do {\
+    static PY_UINT64_T __pyx_dict_version = 0;\
+    static PyObject *__pyx_dict_cached_value = NULL;\
+    (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\
+        (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\
+        __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\
+} while(0)
+#define __Pyx_GetModuleGlobalNameUncached(var, name)  do {\
+    PY_UINT64_T __pyx_dict_version;\
+    PyObject *__pyx_dict_cached_value;\
+    (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\
+} while(0)
+static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value);
+#else
+#define __Pyx_GetModuleGlobalName(var, name)  (var) = __Pyx__GetModuleGlobalName(name)
+#define __Pyx_GetModuleGlobalNameUncached(var, name)  (var) = __Pyx__GetModuleGlobalName(name)
+static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name);
+#endif
+
+/* KeywordStringCheck.proto */
+static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed);
+
+/* PyObjectCallNoArg.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
+
+/* GetItemInt.proto */
+#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 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);
+
+/* ExtTypeTest.proto */
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
+
+/* RaiseTooManyValuesToUnpack.proto */
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
+
+/* RaiseNeedMoreValuesToUnpack.proto */
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
+
+/* IterFinish.proto */
+static CYTHON_INLINE int __Pyx_IterFinish(void);
+
+/* UnpackItemEndCheck.proto */
+static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected);
+
+/* ListAppend.proto */
+#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
+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);
+        #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000
+        L->ob_item[len] = x;
+        #else
+        PyList_SET_ITEM(list, len, x);
+        #endif
+        __Pyx_SET_SIZE(list, len + 1);
+        return 0;
+    }
+    return PyList_Append(list, x);
+}
+#else
+#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
+#endif
+
+/* PyObjectCall2Args.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2);
+
+/* PyObjectGetMethod.proto */
+static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method);
+
+/* PyObjectCallMethod1.proto */
+static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg);
+
+/* append.proto */
+static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x);
+
+/* GetAttr.proto */
+static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *);
+
+/* HasAttr.proto */
+static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *);
+
+/* PyIntBinop.proto */
+#if !CYTHON_COMPILING_IN_PYPY
+static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check);
+#else
+#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace, zerodivision_check)\
+    (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2))
+#endif
+
+/* PySequenceContains.proto */
+static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) {
+    int result = PySequence_Contains(seq, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+}
+
+/* PyObjectLookupSpecial.proto */
+#if CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+#define __Pyx_PyObject_LookupSpecialNoError(obj, attr_name)  __Pyx__PyObject_LookupSpecial(obj, attr_name, 0)
+#define __Pyx_PyObject_LookupSpecial(obj, attr_name)  __Pyx__PyObject_LookupSpecial(obj, attr_name, 1)
+static CYTHON_INLINE PyObject* __Pyx__PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name, int with_error);
+#else
+#define __Pyx_PyObject_LookupSpecialNoError(o,n) __Pyx_PyObject_GetAttrStrNoError(o,n)
+#define __Pyx_PyObject_LookupSpecial(o,n) __Pyx_PyObject_GetAttrStr(o,n)
+#endif
+
+/* RaiseNoneIterError.proto */
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
+
+/* py_dict_pop.proto */
+static CYTHON_INLINE PyObject *__Pyx_PyDict_Pop(PyObject *d, PyObject *key, PyObject *default_value);
+
+/* UnpackUnboundCMethod.proto */
+typedef struct {
+    PyObject *type;
+    PyObject **method_name;
+    PyCFunction func;
+    PyObject *method;
+    int flag;
+} __Pyx_CachedCFunction;
+
+/* CallUnboundCMethod2.proto */
+static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2);
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1
+static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2);
+#else
+#define __Pyx_CallUnboundCMethod2(cfunc, self, arg1, arg2)  __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2)
+#endif
+
+/* CallUnboundCMethod1.proto */
+static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg);
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg);
+#else
+#define __Pyx_CallUnboundCMethod1(cfunc, self, arg)  __Pyx__CallUnboundCMethod1(cfunc, self, arg)
+#endif
+
+/* pyfrozenset_new.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyFrozenSet_New(PyObject* it);
+
+/* py_set_remove.proto */
+static CYTHON_INLINE int __Pyx_PySet_Remove(PyObject *set, PyObject *key);
+
+/* RaiseClosureNameError.proto */
+static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname);
+
+/* set_iter.proto */
+static CYTHON_INLINE PyObject* __Pyx_set_iterator(PyObject* iterable, int is_set,
+                                                  Py_ssize_t* p_orig_length, int* p_source_is_set);
+static CYTHON_INLINE int __Pyx_set_iter_next(
+        PyObject* iter_obj, Py_ssize_t orig_length,
+        Py_ssize_t* ppos, PyObject **value,
+        int source_is_set);
+
+/* py_dict_values.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d);
+
+/* CallUnboundCMethod0.proto */
+static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self);
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_CallUnboundCMethod0(cfunc, self)\
+    (likely((cfunc)->func) ?\
+        (likely((cfunc)->flag == METH_NOARGS) ?  (*((cfunc)->func))(self, NULL) :\
+         (PY_VERSION_HEX >= 0x030600B1 && likely((cfunc)->flag == METH_FASTCALL) ?\
+            (PY_VERSION_HEX >= 0x030700A0 ?\
+                (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0) :\
+                (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL)) :\
+          (PY_VERSION_HEX >= 0x030700A0 && (cfunc)->flag == (METH_FASTCALL | METH_KEYWORDS) ?\
+            (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL) :\
+            (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ?  ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\
+               ((cfunc)->flag == METH_VARARGS ?  (*((cfunc)->func))(self, __pyx_empty_tuple) :\
+               __Pyx__CallUnboundCMethod0(cfunc, self)))))) :\
+        __Pyx__CallUnboundCMethod0(cfunc, self))
+#else
+#define __Pyx_CallUnboundCMethod0(cfunc, self)  __Pyx__CallUnboundCMethod0(cfunc, self)
+#endif
+
+/* PyFloatBinop.proto */
+#if !CYTHON_COMPILING_IN_PYPY
+static PyObject* __Pyx_PyFloat_AddObjC(PyObject *op1, PyObject *op2, double floatval, int inplace, int zerodivision_check);
+#else
+#define __Pyx_PyFloat_AddObjC(op1, op2, floatval, inplace, zerodivision_check)\
+    (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2))
+#endif
+
+/* py_dict_keys.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d);
+
+/* DictGetItem.proto */
+#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
+static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key);
+#define __Pyx_PyObject_Dict_GetItem(obj, name)\
+    (likely(PyDict_CheckExact(obj)) ?\
+     __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name))
+#else
+#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
+#define __Pyx_PyObject_Dict_GetItem(obj, name)  PyObject_GetItem(obj, name)
+#endif
+
+/* IterNext.proto */
+#define __Pyx_PyIter_Next(obj) __Pyx_PyIter_Next2(obj, NULL)
+static CYTHON_INLINE PyObject *__Pyx_PyIter_Next2(PyObject *, PyObject *);
+
+/* GetAttr3.proto */
+static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *);
+
+/* CallableCheck.proto */
+#if CYTHON_USE_TYPE_SLOTS && PY_MAJOR_VERSION >= 3
+#define __Pyx_PyCallable_Check(obj)   (Py_TYPE(obj)->tp_call != NULL)
+#else
+#define __Pyx_PyCallable_Check(obj)   PyCallable_Check(obj)
+#endif
+
+/* WriteUnraisableException.proto */
+static void __Pyx_WriteUnraisable(const char *name, int clineno,
+                                  int lineno, const char *filename,
+                                  int full_traceback, int nogil);
+
+/* PyIntCompare.proto */
+static CYTHON_INLINE int __Pyx_PyInt_BoolEqObjC(PyObject *op1, PyObject *op2, long intval, long inplace);
+
+/* pep479.proto */
+static void __Pyx_Generator_Replace_StopIteration(int in_async_gen);
+
+/* SliceObject.proto */
+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);
+
+/* PyDictContains.proto */
+static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) {
+    int result = PyDict_Contains(dict, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+}
+
+/* Import.proto */
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);
+
+/* ImportDottedModule.proto */
+static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple);
+#if PY_MAJOR_VERSION >= 3
+static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple);
+#endif
+
+/* PyObjectSetAttrStr.proto */
+#if CYTHON_USE_TYPE_SLOTS
+#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);
+#else
+#define __Pyx_PyObject_DelAttrStr(o,n)   PyObject_DelAttr(o,n)
+#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
+#endif
+
+/* SwapException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_ExceptionSwap(type, value, tb)  __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#else
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);
+#endif
+
+/* PyIntBinop.proto */
+#if !CYTHON_COMPILING_IN_PYPY
+static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check);
+#else
+#define __Pyx_PyInt_SubtractObjC(op1, op2, intval, inplace, zerodivision_check)\
+    (inplace ? PyNumber_InPlaceSubtract(op1, op2) : PyNumber_Subtract(op1, op2))
+#endif
+
+/* FastTypeChecks.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type)
+#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2)
+static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b);
+static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b);
+static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type);
+static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2);
+#else
+#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
+#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2))
+#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type)
+#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2))
+#endif
+#define __Pyx_PyErr_ExceptionMatches2(err1, err2)  __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2)
+#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception)
+
+/* PyObject_Str.proto */
+#define __Pyx_PyObject_Str(obj)\
+    (likely(PyString_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Str(obj))
+
+/* StopAsyncIteration.proto */
+#define __Pyx_StopAsyncIteration_USED
+static PyObject *__Pyx_PyExc_StopAsyncIteration;
+static int __pyx_StopAsyncIteration_init(PyObject *module);
+
+/* CoroutineBase.proto */
+struct __pyx_CoroutineObject;
+typedef PyObject *(*__pyx_coroutine_body_t)(struct __pyx_CoroutineObject *, PyThreadState *, PyObject *);
+#if CYTHON_USE_EXC_INFO_STACK
+#define __Pyx_ExcInfoStruct  _PyErr_StackItem
+#else
+typedef struct {
+    PyObject *exc_type;
+    PyObject *exc_value;
+    PyObject *exc_traceback;
+} __Pyx_ExcInfoStruct;
+#endif
+typedef struct __pyx_CoroutineObject {
+    PyObject_HEAD
+    __pyx_coroutine_body_t body;
+    PyObject *closure;
+    __Pyx_ExcInfoStruct gi_exc_state;
+    PyObject *gi_weakreflist;
+    PyObject *classobj;
+    PyObject *yieldfrom;
+    PyObject *gi_name;
+    PyObject *gi_qualname;
+    PyObject *gi_modulename;
+    PyObject *gi_code;
+    PyObject *gi_frame;
+    int resume_label;
+    char is_running;
+} __pyx_CoroutineObject;
+static __pyx_CoroutineObject *__Pyx__Coroutine_New(
+    PyTypeObject *type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
+    PyObject *name, PyObject *qualname, PyObject *module_name);
+static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit(
+            __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
+            PyObject *name, PyObject *qualname, PyObject *module_name);
+static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *self);
+static int __Pyx_Coroutine_clear(PyObject *self);
+static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value);
+static PyObject *__Pyx_Coroutine_Close(PyObject *self);
+static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args);
+#if CYTHON_USE_EXC_INFO_STACK
+#define __Pyx_Coroutine_SwapException(self)
+#define __Pyx_Coroutine_ResetAndClearException(self)  __Pyx_Coroutine_ExceptionClear(&(self)->gi_exc_state)
+#else
+#define __Pyx_Coroutine_SwapException(self) {\
+    __Pyx_ExceptionSwap(&(self)->gi_exc_state.exc_type, &(self)->gi_exc_state.exc_value, &(self)->gi_exc_state.exc_traceback);\
+    __Pyx_Coroutine_ResetFrameBackpointer(&(self)->gi_exc_state);\
+    }
+#define __Pyx_Coroutine_ResetAndClearException(self) {\
+    __Pyx_ExceptionReset((self)->gi_exc_state.exc_type, (self)->gi_exc_state.exc_value, (self)->gi_exc_state.exc_traceback);\
+    (self)->gi_exc_state.exc_type = (self)->gi_exc_state.exc_value = (self)->gi_exc_state.exc_traceback = NULL;\
+    }
+#endif
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyGen_FetchStopIterationValue(pvalue)\
+    __Pyx_PyGen__FetchStopIterationValue(__pyx_tstate, pvalue)
+#else
+#define __Pyx_PyGen_FetchStopIterationValue(pvalue)\
+    __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, pvalue)
+#endif
+static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *tstate, PyObject **pvalue);
+static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state);
+
+/* PyObject_GenericGetAttrNoDict.proto */
+#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name);
+#else
+#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr
+#endif
+
+/* PatchModuleWithCoroutine.proto */
+static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code);
+
+/* PatchGeneratorABC.proto */
+static int __Pyx_patch_abc(void);
+
+/* Coroutine.proto */
+#define __Pyx_Coroutine_USED
+#define __Pyx_Coroutine_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CoroutineType)
+#define __Pyx_Coroutine_Check(obj) __Pyx_Coroutine_CheckExact(obj)
+#define __Pyx_CoroutineAwait_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CoroutineAwaitType)
+#define __Pyx_Coroutine_New(body, code, closure, name, qualname, module_name)\
+    __Pyx__Coroutine_New(__pyx_CoroutineType, body, code, closure, name, qualname, module_name)
+static int __pyx_Coroutine_init(PyObject *module);
+static PyObject *__Pyx__Coroutine_await(PyObject *coroutine);
+typedef struct {
+    PyObject_HEAD
+    PyObject *coroutine;
+} __pyx_CoroutineAwaitObject;
+static PyObject *__Pyx_CoroutineAwait_Close(__pyx_CoroutineAwaitObject *self, PyObject *arg);
+static PyObject *__Pyx_CoroutineAwait_Throw(__pyx_CoroutineAwaitObject *self, PyObject *args);
+
+/* GetAwaitIter.proto */
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAwaitableIter(PyObject *o);
+static PyObject *__Pyx__Coroutine_GetAwaitableIter(PyObject *o);
+
+/* CoroutineYieldFrom.proto */
+static CYTHON_INLINE PyObject* __Pyx_Coroutine_Yield_From(__pyx_CoroutineObject *gen, PyObject *source);
+
+/* PyObjectFormatSimple.proto */
+#if CYTHON_COMPILING_IN_PYPY
+    #define __Pyx_PyObject_FormatSimple(s, f) (\
+        likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\
+        PyObject_Format(s, f))
+#elif PY_MAJOR_VERSION < 3
+    #define __Pyx_PyObject_FormatSimple(s, f) (\
+        likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\
+        likely(PyString_CheckExact(s)) ? PyUnicode_FromEncodedObject(s, NULL, "strict") :\
+        PyObject_Format(s, f))
+#elif CYTHON_USE_TYPE_SLOTS
+    #define __Pyx_PyObject_FormatSimple(s, f) (\
+        likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\
+        likely(PyLong_CheckExact(s)) ? PyLong_Type.tp_repr(s) :\
+        likely(PyFloat_CheckExact(s)) ? PyFloat_Type.tp_repr(s) :\
+        PyObject_Format(s, f))
+#else
+    #define __Pyx_PyObject_FormatSimple(s, f) (\
+        likely(PyUnicode_CheckExact(s)) ? (Py_INCREF(s), s) :\
+        PyObject_Format(s, f))
+#endif
+
+/* JoinPyUnicode.proto */
+static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength,
+                                      Py_UCS4 max_char);
+
+/* ErrOccurredWithGIL.proto */
+static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void);
+
+/* PyObjectCallMethod0.proto */
+static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name);
+
+/* UnpackTupleError.proto */
+static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index);
+
+/* UnpackTuple2.proto */
+#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\
+    (likely(is_tuple || PyTuple_Check(tuple)) ?\
+        (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\
+            __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\
+            (__Pyx_UnpackTupleError(tuple, 2), -1)) :\
+        __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple))
+static CYTHON_INLINE int __Pyx_unpack_tuple2_exact(
+    PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple);
+static int __Pyx_unpack_tuple2_generic(
+    PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple);
+
+/* dict_iter.proto */
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name,
+                                                   Py_ssize_t* p_orig_length, int* p_is_dict);
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
+                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
+
+/* dict_getitem_default.proto */
+static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value);
+
+/* decode_c_string.proto */
+static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
+         const char* cstring, Py_ssize_t start, Py_ssize_t stop,
+         const char* encoding, const char* errors,
+         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors));
+
+/* ReturnWithStopIteration.proto */
+#define __Pyx_ReturnWithStopIteration(value)\
+    if (value == Py_None) PyErr_SetNone(PyExc_StopIteration); else __Pyx__ReturnWithStopIteration(value)
+static void __Pyx__ReturnWithStopIteration(PyObject* value);
+
+/* AssertionsEnabled.proto */
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
+  #define __Pyx_init_assertions_enabled()  (0)
+  #define __pyx_assertions_enabled()  (1)
+#elif CYTHON_COMPILING_IN_LIMITED_API  ||  (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000)
+  static int __pyx_assertions_enabled_flag;
+  #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag)
+  static int __Pyx_init_assertions_enabled(void) {
+    PyObject *builtins, *debug, *debug_str;
+    int flag;
+    builtins = PyEval_GetBuiltins();
+    if (!builtins) goto bad;
+    debug_str = PyUnicode_FromStringAndSize("__debug__", 9);
+    if (!debug_str) goto bad;
+    debug = PyObject_GetItem(builtins, debug_str);
+    Py_DECREF(debug_str);
+    if (!debug) goto bad;
+    flag = PyObject_IsTrue(debug);
+    Py_DECREF(debug);
+    if (flag == -1) goto bad;
+    __pyx_assertions_enabled_flag = flag;
+    return 0;
+  bad:
+    __pyx_assertions_enabled_flag = 1;
+    return -1;
+  }
+#else
+  #define __Pyx_init_assertions_enabled()  (0)
+  #define __pyx_assertions_enabled()  (!Py_OptimizeFlag)
+#endif
+
+/* ImportFrom.proto */
+static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);
+
+/* ObjectGetItem.proto */
+#if CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key);
+#else
+#define __Pyx_PyObject_GetItem(obj, key)  PyObject_GetItem(obj, key)
+#endif
+
+/* StrEquals.proto */
+#if PY_MAJOR_VERSION >= 3
+#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
+#else
+#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
+#endif
+
+/* AsyncIter.proto */
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAsyncIter(PyObject *o);
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_AsyncIterNext(PyObject *o);
+
+/* ListExtend.proto */
+static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) {
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000
+    PyObject* none = _PyList_Extend((PyListObject*)L, v);
+    if (unlikely(!none))
+        return -1;
+    Py_DECREF(none);
+    return 0;
+#else
+    return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v);
+#endif
+}
+
+/* CallNextTpTraverse.proto */
+static int __Pyx_call_next_tp_traverse(PyObject* obj, visitproc v, void *a, traverseproc current_tp_traverse);
+
+/* CallNextTpClear.proto */
+static void __Pyx_call_next_tp_clear(PyObject* obj, inquiry current_tp_clear);
+
+/* ValidateBasesTuple.proto */
+#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS
+static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases);
+#endif
+
+/* PyType_Ready.proto */
+CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t);
+
+/* PyObject_GenericGetAttr.proto */
+#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
+static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name);
+#else
+#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr
+#endif
+
+/* SetVTable.proto */
+static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable);
+
+/* GetVTable.proto */
+static void* __Pyx_GetVtable(PyTypeObject *type);
+
+/* MergeVTables.proto */
+#if !CYTHON_COMPILING_IN_LIMITED_API
+static int __Pyx_MergeVtables(PyTypeObject *type);
+#endif
+
+/* SetupReduce.proto */
+#if !CYTHON_COMPILING_IN_LIMITED_API
+static int __Pyx_setup_reduce(PyObject* type_obj);
+#endif
+
+/* FormatTypeName.proto */
+#if CYTHON_COMPILING_IN_LIMITED_API
+typedef PyObject *__Pyx_TypeName;
+#define __Pyx_FMT_TYPENAME "%U"
+static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp);
+#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj)
+#else
+typedef const char *__Pyx_TypeName;
+#define __Pyx_FMT_TYPENAME "%.200s"
+#define __Pyx_PyType_GetName(tp) ((tp)->tp_name)
+#define __Pyx_DECREF_TypeName(obj)
+#endif
+
+/* ValidateExternBase.proto */
+static int __Pyx_validate_extern_base(PyTypeObject *base);
+
+/* TypeImport.proto */
+#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_11
+#define __PYX_HAVE_RT_ImportType_proto_3_0_11
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
+#include <stdalign.h>
+#endif
+#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L
+#define __PYX_GET_STRUCT_ALIGNMENT_3_0_11(s) alignof(s)
+#else
+#define __PYX_GET_STRUCT_ALIGNMENT_3_0_11(s) sizeof(void*)
+#endif
+enum __Pyx_ImportType_CheckSize_3_0_11 {
+   __Pyx_ImportType_CheckSize_Error_3_0_11 = 0,
+   __Pyx_ImportType_CheckSize_Warn_3_0_11 = 1,
+   __Pyx_ImportType_CheckSize_Ignore_3_0_11 = 2
+};
+static PyTypeObject *__Pyx_ImportType_3_0_11(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_11 check_size);
+#endif
+
+/* PatchInspect.proto */
+static PyObject* __Pyx_patch_inspect(PyObject* module);
+
+/* PatchAsyncIO.proto */
+static PyObject* __Pyx_patch_asyncio(PyObject* module);
+
+/* UnicodeConcatInPlace.proto */
+# if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+    #if CYTHON_REFNANNY
+        #define __Pyx_PyUnicode_ConcatInPlace(left, right) __Pyx_PyUnicode_ConcatInPlaceImpl(&left, right, __pyx_refnanny)
+    #else
+        #define __Pyx_PyUnicode_ConcatInPlace(left, right) __Pyx_PyUnicode_ConcatInPlaceImpl(&left, right)
+    #endif
+    static CYTHON_INLINE PyObject *__Pyx_PyUnicode_ConcatInPlaceImpl(PyObject **p_left, PyObject *right
+        #if CYTHON_REFNANNY
+        , void* __pyx_refnanny
+        #endif
+    );
+#else
+#define __Pyx_PyUnicode_ConcatInPlace __Pyx_PyUnicode_Concat
+#endif
+#define __Pyx_PyUnicode_ConcatInPlaceSafe(left, right) ((unlikely((left) == Py_None) || unlikely((right) == Py_None)) ?\
+    PyNumber_InPlaceAdd(left, right) : __Pyx_PyUnicode_ConcatInPlace(left, right))
+
+/* StrConcatInPlace.proto */
+#if PY_MAJOR_VERSION >= 3
+    #define __Pyx_PyStr_Concat __Pyx_PyUnicode_Concat
+    #define __Pyx_PyStr_ConcatInPlace __Pyx_PyUnicode_ConcatInPlace
+#else
+    #define __Pyx_PyStr_Concat PyNumber_Add
+    #define __Pyx_PyStr_ConcatInPlace PyNumber_InPlaceAdd
+#endif
+#define __Pyx_PyStr_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
+    PyNumber_Add(a, b) : __Pyx_PyStr_Concat(a, b))
+#define __Pyx_PyStr_ConcatInPlaceSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
+    PyNumber_InPlaceAdd(a, b) : __Pyx_PyStr_ConcatInPlace(a, b))
+
+/* SetNameInClass.proto */
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000
+#define __Pyx_SetNameInClass(ns, name, value)\
+    (likely(PyDict_CheckExact(ns)) ? _PyDict_SetItem_KnownHash(ns, name, value, ((PyASCIIObject *) name)->hash) : PyObject_SetItem(ns, name, value))
+#elif CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_SetNameInClass(ns, name, value)\
+    (likely(PyDict_CheckExact(ns)) ? PyDict_SetItem(ns, name, value) : PyObject_SetItem(ns, name, value))
+#else
+#define __Pyx_SetNameInClass(ns, name, value)  PyObject_SetItem(ns, name, value)
+#endif
+
+/* CalculateMetaclass.proto */
+static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases);
+
+/* Py3ClassCreate.proto */
+static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, PyObject *qualname,
+                                           PyObject *mkw, PyObject *modname, PyObject *doc);
+static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases, PyObject *dict,
+                                      PyObject *mkw, int calculate_metaclass, int allow_py2_metaclass);
+
+/* Py3UpdateBases.proto */
+static PyObject* __Pyx_PEP560_update_bases(PyObject *bases);
+
+/* CLineInTraceback.proto */
+#ifdef CYTHON_CLINE_IN_TRACEBACK
+#define __Pyx_CLineForTraceback(tstate, c_line)  (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0)
+#else
+static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line);
+#endif
+
+/* CodeObjectCache.proto */
+#if !CYTHON_COMPILING_IN_LIMITED_API
+typedef struct {
+    PyCodeObject* code_object;
+    int code_line;
+} __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);
+#endif
+
+/* AddTraceback.proto */
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename);
+
+/* None.proto */
+#include <new>
+
+/* GCCDiagnostics.proto */
+#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#define __Pyx_HAS_GCC_DIAGNOSTIC
+#endif
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_7_cython_6cygrpc_AioServerStatus(enum __pyx_t_7_cython_6cygrpc_AioServerStatus value);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE enum __pyx_t_7_cython_6cygrpc_AioServerStatus __Pyx_PyInt_As_enum____pyx_t_7_cython_6cygrpc_AioServerStatus(PyObject *);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE grpc_status_code __Pyx_PyInt_As_grpc_status_code(PyObject *);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_status_code(grpc_status_code value);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE grpc_connectivity_state __Pyx_PyInt_As_grpc_connectivity_state(PyObject *);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_local_connect_type(grpc_local_connect_type value);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE grpc_local_connect_type __Pyx_PyInt_As_grpc_local_connect_type(PyObject *);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE grpc_completion_type __Pyx_PyInt_As_grpc_completion_type(PyObject *);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_connectivity_state(grpc_connectivity_state value);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_call_error(grpc_call_error value);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_completion_type(grpc_completion_type value);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_op_type(grpc_op_type value);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_compression_algorithm(grpc_compression_algorithm value);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_compression_level(grpc_compression_level value);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE grpc_compression_algorithm __Pyx_PyInt_As_grpc_compression_algorithm(PyObject *);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE grpc_call_error __Pyx_PyInt_As_grpc_call_error(PyObject *);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *);
+
+/* Generator.proto */
+#define __Pyx_Generator_USED
+#define __Pyx_Generator_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_GeneratorType)
+#define __Pyx_Generator_New(body, code, closure, name, qualname, module_name)\
+    __Pyx__Coroutine_New(__pyx_GeneratorType, body, code, closure, name, qualname, module_name)
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static int __pyx_Generator_init(PyObject *module);
+
+/* AsyncGenerator.proto */
+#define __Pyx_AsyncGen_USED
+typedef struct {
+    __pyx_CoroutineObject coro;
+    PyObject *ag_finalizer;
+    int ag_hooks_inited;
+    int ag_closed;
+    int ag_running_async;
+} __pyx_PyAsyncGenObject;
+static PyTypeObject *__pyx__PyAsyncGenWrappedValueType = 0;
+static PyTypeObject *__pyx__PyAsyncGenASendType = 0;
+static PyTypeObject *__pyx__PyAsyncGenAThrowType = 0;
+static PyTypeObject *__pyx_AsyncGenType = 0;
+#define __Pyx_AsyncGen_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_AsyncGenType)
+#define __pyx_PyAsyncGenASend_CheckExact(o)\
+                    __Pyx_IS_TYPE(o, __pyx__PyAsyncGenASendType)
+#define __pyx_PyAsyncGenAThrow_CheckExact(o)\
+                    __Pyx_IS_TYPE(o, __pyx__PyAsyncGenAThrowType)
+static PyObject *__Pyx_async_gen_anext(PyObject *o);
+static CYTHON_INLINE PyObject *__Pyx_async_gen_asend_iternext(PyObject *o);
+static PyObject *__Pyx_async_gen_asend_send(PyObject *o, PyObject *arg);
+static PyObject *__Pyx_async_gen_asend_close(PyObject *o, PyObject *args);
+static PyObject *__Pyx_async_gen_athrow_close(PyObject *o, PyObject *args);
+static PyObject *__Pyx__PyAsyncGenValueWrapperNew(PyObject *val);
+static __pyx_CoroutineObject *__Pyx_AsyncGen_New(
+            __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
+            PyObject *name, PyObject *qualname, PyObject *module_name) {
+    __pyx_PyAsyncGenObject *gen = PyObject_GC_New(__pyx_PyAsyncGenObject, __pyx_AsyncGenType);
+    if (unlikely(!gen))
+        return NULL;
+    gen->ag_finalizer = NULL;
+    gen->ag_closed = 0;
+    gen->ag_hooks_inited = 0;
+    gen->ag_running_async = 0;
+    return __Pyx__Coroutine_NewInit((__pyx_CoroutineObject*)gen, body, code, closure, name, qualname, module_name);
+}
+static int __pyx_AsyncGen_init(PyObject *module);
+static void __Pyx_PyAsyncGen_Fini(void);
+
+/* CheckBinaryVersion.proto */
+static unsigned long __Pyx_get_runtime_version(void);
+static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer);
+
+/* VoidPtrExport.proto */
+static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig);
+
+/* FunctionExport.proto */
+static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig);
+
+/* InitStrings.proto */
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);
+
+/* #### Code section: module_declarations ### */
+static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4real_real(PyComplexObject *__pyx_v_self); /* proto*/
+static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4imag_imag(PyComplexObject *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_11_ChannelArg_c(struct __pyx_obj_7_cython_6cygrpc__ChannelArg *__pyx_v_self, PyObject *__pyx_v_argument, PyObject *__pyx_v_references); /* proto*/
+static grpc_channel_args *__pyx_f_7_cython_6cygrpc_12_ChannelArgs_c_args(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_10_CallState_maybe_delete_call_tracer(struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_10_CallState_maybe_set_client_call_tracer_on_call(struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self, PyObject *__pyx_v_method_name, PyObject *__pyx_v_target); /* proto*/
+static grpc_call_credentials *__pyx_f_7_cython_6cygrpc_15CallCredentials_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_self); /* proto*/
+static grpc_call_credentials *__pyx_f_7_cython_6cygrpc_29MetadataPluginCallCredentials_c(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self); /* proto*/
+static grpc_call_credentials *__pyx_f_7_cython_6cygrpc_24CompositeCallCredentials_c(struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self); /* proto*/
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_18ChannelCredentials_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_self); /* proto*/
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_21SSLChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self); /* proto*/
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_27CompositeChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self); /* proto*/
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_21XDSChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self); /* proto*/
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_23LocalChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *__pyx_v_self); /* proto*/
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_26InsecureChannelCredentials_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *__pyx_v_self); /* proto*/
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_22ALTSChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self); /* proto*/
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_31ComputeEngineChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_v_self); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_15CompletionQueue__interpret_event(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_9Operation_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_9Operation_un_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_28SendInitialMetadataOperation_c(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_28SendInitialMetadataOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_20SendMessageOperation_c(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_20SendMessageOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_28SendCloseFromClientOperation_c(struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_28SendCloseFromClientOperation_un_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_29SendStatusFromServerOperation_c(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_29SendStatusFromServerOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_23ReceiveMessageOperation_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_23ReceiveMessageOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_6Server__c_shutdown(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_queue, PyObject *__pyx_v_tag); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_6Server_notify_shutdown_complete(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self); /* proto*/
+static struct __pyx_obj_7_cython_6cygrpc_BaseEvent *__pyx_f_7_cython_6cygrpc_4_Tag_event(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__Tag *__pyx_v_self, CYTHON_UNUSED grpc_event __pyx_v_c_event); /* proto*/
+struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_f_7_cython_6cygrpc_16_ConnectivityTag_event(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_f_7_cython_6cygrpc_16_ConnectivityTag_event__pyx_wrap_1(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_15_RequestCallTag_prepare(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self); /* proto*/
+struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_f_7_cython_6cygrpc_15_RequestCallTag_event(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_f_7_cython_6cygrpc_15_RequestCallTag_event__pyx_wrap_1(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_18_BatchOperationTag_prepare(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self); /* proto*/
+struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_f_7_cython_6cygrpc_18_BatchOperationTag_event(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_f_7_cython_6cygrpc_18_BatchOperationTag_event__pyx_wrap_1(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_f_7_cython_6cygrpc_18_ServerShutdownTag_event(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_f_7_cython_6cygrpc_18_ServerShutdownTag_event__pyx_wrap_1(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self, grpc_event __pyx_v_c_event); /* proto*/
+static grpc_status_code __pyx_f_7_cython_6cygrpc_12AioRpcStatus_code(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_12AioRpcStatus_details(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_12AioRpcStatus_trailing_metadata(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_12AioRpcStatus_debug_error_string(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
+static grpc_status_code __pyx_f_7_cython_6cygrpc_12AioRpcStatus_c_code(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto*/
+static grpc_completion_queue *__pyx_f_7_cython_6cygrpc_19BaseCompletionQueue_c_ptr(struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_21PollerCompletionQueue__poll(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_21PollerCompletionQueue_shutdown(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_22CallbackFailureHandler_handle(struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_self, PyObject *__pyx_v_future); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_15CallbackWrapper_functor_run(grpc_completion_queue_functor *__pyx_v_functor, int __pyx_v_success); /* proto*/
+static grpc_completion_queue_functor *__pyx_f_7_cython_6cygrpc_15CallbackWrapper_c_functor(struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_8_AioCall__create_grpc_call(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_deadline, PyObject *__pyx_v_method, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_8_AioCall__set_status(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_status); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_8_AioCall__set_initial_metadata(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_initial_metadata); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_8RPCState_method(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_8RPCState_invocation_metadata(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self); /* proto*/
+static void __pyx_f_7_cython_6cygrpc_8RPCState_raise_for_termination(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self); /* proto*/
+static int __pyx_f_7_cython_6cygrpc_8RPCState_get_write_flag(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self); /* proto*/
+static struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_f_7_cython_6cygrpc_8RPCState_create_send_initial_metadata_op_if_not_sent(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self); /* proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_9AioServer_thread_pool(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self); /* proto*/
+
+/* Module declarations from "cpython.version" */
+
+/* Module declarations from "__builtin__" */
+
+/* Module declarations from "cpython.type" */
+
+/* Module declarations from "libc.string" */
+
+/* Module declarations from "libc.stdio" */
+
+/* Module declarations from "cpython.object" */
+
+/* Module declarations from "cpython.ref" */
+
+/* Module declarations from "cpython.exc" */
+
+/* Module declarations from "cpython.module" */
+
+/* Module declarations from "cpython.mem" */
+
+/* Module declarations from "cpython.tuple" */
+
+/* Module declarations from "cpython.list" */
+
+/* Module declarations from "cpython.sequence" */
+
+/* Module declarations from "cpython.mapping" */
+
+/* Module declarations from "cpython.iterator" */
+
+/* Module declarations from "cpython.number" */
+
+/* Module declarations from "cpython.int" */
+
+/* Module declarations from "__builtin__" */
+
+/* Module declarations from "cpython.bool" */
+
+/* Module declarations from "cpython.long" */
+
+/* Module declarations from "cpython.float" */
+
+/* Module declarations from "__builtin__" */
+
+/* Module declarations from "cpython.complex" */
+
+/* Module declarations from "cpython.string" */
+
+/* Module declarations from "libc.stddef" */
+
+/* Module declarations from "cpython.unicode" */
+
+/* Module declarations from "cpython.pyport" */
+
+/* Module declarations from "cpython.dict" */
+
+/* Module declarations from "cpython.instance" */
+
+/* Module declarations from "cpython.function" */
+
+/* Module declarations from "cpython.method" */
+
+/* Module declarations from "cpython.weakref" */
+
+/* Module declarations from "cpython.getargs" */
+
+/* Module declarations from "cpython.pythread" */
+
+/* Module declarations from "cpython.pystate" */
+
+/* Module declarations from "cpython.cobject" */
+
+/* Module declarations from "cpython.oldbuffer" */
+
+/* Module declarations from "cpython.set" */
+
+/* Module declarations from "cpython.buffer" */
+
+/* Module declarations from "cpython.bytes" */
+
+/* Module declarations from "cpython.pycapsule" */
+
+/* Module declarations from "cpython.contextvars" */
+
+/* Module declarations from "cpython" */
+
+/* Module declarations from "libcpp.string" */
+
+/* Module declarations from "libc.time" */
+
+/* Module declarations from "libc" */
+
+/* Module declarations from "libcpp.cast" */
+
+/* Module declarations from "posix" */
+
+/* Module declarations from "posix.types" */
+
+/* Module declarations from "posix.unistd" */
+
+/* Module declarations from "_cython.cygrpc" */
+static int __pyx_v_7_cython_6cygrpc_g_interrupt_check_period_ms;
+static grpc_arg_pointer_vtable __pyx_v_7_cython_6cygrpc_default_vtable;
+static char const *__pyx_v_7_cython_6cygrpc_CLIENT_CALL_TRACER;
+static char const *__pyx_v_7_cython_6cygrpc_SERVER_CALL_TRACER_FACTORY;
+static std::queue<void *>  __pyx_v_7_cython_6cygrpc_g_greenlets_to_run;
+static std::condition_variable __pyx_v_7_cython_6cygrpc_g_greenlets_cv;
+static std::mutex __pyx_v_7_cython_6cygrpc_g_greenlets_mu;
+static int __pyx_v_7_cython_6cygrpc_g_shutdown_greenlets_to_run_queue;
+static int __pyx_v_7_cython_6cygrpc_g_channel_count;
+static gpr_timespec __pyx_v_7_cython_6cygrpc__GPR_INF_FUTURE;
+static float __pyx_v_7_cython_6cygrpc__POLL_AWAKE_INTERVAL_S;
+static int __pyx_v_7_cython_6cygrpc__has_fd_monitoring;
+static struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_7_cython_6cygrpc_CQ_SHUTDOWN_FAILURE_HANDLER = 0;
+static PyObject *__pyx_v_7_cython_6cygrpc__GRPC_ASYNCIO_ENGINE = 0;
+static struct __pyx_obj_7_cython_6cygrpc__AioState *__pyx_v_7_cython_6cygrpc__global_aio_state = 0;
+static struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_7_cython_6cygrpc__WATCH_CONNECTIVITY_FAILURE_HANDLER = 0;
+static int __pyx_v_7_cython_6cygrpc__EMPTY_FLAG;
+static PyObject *__pyx_v_7_cython_6cygrpc__RPC_FINISHED_DETAILS = 0;
+static PyObject *__pyx_v_7_cython_6cygrpc__SERVER_STOPPED_DETAILS = 0;
+static struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_7_cython_6cygrpc_REQUEST_CALL_FAILURE_HANDLER = 0;
+static struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_7_cython_6cygrpc_SERVER_SHUTDOWN_FAILURE_HANDLER = 0;
+static PyObject *__pyx_f_7_cython_6cygrpc__check_call_error_no_metadata(PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__check_and_raise_call_error_no_metadata(PyObject *); /*proto*/
+static int __pyx_f_7_cython_6cygrpc__get_metadata(void *, grpc_auth_metadata_context, grpc_credentials_plugin_metadata_cb, void *, grpc_metadata *, size_t *, grpc_status_code *, char const **); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__destroy(void *); /*proto*/
+static grpc_call_credentials *__pyx_f_7_cython_6cygrpc__composition(PyObject *); /*proto*/
+static grpc_event __pyx_f_7_cython_6cygrpc__next(grpc_completion_queue *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__interpret_event(grpc_event); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__store_c_metadata(PyObject *, grpc_metadata **, size_t *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__release_c_metadata(grpc_metadata *, int); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__metadatum(grpc_slice, grpc_slice); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__metadata(grpc_metadata_array *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__slice_bytes(grpc_slice); /*proto*/
+static grpc_slice __pyx_f_7_cython_6cygrpc__slice_from_bytes(PyObject *); /*proto*/
+static grpc_ssl_roots_override_result __pyx_f_7_cython_6cygrpc_ssl_roots_override_callback(char **); /*proto*/
+static gpr_timespec __pyx_f_7_cython_6cygrpc__timespec_from_time(PyObject *); /*proto*/
+static double __pyx_f_7_cython_6cygrpc__time_from_timespec(gpr_timespec); /*proto*/
+static void *__pyx_f_7_cython_6cygrpc__copy_pointer(void *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__destroy_pointer(void *); /*proto*/
+static int __pyx_f_7_cython_6cygrpc__compare_pointer(void *, void *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__custom_op_on_c_call(int, grpc_call *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc_gevent_increment_channel_count(int __pyx_skip_dispatch); /*proto*/
+static void __pyx_f_7_cython_6cygrpc_gevent_decrement_channel_count(int __pyx_skip_dispatch); /*proto*/
+static void __pyx_f_7_cython_6cygrpc___prefork(void); /*proto*/
+static void __pyx_f_7_cython_6cygrpc___postfork_parent(void); /*proto*/
+static void __pyx_f_7_cython_6cygrpc___postfork_child(void); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__unified_socket_write(int); /*proto*/
+static grpc_completion_queue *__pyx_f_7_cython_6cygrpc_global_completion_queue(void); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_init_grpc_aio(int __pyx_skip_dispatch); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_shutdown_grpc_aio(int __pyx_skip_dispatch); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_str_to_bytes(PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__encode(PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__decode(PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__call_error_metadata(PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__call_error_no_metadata(PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__call_error(PyObject *, PyObject *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__raise_call_error_no_metadata(PyObject *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__raise_call_error(PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__destroy_c_completion_queue(grpc_completion_queue *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__operate(grpc_call *, PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__operate_from_integrated_call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, struct __pyx_obj_7_cython_6cygrpc__CallState *, PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__operate_from_segregated_call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, struct __pyx_obj_7_cython_6cygrpc__CallState *, PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__cancel(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, struct __pyx_obj_7_cython_6cygrpc__CallState *, grpc_status_code, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__next_call_event(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, grpc_completion_queue *, PyObject *, PyObject *, PyObject *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, struct __pyx_obj_7_cython_6cygrpc__CallState *, grpc_completion_queue *, PyObject *, int, PyObject *, PyObject *, PyObject *, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *, PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__process_integrated_call_tag(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *); /*proto*/
+static struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_f_7_cython_6cygrpc__integrated_call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, int, PyObject *, PyObject *, PyObject *, PyObject *, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *, PyObject *, PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__process_segregated_call_tag(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, struct __pyx_obj_7_cython_6cygrpc__CallState *, grpc_completion_queue *, struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *); /*proto*/
+static struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_f_7_cython_6cygrpc__segregated_call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, int, PyObject *, PyObject *, PyObject *, PyObject *, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *, PyObject *, PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__watch_connectivity_state(struct __pyx_obj_7_cython_6cygrpc__ChannelState *, grpc_connectivity_state, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__close(struct __pyx_obj_7_cython_6cygrpc_Channel *, grpc_status_code, PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__calls_drained(struct __pyx_obj_7_cython_6cygrpc__ChannelState *); /*proto*/
+static char const *__pyx_f_7_cython_6cygrpc__get_c_pem_root_certs(PyObject *); /*proto*/
+static grpc_ssl_pem_key_cert_pair *__pyx_f_7_cython_6cygrpc__create_c_ssl_pem_key_cert_pairs(PyObject *); /*proto*/
+static grpc_ssl_certificate_config_reload_status __pyx_f_7_cython_6cygrpc__server_cert_config_fetcher_wrapper(void *, grpc_ssl_server_certificate_config **); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__internal_latent_event(struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__latent_event(grpc_completion_queue *, PyObject *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__set_call_tracer(grpc_call *, void *); /*proto*/
+static void *__pyx_f_7_cython_6cygrpc__get_call_tracer(grpc_call *); /*proto*/
+static void __pyx_f_7_cython_6cygrpc__register_server_call_tracer_factory(void *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__submit_to_greenlet_queue(PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_await_next_greenlet(void); /*proto*/
+static grpc_status_code __pyx_f_7_cython_6cygrpc_get_status_code(PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_deserialize(PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_serialize(PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_prepend_send_initial_metadata_op(PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__default_asyncio_engine(void); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__initialize_poller(void); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__actual_aio_initialization(void); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__actual_aio_shutdown(void); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__initialize_per_loop(void); /*proto*/
+static int __pyx_f_7_cython_6cygrpc__get_send_initial_metadata_flags(PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__augment_metadata(PyObject *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__add_callback_handler(PyObject *, struct __pyx_obj_7_cython_6cygrpc_RPCState *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc__initialize(void); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle_ChannelCredentials__set_state(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle_InsecureChannelCredentials__set_state(struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle__Tag__set_state(struct __pyx_obj_7_cython_6cygrpc__Tag *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle_CensusContext__set_state(struct __pyx_obj_7_cython_6cygrpc_CensusContext *, PyObject *); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle_AioServer__set_state(struct __pyx_obj_7_cython_6cygrpc_AioServer *, PyObject *); /*proto*/
+static PyObject *__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *)); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string(std::string const &); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string(std::string const &); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string(std::string const &); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string(std::string const &); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string(std::string const &); /*proto*/
+static PyObject *__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(PyObject *(*)(void)); /*proto*/
+static PyObject *__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(PyObject *(*)(PyObject *, PyObject *)); /*proto*/
+static PyObject *__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(void (*)(void)); /*proto*/
+/* #### Code section: typeinfo ### */
+/* #### Code section: before_global_var ### */
+#define __Pyx_MODULE_NAME "_cython.cygrpc"
+extern int __pyx_module_is_main__cython__cygrpc;
+int __pyx_module_is_main__cython__cygrpc = 0;
+
+/* Implementation of "_cython.cygrpc" */
+/* #### Code section: global_var ### */
+static PyObject *__pyx_builtin_ImportError;
+static PyObject *__pyx_builtin_object;
+static PyObject *__pyx_builtin_TypeError;
+static PyObject *__pyx_builtin_UnicodeDecodeError;
+static PyObject *__pyx_builtin_enumerate;
+static PyObject *__pyx_builtin_ValueError;
+static PyObject *__pyx_builtin_NotImplementedError;
+static PyObject *__pyx_builtin_range;
+static PyObject *__pyx_builtin_KeyError;
+static PyObject *__pyx_builtin_AttributeError;
+static PyObject *__pyx_builtin_RuntimeError;
+static PyObject *__pyx_builtin_DeprecationWarning;
+static PyObject *__pyx_builtin_AssertionError;
+static PyObject *__pyx_builtin_id;
+static PyObject *__pyx_builtin_KeyboardInterrupt;
+static PyObject *__pyx_builtin_SystemExit;
+/* #### Code section: string_decls ### */
+static const char __pyx_k_0[] = "0";
+static const char __pyx_k_1[] = "1";
+static const char __pyx_k_e[] = "e";
+static const char __pyx_k_t[] = "t";
+static const char __pyx_k__7[] = "";
+static const char __pyx_k_cb[] = "cb";
+static const char __pyx_k_fn[] = "fn";
+static const char __pyx_k_gc[] = "gc";
+static const char __pyx_k_id[] = "id";
+static const char __pyx_k_lk[] = "lk";
+static const char __pyx_k_ok[] = "ok";
+static const char __pyx_k_op[] = "op";
+static const char __pyx_k_os[] = "os";
+static const char __pyx_k_EOF[] = "EOF";
+static const char __pyx_k_Tag[] = "_Tag";
+static const char __pyx_k_YES[] = "YES";
+static const char __pyx_k_Yes[] = "Yes";
+static const char __pyx_k__38[] = "*";
+static const char __pyx_k__49[] = ": ";
+static const char __pyx_k__57[] = "_";
+static const char __pyx_k__58[] = ".";
+static const char __pyx_k__69[] = "<";
+static const char __pyx_k__70[] = " ";
+static const char __pyx_k__71[] = ">";
+static const char __pyx_k_add[] = "add";
+static const char __pyx_k_bin[] = "-bin";
+static const char __pyx_k_ctx[] = "ctx";
+static const char __pyx_k_doc[] = "__doc__";
+static const char __pyx_k_gen[] = "gen";
+static const char __pyx_k_get[] = "get";
+static const char __pyx_k_hub[] = "hub";
+static const char __pyx_k_int[] = "__int__";
+static const char __pyx_k_key[] = "key";
+static const char __pyx_k_len[] = "__len__";
+static const char __pyx_k_low[] = "low";
+static const char __pyx_k_new[] = "__new__";
+static const char __pyx_k_ops[] = "ops";
+static const char __pyx_k_pop[] = "pop";
+static const char __pyx_k_put[] = "put";
+static const char __pyx_k_run[] = "run";
+static const char __pyx_k_str[] = "str";
+static const char __pyx_k_sys[] = "sys";
+static const char __pyx_k_tag[] = "tag";
+static const char __pyx_k_uds[] = "uds";
+static const char __pyx_k_xds[] = "xds";
+static const char __pyx_k_yes[] = "yes";
+static const char __pyx_k_Call[] = "Call";
+static const char __pyx_k_Enum[] = "Enum";
+static const char __pyx_k_Lock[] = "Lock";
+static const char __pyx_k_None[] = "None";
+static const char __pyx_k_TRUE[] = "TRUE";
+static const char __pyx_k_True[] = "True";
+static const char __pyx_k__107[] = "?";
+static const char __pyx_k_agen[] = "agen";
+static const char __pyx_k_args[] = "args";
+static const char __pyx_k_bool[] = "__bool__";
+static const char __pyx_k_call[] = "call";
+static const char __pyx_k_code[] = "code";
+static const char __pyx_k_copy[] = "copy";
+static const char __pyx_k_coro[] = "coro";
+static const char __pyx_k_data[] = "data";
+static const char __pyx_k_dict[] = "__dict__";
+static const char __pyx_k_done[] = "done";
+static const char __pyx_k_enum[] = "enum";
+static const char __pyx_k_exit[] = "__exit__";
+static const char __pyx_k_grpc[] = "grpc";
+static const char __pyx_k_gzip[] = "gzip";
+static const char __pyx_k_high[] = "high";
+static const char __pyx_k_host[] = "host";
+static const char __pyx_k_idle[] = "idle";
+static const char __pyx_k_init[] = "__init__";
+static const char __pyx_k_item[] = "item";
+static const char __pyx_k_iter[] = "__iter__";
+static const char __pyx_k_join[] = "join";
+static const char __pyx_k_keys[] = "keys";
+static const char __pyx_k_loop[] = "loop";
+static const char __pyx_k_main[] = "__main__";
+static const char __pyx_k_name[] = "name";
+static const char __pyx_k_none[] = "none";
+static const char __pyx_k_peer[] = "peer";
+static const char __pyx_k_poll[] = "poll";
+static const char __pyx_k_pool[] = "pool";
+static const char __pyx_k_read[] = "read";
+static const char __pyx_k_recv[] = "recv";
+static const char __pyx_k_repr[] = "_repr";
+static const char __pyx_k_self[] = "self";
+static const char __pyx_k_send[] = "send";
+static const char __pyx_k_spec[] = "__spec__";
+static const char __pyx_k_task[] = "task";
+static const char __pyx_k_test[] = "__test__";
+static const char __pyx_k_time[] = "time";
+static const char __pyx_k_true[] = "true";
+static const char __pyx_k_type[] = "type";
+static const char __pyx_k_utf8[] = "utf8";
+static const char __pyx_k_wait[] = "wait";
+static const char __pyx_k_wrap[] = "wrap";
+static const char __pyx_k_EOF_2[] = "_EOF";
+static const char __pyx_k_Group[] = "Group";
+static const char __pyx_k_Queue[] = "Queue";
+static const char __pyx_k_RLock[] = "RLock";
+static const char __pyx_k_abort[] = "abort";
+static const char __pyx_k_aexit[] = "__aexit__";
+static const char __pyx_k_aiter[] = "__aiter__";
+static const char __pyx_k_anext[] = "__anext__";
+static const char __pyx_k_apply[] = "apply";
+static const char __pyx_k_ascii[] = "ascii";
+static const char __pyx_k_await[] = "__await__";
+static const char __pyx_k_c_key[] = "c_key";
+static const char __pyx_k_class[] = "__class__";
+static const char __pyx_k_clear[] = "clear";
+static const char __pyx_k_close[] = "close";
+static const char __pyx_k_creds[] = "creds";
+static const char __pyx_k_debug[] = "debug";
+static const char __pyx_k_enter[] = "__enter__";
+static const char __pyx_k_errno[] = "errno";
+static const char __pyx_k_error[] = "error";
+static const char __pyx_k_event[] = "event";
+static const char __pyx_k_flags[] = "flags";
+static const char __pyx_k_grace[] = "grace";
+static const char __pyx_k_is_ok[] = "is_ok";
+static const char __pyx_k_lower[] = "lower";
+static const char __pyx_k_queue[] = "queue";
+static const char __pyx_k_range[] = "range";
+static const char __pyx_k_ready[] = "ready";
+static const char __pyx_k_run_2[] = "_run";
+static const char __pyx_k_sleep[] = "sleep";
+static const char __pyx_k_spawn[] = "spawn";
+static const char __pyx_k_start[] = "start";
+static const char __pyx_k_state[] = "state";
+static const char __pyx_k_str_2[] = "__str__";
+static const char __pyx_k_super[] = "super";
+static const char __pyx_k_throw[] = "throw";
+static const char __pyx_k_upper[] = "upper";
+static const char __pyx_k_utf_8[] = "utf-8";
+static const char __pyx_k_value[] = "value";
+static const char __pyx_k_write[] = "write";
+static const char __pyx_k_LOGGER[] = "_LOGGER";
+static const char __pyx_k_POLLER[] = "POLLER";
+static const char __pyx_k_Server[] = "Server";
+static const char __pyx_k_Thread[] = "Thread";
+static const char __pyx_k_aenter[] = "__aenter__";
+static const char __pyx_k_append[] = "append";
+static const char __pyx_k_atexit[] = "atexit";
+static const char __pyx_k_before[] = "before";
+static const char __pyx_k_c_peer[] = "c_peer";
+static const char __pyx_k_cancel[] = "cancel";
+static const char __pyx_k_closed[] = "closed";
+static const char __pyx_k_codecs[] = "codecs";
+static const char __pyx_k_common[] = "_common";
+static const char __pyx_k_cygrpc[] = ".cygrpc";
+static const char __pyx_k_daemon[] = "daemon";
+static const char __pyx_k_decode[] = "decode";
+static const char __pyx_k_dict_2[] = "_dict";
+static const char __pyx_k_enable[] = "enable";
+static const char __pyx_k_encode[] = "encode";
+static const char __pyx_k_exit_2[] = "_exit";
+static const char __pyx_k_fileno[] = "fileno";
+static const char __pyx_k_format[] = "format";
+static const char __pyx_k_future[] = "future";
+static const char __pyx_k_gevent[] = "gevent";
+static const char __pyx_k_import[] = "__import__";
+static const char __pyx_k_medium[] = "medium";
+static const char __pyx_k_method[] = "method";
+static const char __pyx_k_module[] = "__module__";
+static const char __pyx_k_name_2[] = "__name__";
+static const char __pyx_k_object[] = "object";
+static const char __pyx_k_pickle[] = "pickle";
+static const char __pyx_k_plugin[] = "plugin";
+static const char __pyx_k_poller[] = "poller";
+static const char __pyx_k_reduce[] = "__reduce__";
+static const char __pyx_k_repr_2[] = "__repr__";
+static const char __pyx_k_result[] = "result";
+static const char __pyx_k_return[] = "return";
+static const char __pyx_k_server[] = "server";
+static const char __pyx_k_shield[] = "shield";
+static const char __pyx_k_socket[] = "socket";
+static const char __pyx_k_status[] = "status";
+static const char __pyx_k_target[] = "target";
+static const char __pyx_k_thread[] = "_thread";
+static const char __pyx_k_typing[] = "typing";
+static const char __pyx_k_update[] = "update";
+static const char __pyx_k_values[] = "values";
+static const char __pyx_k_AioCall[] = "_AioCall";
+static const char __pyx_k_Channel[] = "Channel";
+static const char __pyx_k_Unknown[] = "Unknown";
+static const char __pyx_k_aborted[] = "aborted";
+static const char __pyx_k_address[] = "address";
+static const char __pyx_k_asyncio[] = "asyncio";
+static const char __pyx_k_c_event[] = "c_event";
+static const char __pyx_k_capsule[] = "capsule";
+static const char __pyx_k_cb_func[] = "cb_func";
+static const char __pyx_k_channel[] = "channel";
+static const char __pyx_k_closing[] = "closing";
+static const char __pyx_k_context[] = "context";
+static const char __pyx_k_deflate[] = "deflate";
+static const char __pyx_k_destroy[] = "destroy";
+static const char __pyx_k_details[] = "details";
+static const char __pyx_k_disable[] = "disable";
+static const char __pyx_k_discard[] = "discard";
+static const char __pyx_k_environ[] = "environ";
+static const char __pyx_k_genexpr[] = "genexpr";
+static const char __pyx_k_get_hub[] = "get_hub";
+static const char __pyx_k_handler[] = "handler";
+static const char __pyx_k_inspect[] = "inspect";
+static const char __pyx_k_logging[] = "logging";
+static const char __pyx_k_maxsize[] = "maxsize";
+static const char __pyx_k_members[] = "__members__";
+static const char __pyx_k_message[] = "message";
+static const char __pyx_k_operate[] = "operate";
+static const char __pyx_k_options[] = "options";
+static const char __pyx_k_partial[] = "partial";
+static const char __pyx_k_pkgutil[] = "pkgutil";
+static const char __pyx_k_prepare[] = "__prepare__";
+static const char __pyx_k_request[] = "request";
+static const char __pyx_k_service[] = "service";
+static const char __pyx_k_span_id[] = "span_id";
+static const char __pyx_k_success[] = "success";
+static const char __pyx_k_timeout[] = "timeout";
+static const char __pyx_k_to_call[] = "to_call";
+static const char __pyx_k_unknown[] = "unknown";
+static const char __pyx_k_warning[] = "warning";
+static const char __pyx_k_wrapper[] = "wrapper";
+static const char __pyx_k_AioState[] = "_AioState";
+static const char __pyx_k_EX_USAGE[] = "EX_USAGE";
+static const char __pyx_k_KeyError[] = "KeyError";
+static const char __pyx_k_Optional[] = "Optional";
+static const char __pyx_k_RPCState[] = "RPCState";
+static const char __pyx_k_c_target[] = "c_target";
+static const char __pyx_k_callback[] = "callback";
+static const char __pyx_k_capacity[] = "capacity";
+static const char __pyx_k_channels[] = "channels";
+static const char __pyx_k_daemonic[] = "daemonic";
+static const char __pyx_k_deadline[] = "deadline";
+static const char __pyx_k_end_time[] = "end_time";
+static const char __pyx_k_endswith[] = "endswith";
+static const char __pyx_k_exc_info[] = "exc_info";
+static const char __pyx_k_get_data[] = "get_data";
+static const char __pyx_k_getstate[] = "__getstate__";
+static const char __pyx_k_identity[] = "identity";
+static const char __pyx_k_internal[] = "internal";
+static const char __pyx_k_is_valid[] = "is_valid";
+static const char __pyx_k_metadata[] = "metadata";
+static const char __pyx_k_object_2[] = "<{} object>";
+static const char __pyx_k_property[] = "property";
+static const char __pyx_k_pyx_capi[] = "__pyx_capi__";
+static const char __pyx_k_pyx_type[] = "__pyx_type";
+static const char __pyx_k_qualname[] = "__qualname__";
+static const char __pyx_k_register[] = "register";
+static const char __pyx_k_response[] = "response";
+static const char __pyx_k_rpc_coro[] = "rpc_coro";
+static const char __pyx_k_rpc_task[] = "rpc_task";
+static const char __pyx_k_set_code[] = "set_code";
+static const char __pyx_k_set_name[] = "__set_name__";
+static const char __pyx_k_setstate[] = "__setstate__";
+static const char __pyx_k_shutdown[] = "shutdown";
+static const char __pyx_k_trace_id[] = "trace_id";
+static const char __pyx_k_user_tag[] = "user_tag";
+static const char __pyx_k_wait_for[] = "wait_for";
+static const char __pyx_k_warnings[] = "warnings";
+static const char __pyx_k_AioServer[] = "AioServer";
+static const char __pyx_k_BaseError[] = "BaseError";
+static const char __pyx_k_BaseEvent[] = "BaseEvent";
+static const char __pyx_k_CallError[] = "CallError";
+static const char __pyx_k_CallState[] = "_CallState";
+static const char __pyx_k_Call_peer[] = "Call.peer";
+static const char __pyx_k_Condition[] = "Condition";
+static const char __pyx_k_EOF___len[] = "_EOF.__len__";
+static const char __pyx_k_EOF___str[] = "_EOF.__str__";
+static const char __pyx_k_EOF__repr[] = "_EOF._repr";
+static const char __pyx_k_ForkState[] = "_ForkState";
+static const char __pyx_k_Metadatum[] = "_Metadatum";
+static const char __pyx_k_Operation[] = "Operation";
+static const char __pyx_k_Timed_out[] = "Timed out";
+static const char __pyx_k_TypeError[] = "TypeError";
+static const char __pyx_k_WriteFlag[] = "WriteFlag";
+static const char __pyx_k_algorithm[] = "algorithm";
+static const char __pyx_k_arguments[] = "arguments";
+static const char __pyx_k_bind_loop[] = "bind_loop";
+static const char __pyx_k_bytes_ctx[] = "bytes_ctx";
+static const char __pyx_k_c_details[] = "c_details";
+static const char __pyx_k_c_options[] = "c_options";
+static const char __pyx_k_cancelled[] = "cancelled";
+static const char __pyx_k_condition[] = "_condition";
+static const char __pyx_k_data_loss[] = "data_loss";
+static const char __pyx_k_decrement[] = "decrement";
+static const char __pyx_k_enumerate[] = "enumerate";
+static const char __pyx_k_error_str[] = "error_str";
+static const char __pyx_k_exception[] = "exception";
+static const char __pyx_k_functools[] = "functools";
+static const char __pyx_k_getLogger[] = "getLogger";
+static const char __pyx_k_hex_codec[] = "hex_codec";
+static const char __pyx_k_increment[] = "increment";
+static const char __pyx_k_isenabled[] = "isenabled";
+static const char __pyx_k_local_tcp[] = "local_tcp";
+static const char __pyx_k_metaclass[] = "__metaclass__";
+static const char __pyx_k_not_found[] = "not_found";
+static const char __pyx_k_print_exc[] = "print_exc";
+static const char __pyx_k_pyx_state[] = "__pyx_state";
+static const char __pyx_k_reduce_ex[] = "__reduce_ex__";
+static const char __pyx_k_rpc_state[] = "rpc_state";
+static const char __pyx_k_server_id[] = "server_id";
+static const char __pyx_k_setDaemon[] = "setDaemon";
+static const char __pyx_k_socket_id[] = "socket_id";
+static const char __pyx_k_threading[] = "threading";
+static const char __pyx_k_traceback[] = "traceback";
+static const char __pyx_k_used_mask[] = "used_mask";
+static const char __pyx_k_wait_time[] = "wait_time";
+static const char __pyx_k_AbortError[] = "AbortError";
+static const char __pyx_k_AioChannel[] = "AioChannel";
+static const char __pyx_k_CallHandle[] = "CallHandle";
+static const char __pyx_k_ChannelArg[] = "_ChannelArg";
+static const char __pyx_k_EMPTY_MASK[] = "_EMPTY_MASK";
+static const char __pyx_k_EOF___bool[] = "_EOF.__bool__";
+static const char __pyx_k_EOF___repr[] = "_EOF.__repr__";
+static const char __pyx_k_Failed_s_s[] = "Failed \"%s\": %s";
+static const char __pyx_k_StatusCode[] = "StatusCode";
+static const char __pyx_k_SystemExit[] = "SystemExit";
+static const char __pyx_k_UsageError[] = "UsageError";
+static const char __pyx_k_ValueError[] = "ValueError";
+static const char __pyx_k_add_reader[] = "add_reader";
+static const char __pyx_k_c_deadline[] = "c_deadline";
+static const char __pyx_k_call_creds[] = "call_creds";
+static const char __pyx_k_call_error[] = "call_error";
+static const char __pyx_k_call_queue[] = "call_queue";
+static const char __pyx_k_call_state[] = "call_state";
+static const char __pyx_k_census_ctx[] = "census_ctx";
+static const char __pyx_k_channel_id[] = "channel_id";
+static const char __pyx_k_connecting[] = "connecting";
+static const char __pyx_k_error_code[] = "error_code";
+static const char __pyx_k_finish_ops[] = "finish_ops";
+static const char __pyx_k_fork_epoch[] = "fork_epoch";
+static const char __pyx_k_fork_state[] = "_fork_state";
+static const char __pyx_k_get_plugin[] = "get_plugin";
+static const char __pyx_k_gevent_hub[] = "gevent_hub";
+static const char __pyx_k_handle_rpc[] = "_handle_rpc";
+static const char __pyx_k_identities[] = "identities";
+static const char __pyx_k_is_running[] = "is_running";
+static const char __pyx_k_is_sampled[] = "is_sampled";
+static const char __pyx_k_namedtuple[] = "namedtuple";
+static const char __pyx_k_next_event[] = "next_event";
+static const char __pyx_k_notify_all[] = "notify_all";
+static const char __pyx_k_on_failure[] = "on_failure";
+static const char __pyx_k_on_success[] = "on_success";
+static const char __pyx_k_operations[] = "operations";
+static const char __pyx_k_properties[] = "properties";
+static const char __pyx_k_pyx_result[] = "__pyx_result";
+static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
+static const char __pyx_k_query_call[] = "query_call";
+static const char __pyx_k_receive_op[] = "receive_op";
+static const char __pyx_k_set_result[] = "set_result";
+static const char __pyx_k_socketpair[] = "socketpair";
+static const char __pyx_k_stored_ctx[] = "_stored_ctx";
+static const char __pyx_k_threadpool[] = "threadpool";
+static const char __pyx_k_write_flag[] = "write_flag";
+static const char __pyx_k_CallDetails[] = "CallDetails";
+static const char __pyx_k_Call_cancel[] = "Call.cancel";
+static const char __pyx_k_ChannelArgs[] = "_ChannelArgs";
+static const char __pyx_k_EMPTY_FLAGS[] = "_EMPTY_FLAGS";
+static const char __pyx_k_ImportError[] = "ImportError";
+static const char __pyx_k_PickleError[] = "PickleError";
+static const char __pyx_k_TRUE_VALUES[] = "_TRUE_VALUES";
+static const char __pyx_k_actual_code[] = "actual_code";
+static const char __pyx_k_batch_error[] = "batch_error";
+static const char __pyx_k_buffer_hint[] = "buffer_hint";
+static const char __pyx_k_call_handle[] = "call_handle";
+static const char __pyx_k_capsule_ptr[] = "capsule_ptr";
+static const char __pyx_k_cert_config[] = "cert_config";
+static const char __pyx_k_cfunc_to_py[] = "cfunc.to_py";
+static const char __pyx_k_collections[] = "collections";
+static const char __pyx_k_compression[] = "compression";
+static const char __pyx_k_contextvars[] = "contextvars";
+static const char __pyx_k_create_task[] = "create_task";
+static const char __pyx_k_credentials[] = "credentials";
+static const char __pyx_k_gevent_pool[] = "gevent.pool";
+static const char __pyx_k_inbound_ops[] = "inbound_ops";
+static const char __pyx_k_interceptor[] = "interceptor";
+static const char __pyx_k_isawaitable[] = "isawaitable";
+static const char __pyx_k_max_results[] = "max_results";
+static const char __pyx_k_mro_entries[] = "__mro_entries__";
+static const char __pyx_k_no_compress[] = "no_compress";
+static const char __pyx_k_not_invoked[] = "not_invoked";
+static const char __pyx_k_private_key[] = "private_key";
+static const char __pyx_k_raw_message[] = "raw_message";
+static const char __pyx_k_read_socket[] = "read_socket";
+static const char __pyx_k_request_raw[] = "request_raw";
+static const char __pyx_k_retain_self[] = "retain_self";
+static const char __pyx_k_set_details[] = "set_details";
+static const char __pyx_k_setblocking[] = "setblocking";
+static const char __pyx_k_shutdown_cq[] = "shutdown_cq";
+static const char __pyx_k_start_batch[] = "_start_batch";
+static const char __pyx_k_started_tag[] = "started_tag";
+static const char __pyx_k_status_code[] = "status_code";
+static const char __pyx_k_status_task[] = "status_task";
+static const char __pyx_k_thread_pool[] = "thread_pool";
+static const char __pyx_k_unary_unary[] = "unary_unary";
+static const char __pyx_k_unavailable[] = "unavailable";
+static const char __pyx_k_unused_task[] = "unused_task";
+static const char __pyx_k_AioCall_done[] = "_AioCall.done";
+static const char __pyx_k_AioRpcStatus[] = "AioRpcStatus";
+static const char __pyx_k_ChannelState[] = "_ChannelState";
+static const char __pyx_k_RuntimeError[] = "RuntimeError";
+static const char __pyx_k_Server_start[] = "Server.start";
+static const char __pyx_k_TimeoutError[] = "TimeoutError";
+static const char __pyx_k_add_callback[] = "add_callback";
+static const char __pyx_k_auth_context[] = "auth_context";
+static const char __pyx_k_backup_queue[] = "backup_queue";
+static const char __pyx_k_call_details[] = "call_details";
+static const char __pyx_k_context_loop[] = "context_loop";
+static const char __pyx_k_continuation[] = "continuation";
+static const char __pyx_k_copy_context[] = "copy_context";
+static const char __pyx_k_error_string[] = "error_string";
+static const char __pyx_k_grpc_aio_EOF[] = "<grpc.aio.EOF>";
+static const char __pyx_k_identity_key[] = "identity_key";
+static const char __pyx_k_initializing[] = "_initializing";
+static const char __pyx_k_interceptors[] = "interceptors";
+static const char __pyx_k_is_coroutine[] = "_is_coroutine";
+static const char __pyx_k_out_of_range[] = "out_of_range";
+static const char __pyx_k_outbound_ops[] = "outbound_ops";
+static const char __pyx_k_poll_wrapper[] = "_poll_wrapper";
+static const char __pyx_k_pyx_checksum[] = "__pyx_checksum";
+static const char __pyx_k_request_call[] = "_request_call";
+static const char __pyx_k_response_raw[] = "response_raw";
+static const char __pyx_k_send_message[] = "_send_message";
+static const char __pyx_k_server_queue[] = "server_queue";
+static const char __pyx_k_simplefilter[] = "simplefilter";
+static const char __pyx_k_started_tags[] = "started_tags";
+static const char __pyx_k_stream_unary[] = "stream_unary";
+static const char __pyx_k_stringsource[] = "<stringsource>";
+static const char __pyx_k_timeout_secs[] = "timeout_secs";
+static const char __pyx_k_unary_stream[] = "unary_stream";
+static const char __pyx_k_use_setstate[] = "use_setstate";
+static const char __pyx_k_AioCall__repr[] = "_AioCall._repr";
+static const char __pyx_k_AioCall_is_ok[] = "_AioCall.is_ok";
+static const char __pyx_k_AsyncIOEngine[] = "AsyncIOEngine";
+static const char __pyx_k_CensusContext[] = "CensusContext";
+static const char __pyx_k_ChannelArgKey[] = "ChannelArgKey";
+static const char __pyx_k_Channel_close[] = "Channel.close";
+static const char __pyx_k_InternalError[] = "InternalError";
+static const char __pyx_k_OperationType[] = "OperationType";
+static const char __pyx_k_asyncio_tasks[] = "asyncio.tasks";
+static const char __pyx_k_c_cert_config[] = "c_cert_config";
+static const char __pyx_k_callback_func[] = "callback_func";
+static const char __pyx_k_channel_state[] = "channel_state";
+static const char __pyx_k_class_getitem[] = "__class_getitem__";
+static const char __pyx_k_close_on_fork[] = "_close_on_fork";
+static const char __pyx_k_create_future[] = "create_future";
+static const char __pyx_k_credentials_2[] = "_credentials";
+static const char __pyx_k_cython_cygrpc[] = "_cython.cygrpc";
+static const char __pyx_k_details_bytes[] = "details_bytes";
+static const char __pyx_k_enable_census[] = "enable_census";
+static const char __pyx_k_error_details[] = "error_details";
+static const char __pyx_k_execute_batch[] = "execute_batch";
+static const char __pyx_k_g_gevent_pool[] = "g_gevent_pool";
+static const char __pyx_k_handle_events[] = "_handle_events";
+static const char __pyx_k_init_grpc_aio[] = "init_grpc_aio";
+static const char __pyx_k_init_subclass[] = "__init_subclass__";
+static const char __pyx_k_internal_poll[] = "_internal_poll";
+static const char __pyx_k_invalid_flags[] = "invalid_flags";
+static const char __pyx_k_not_on_client[] = "not_on_client";
+static const char __pyx_k_not_on_server[] = "not_on_server";
+static const char __pyx_k_observability[] = "_observability";
+static const char __pyx_k_query_handler[] = "query_handler";
+static const char __pyx_k_queue_timeout[] = "queue_timeout";
+static const char __pyx_k_reduce_cython[] = "__reduce_cython__";
+static const char __pyx_k_remove_reader[] = "remove_reader";
+static const char __pyx_k_runtime_error[] = "runtime_error";
+static const char __pyx_k_send_close_op[] = "send_close_op";
+static const char __pyx_k_set_exception[] = "set_exception";
+static const char __pyx_k_stream_stream[] = "stream_stream";
+static const char __pyx_k_subchannel_id[] = "subchannel_id";
+static const char __pyx_k_unary_handler[] = "unary_handler";
+static const char __pyx_k_unimplemented[] = "unimplemented";
+static const char __pyx_k_unused_future[] = "unused_future";
+static const char __pyx_k_AioCall_cancel[] = "_AioCall.cancel";
+static const char __pyx_k_AioCall_status[] = "_AioCall.status";
+static const char __pyx_k_AssertionError[] = "AssertionError";
+static const char __pyx_k_AttributeError[] = "AttributeError";
+static const char __pyx_k_BoundEventLoop[] = "_BoundEventLoop";
+static const char __pyx_k_CancelledError[] = "CancelledError";
+static const char __pyx_k_Channel_target[] = "Channel.target";
+static const char __pyx_k_CompletionType[] = "CompletionType";
+static const char __pyx_k_GrpcArgWrapper[] = "_GrpcArgWrapper";
+static const char __pyx_k_IntegratedCall[] = "IntegratedCall";
+static const char __pyx_k_LatentEventArg[] = "_LatentEventArg";
+static const char __pyx_k_RequestCallTag[] = "_RequestCallTag";
+static const char __pyx_k_SegregatedCall[] = "SegregatedCall";
+static const char __pyx_k_Server_destroy[] = "Server.destroy";
+static const char __pyx_k_Unexpected_s_s[] = "Unexpected %s: %s";
+static const char __pyx_k_add_http2_port[] = "add_http2_port";
+static const char __pyx_k_after_in_child[] = "after_in_child";
+static const char __pyx_k_already_exists[] = "already_exists";
+static const char __pyx_k_c_returned_str[] = "c_returned_str";
+static const char __pyx_k_catch_warnings[] = "catch_warnings";
+static const char __pyx_k_default_vtable[] = "default_vtable";
+static const char __pyx_k_exception_type[] = "exception_type";
+static const char __pyx_k_get_event_loop[] = "get_event_loop";
+static const char __pyx_k_get_fork_epoch[] = "get_fork_epoch";
+static const char __pyx_k_managed_target[] = "managed_target";
+static const char __pyx_k_method_handler[] = "method_handler";
+static const char __pyx_k_new_event_loop[] = "new_event_loop";
+static const char __pyx_k_pem_root_certs[] = "pem_root_certs";
+static const char __pyx_k_query_handlers[] = "query_handlers";
+static const char __pyx_k_queue_deadline[] = "queue_deadline";
+static const char __pyx_k_queue_shutdown[] = "queue_shutdown";
+static const char __pyx_k_request_call_2[] = "request_call";
+static const char __pyx_k_send_message_2[] = "send_message";
+static const char __pyx_k_server_started[] = "server_started";
+static const char __pyx_k_stream_handler[] = "stream_handler";
+static const char __pyx_k_time_remaining[] = "time_remaining";
+static const char __pyx_k_to_channel_arg[] = "to_channel_arg";
+static const char __pyx_k_try_to_connect[] = "try_to_connect";
+static const char __pyx_k_wait_for_ready[] = "wait_for_ready";
+static const char __pyx_k_yield_to_queue[] = "yield_to_queue";
+static const char __pyx_k_AioChannel_call[] = "AioChannel.call";
+static const char __pyx_k_AioServer_start[] = "AioServer.start";
+static const char __pyx_k_CallCredentials[] = "CallCredentials";
+static const char __pyx_k_CallbackWrapper[] = "CallbackWrapper";
+static const char __pyx_k_CompletionQueue[] = "CompletionQueue";
+static const char __pyx_k_ConnectivityTag[] = "_ConnectivityTag";
+static const char __pyx_k_GrpcCallWrapper[] = "GrpcCallWrapper";
+static const char __pyx_k_Locally_aborted[] = "Locally aborted.";
+static const char __pyx_k_MessageReceiver[] = "_MessageReceiver";
+static const char __pyx_k_Server_shutdown[] = "Server.shutdown";
+static const char __pyx_k_ServicerContext[] = "_ServicerContext";
+static const char __pyx_k_add_secure_port[] = "add_secure_port";
+static const char __pyx_k_after_in_parent[] = "after_in_parent";
+static const char __pyx_k_already_invoked[] = "already_invoked";
+static const char __pyx_k_c_error_details[] = "c_error_details";
+static const char __pyx_k_close_on_fork_2[] = "close_on_fork";
+static const char __pyx_k_completion_type[] = "completion_type";
+static const char __pyx_k_failure_handler[] = "failure_handler";
+static const char __pyx_k_generic_handler[] = "generic_handler";
+static const char __pyx_k_integrated_call[] = "integrated_call";
+static const char __pyx_k_metadata_plugin[] = "metadata_plugin";
+static const char __pyx_k_next_call_event[] = "next_call_event";
+static const char __pyx_k_peer_identities[] = "peer_identities";
+static const char __pyx_k_py_auth_context[] = "py_auth_context";
+static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError";
+static const char __pyx_k_receive_message[] = "_receive_message";
+static const char __pyx_k_request_message[] = "request_message";
+static const char __pyx_k_run_in_executor[] = "run_in_executor";
+static const char __pyx_k_run_interceptor[] = "_run_interceptor";
+static const char __pyx_k_segregated_call[] = "segregated_call";
+static const char __pyx_k_send_message_op[] = "send_message_op";
+static const char __pyx_k_set_compression[] = "set_compression";
+static const char __pyx_k_set_credentials[] = "set_credentials";
+static const char __pyx_k_setstate_cython[] = "__setstate_cython__";
+static const char __pyx_k_spawn_greenlets[] = "spawn_greenlets";
+static const char __pyx_k_start_server_id[] = "start_server_id";
+static const char __pyx_k_start_socket_id[] = "start_socket_id";
+static const char __pyx_k_tracing_enabled[] = "tracing_enabled";
+static const char __pyx_k_unauthenticated[] = "unauthenticated";
+static const char __pyx_k_AioChannel_close[] = "AioChannel.close";
+static const char __pyx_k_CompressionLevel[] = "CompressionLevel";
+static const char __pyx_k_Expected_str_not[] = "Expected str, not {}";
+static const char __pyx_k_ForkState___init[] = "_ForkState.__init__";
+static const char __pyx_k_Method_not_found[] = "Method not found!";
+static const char __pyx_k_RequestCallError[] = "_RequestCallError";
+static const char __pyx_k_RequestCallEvent[] = "RequestCallEvent";
+static const char __pyx_k_address_c_string[] = "address_c_string";
+static const char __pyx_k_already_accepted[] = "already_accepted";
+static const char __pyx_k_already_finished[] = "already_finished";
+static const char __pyx_k_batch_operations[] = "batch_operations";
+static const char __pyx_k_c_pem_root_certs[] = "c_pem_root_certs";
+static const char __pyx_k_call_credentials[] = "call_credentials";
+static const char __pyx_k_callback_wrapper[] = "callback_wrapper";
+static const char __pyx_k_cancel_all_calls[] = "cancel_all_calls";
+static const char __pyx_k_dump_xds_configs[] = "dump_xds_configs";
+static const char __pyx_k_enable_algorithm[] = "enable_algorithm";
+static const char __pyx_k_fork_in_progress[] = "fork_in_progress";
+static const char __pyx_k_format_exception[] = "format_exception";
+static const char __pyx_k_generic_handlers[] = "generic_handlers";
+static const char __pyx_k_get_running_loop[] = "get_running_loop";
+static const char __pyx_k_get_working_loop[] = "get_working_loop";
+static const char __pyx_k_handle_callbacks[] = "handle_callbacks";
+static const char __pyx_k_init_grpc_gevent[] = "init_grpc_gevent";
+static const char __pyx_k_initial_metadata[] = "initial_metadata";
+static const char __pyx_k_invalid_argument[] = "invalid_argument";
+static const char __pyx_k_invalid_metadata[] = "invalid_metadata";
+static const char __pyx_k_is_async_handler[] = "_is_async_handler";
+static const char __pyx_k_latent_event_arg[] = "latent_event_arg";
+static const char __pyx_k_received_message[] = "received_message";
+static const char __pyx_k_register_at_fork[] = "register_at_fork";
+static const char __pyx_k_request_call_tag[] = "request_call_tag";
+static const char __pyx_k_request_iterator[] = "request_iterator";
+static const char __pyx_k_response_message[] = "response_message";
+static const char __pyx_k_run_with_context[] = "_run_with_context";
+static const char __pyx_k_server_main_loop[] = "_server_main_loop";
+static const char __pyx_k_service_accounts[] = "service_accounts";
+static const char __pyx_k_servicer_context[] = "servicer_context";
+static const char __pyx_k_start_channel_id[] = "start_channel_id";
+static const char __pyx_k_ActiveThreadCount[] = "_ActiveThreadCount";
+static const char __pyx_k_AioCall_cancelled[] = "_AioCall.cancelled";
+static const char __pyx_k_AioChannel_closed[] = "AioChannel.closed";
+static const char __pyx_k_AioRpcStatus_code[] = "AioRpcStatus.code";
+static const char __pyx_k_BatchOperationTag[] = "_BatchOperationTag";
+static const char __pyx_k_CUSTOM_IO_MANAGER[] = "CUSTOM_IO_MANAGER";
+static const char __pyx_k_Call__start_batch[] = "Call._start_batch";
+static const char __pyx_k_Channel_is_closed[] = "Channel is closed.";
+static const char __pyx_k_ConnectivityEvent[] = "ConnectivityEvent";
+static const char __pyx_k_ConnectivityState[] = "ConnectivityState";
+static const char __pyx_k_ExecuteBatchError[] = "ExecuteBatchError";
+static const char __pyx_k_ForkManagedThread[] = "ForkManagedThread";
+static const char __pyx_k_KeyboardInterrupt[] = "KeyboardInterrupt";
+static const char __pyx_k_ServerCredentials[] = "ServerCredentials";
+static const char __pyx_k_ServerShutdownTag[] = "_ServerShutdownTag";
+static const char __pyx_k_SslPemKeyCertPair[] = "SslPemKeyCertPair";
+static const char __pyx_k_abort_with_status[] = "abort_with_status";
+static const char __pyx_k_add_done_callback[] = "add_done_callback";
+static const char __pyx_k_add_insecure_port[] = "add_insecure_port";
+static const char __pyx_k_certificate_chain[] = "certificate_chain";
+static const char __pyx_k_custom_io_manager[] = "custom_io_manager";
+static const char __pyx_k_deadline_exceeded[] = "deadline_exceeded";
+static const char __pyx_k_default_authority[] = "default_authority";
+static const char __pyx_k_disable_algorithm[] = "disable_algorithm";
+static const char __pyx_k_force_client_auth[] = "force_client_auth";
+static const char __pyx_k_grpc_call_wrapper[] = "grpc_call_wrapper";
+static const char __pyx_k_handle_exceptions[] = "_handle_exceptions";
+static const char __pyx_k_intercept_service[] = "intercept_service";
+static const char __pyx_k_peer_identity_key[] = "peer_identity_key";
+static const char __pyx_k_permission_denied[] = "permission_denied";
+static const char __pyx_k_pyx_unpickle__Tag[] = "__pyx_unpickle__Tag";
+static const char __pyx_k_receive_message_2[] = "receive_message";
+static const char __pyx_k_request_streaming[] = "request_streaming";
+static const char __pyx_k_schedule_rpc_coro[] = "_schedule_rpc_coro";
+static const char __pyx_k_shutdown_grpc_aio[] = "shutdown_grpc_aio";
+static const char __pyx_k_ssl_session_cache[] = "ssl_session_cache";
+static const char __pyx_k_trailing_metadata[] = "trailing_metadata";
+static const char __pyx_k_transient_failure[] = "transient_failure";
+static const char __pyx_k_uninstall_context[] = "uninstall_context";
+static const char __pyx_k_AioChannel_closing[] = "AioChannel.closing";
+static const char __pyx_k_AioServer_shutdown[] = "AioServer.shutdown";
+static const char __pyx_k_ChannelCredentials[] = "ChannelCredentials";
+static const char __pyx_k_CompressionOptions[] = "CompressionOptions";
+static const char __pyx_k_DeprecationWarning[] = "DeprecationWarning";
+static const char __pyx_k_HandlerCallDetails[] = "_HandlerCallDetails";
+static const char __pyx_k_SSLSessionCacheLRU[] = "SSLSessionCacheLRU";
+static const char __pyx_k_ServerStoppedError[] = "_ServerStoppedError";
+static const char __pyx_k_UnicodeDecodeError[] = "UnicodeDecodeError";
+static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines";
+static const char __pyx_k_await_zero_threads[] = "await_zero_threads";
+static const char __pyx_k_c_call_credentials[] = "c_call_credentials";
+static const char __pyx_k_call_credentialses[] = "call_credentialses";
+static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
+static const char __pyx_k_core_function_name[] = "core_function_name";
+static const char __pyx_k_debug_error_string[] = "debug_error_string";
+static const char __pyx_k_delete_call_tracer[] = "delete_call_tracer";
+static const char __pyx_k_g_gevent_activated[] = "g_gevent_activated";
+static const char __pyx_k_isasyncgenfunction[] = "isasyncgenfunction";
+static const char __pyx_k_local_connect_type[] = "local_connect_type";
+static const char __pyx_k_num_active_threads[] = "_num_active_threads";
+static const char __pyx_k_operation_complete[] = "operation_complete";
+static const char __pyx_k_pem_key_cert_pairs[] = "pem_key_cert_pairs";
+static const char __pyx_k_queue_must_be_live[] = "queue must be live";
+static const char __pyx_k_receive_message_op[] = "receive_message_op";
+static const char __pyx_k_resource_exhausted[] = "resource_exhausted";
+static const char __pyx_k_response_streaming[] = "response_streaming";
+static const char __pyx_k_save_trace_context[] = "save_trace_context";
+static const char __pyx_k_send_receive_close[] = "send_receive_close";
+static const char __pyx_k_server_call_tracer[] = "server_call_tracer";
+static const char __pyx_k_server_credentials[] = "server_credentials";
+static const char __pyx_k_set_internal_error[] = "set_internal_error";
+static const char __pyx_k_start_client_batch[] = "start_client_batch";
+static const char __pyx_k_start_server_batch[] = "start_server_batch";
+static const char __pyx_k_AioCall_unary_unary[] = "_AioCall.unary_unary";
+static const char __pyx_k_BaseCompletionQueue[] = "BaseCompletionQueue";
+static const char __pyx_k_BatchOperationEvent[] = "BatchOperationEvent";
+static const char __pyx_k_Cannot_invoke_RPC_s[] = "Cannot invoke RPC: %s";
+static const char __pyx_k_GRPC_ASYNCIO_ENGINE[] = "GRPC_ASYNCIO_ENGINE";
+static const char __pyx_k_LocalConnectionType[] = "LocalConnectionType";
+static const char __pyx_k_NotImplementedError[] = "NotImplementedError";
+static const char __pyx_k_SERVICES_TO_EXCLUDE[] = "_SERVICES_TO_EXCLUDE";
+static const char __pyx_k_ServerShutdownEvent[] = "ServerShutdownEvent";
+static const char __pyx_k_Server_request_call[] = "Server.request_call";
+static const char __pyx_k_SyncServicerContext[] = "_SyncServicerContext";
+static const char __pyx_k_Tag___reduce_cython[] = "_Tag.__reduce_cython__";
+static const char __pyx_k_active_thread_count[] = "active_thread_count";
+static const char __pyx_k_async_callback_func[] = "async_callback_func";
+static const char __pyx_k_batch_operation_tag[] = "batch_operation_tag";
+static const char __pyx_k_cert_config_fetcher[] = "cert_config_fetcher";
+static const char __pyx_k_channel_credentials[] = "channel_credentials";
+static const char __pyx_k_channelz_get_server[] = "channelz_get_server";
+static const char __pyx_k_channelz_get_socket[] = "channelz_get_socket";
+static const char __pyx_k_custom_op_on_c_call[] = "_custom_op_on_c_call";
+static const char __pyx_k_failed_precondition[] = "failed_precondition";
+static const char __pyx_k_find_method_handler[] = "_find_method_handler";
+static const char __pyx_k_fork_handler_failed[] = "_fork_handler_failed";
+static const char __pyx_k_g_gevent_threadpool[] = "g_gevent_threadpool";
+static const char __pyx_k_initial_cert_config[] = "initial_cert_config";
+static const char __pyx_k_initial_metadata_op[] = "initial_metadata_op";
+static const char __pyx_k_invocation_metadata[] = "invocation_metadata";
+static const char __pyx_k_iscoroutinefunction[] = "iscoroutinefunction";
+static const char __pyx_k_last_observed_state[] = "last_observed_state";
+static const char __pyx_k_response_serializer[] = "response_serializer";
+static const char __pyx_k_run_spawn_greenlets[] = "run_spawn_greenlets";
+static const char __pyx_k_start_shutting_down[] = "_start_shutting_down";
+static const char __pyx_k_too_many_operations[] = "too_many_operations";
+static const char __pyx_k_Abort_already_called[] = "Abort already called!";
+static const char __pyx_k_AioCall_stream_unary[] = "_AioCall.stream_unary";
+static const char __pyx_k_AioRpcStatus_details[] = "AioRpcStatus.details";
+static const char __pyx_k_AioServer_is_running[] = "AioServer.is_running";
+static const char __pyx_k_BoundEventLoop_close[] = "_BoundEventLoop.close";
+static const char __pyx_k_Call___reduce_cython[] = "Call.__reduce_cython__";
+static const char __pyx_k_Call_set_credentials[] = "Call.set_credentials";
+static const char __pyx_k_CompletionQueue_poll[] = "CompletionQueue.poll";
+static const char __pyx_k_CompressionAlgorithm[] = "CompressionAlgorithm";
+static const char __pyx_k_ConcurrentRpcLimiter[] = "_ConcurrentRpcLimiter";
+static const char __pyx_k_InitialMetadataFlags[] = "InitialMetadataFlags";
+static const char __pyx_k_PropagationConstants[] = "PropagationConstants";
+static const char __pyx_k_RPC_already_finished[] = "RPC already finished.";
+static const char __pyx_k_SendMessageOperation[] = "SendMessageOperation";
+static const char __pyx_k_ServicerContext_code[] = "_ServicerContext.code";
+static const char __pyx_k_ServicerContext_done[] = "_ServicerContext.done";
+static const char __pyx_k_ServicerContext_peer[] = "_ServicerContext.peer";
+static const char __pyx_k_ServicerContext_read[] = "_ServicerContext.read";
+static const char __pyx_k_TYPE_METADATA_STRING[] = "TYPE_METADATA_STRING";
+static const char __pyx_k_build_census_context[] = "build_census_context";
+static const char __pyx_k_call_soon_threadsafe[] = "call_soon_threadsafe";
+static const char __pyx_k_channelz_get_channel[] = "channelz_get_channel";
+static const char __pyx_k_channelz_get_servers[] = "channelz_get_servers";
+static const char __pyx_k_concurrency_exceeded[] = "concurrency_exceeded";
+static const char __pyx_k_fallback_credentials[] = "fallback_credentials";
+static const char __pyx_k_generic_rpc_handlers[] = "generic_rpc_handlers";
+static const char __pyx_k_handler_call_details[] = "handler_call_details";
+static const char __pyx_k_is_algorithm_enabled[] = "is_algorithm_enabled";
+static const char __pyx_k_is_locally_cancelled[] = "is_locally_cancelled";
+static const char __pyx_k_observability_plugin[] = "observability_plugin";
+static const char __pyx_k_request_deserializer[] = "request_deserializer";
+static const char __pyx_k_reset_postfork_child[] = "reset_postfork_child";
+static const char __pyx_k_shutting_down_server[] = "shutting_down_server";
+static const char __pyx_k_spawn_callback_async[] = "_spawn_callback_async";
+static const char __pyx_k_wait_for_termination[] = "wait_for_termination";
+static const char __pyx_k_Channel_close_on_fork[] = "Channel.close_on_fork";
+static const char __pyx_k_CompletionQueue_clear[] = "CompletionQueue.clear";
+static const char __pyx_k_IntegratedCall_cancel[] = "IntegratedCall.cancel";
+static const char __pyx_k_Invalid_encoding_on_s[] = "Invalid encoding on %s";
+static const char __pyx_k_PollerCompletionQueue[] = "PollerCompletionQueue";
+static const char __pyx_k_SSLChannelCredentials[] = "SSLChannelCredentials";
+static const char __pyx_k_SegregatedCall_cancel[] = "SegregatedCall.cancel";
+static const char __pyx_k_Server_add_http2_port[] = "Server.add_http2_port";
+static const char __pyx_k_ServicerContext_abort[] = "_ServicerContext.abort";
+static const char __pyx_k_ServicerContext_write[] = "_ServicerContext.write";
+static const char __pyx_k_Tag___setstate_cython[] = "_Tag.__setstate_cython__";
+static const char __pyx_k_Using_s_as_I_O_engine[] = "Using %s as I/O engine";
+static const char __pyx_k_XDSChannelCredentials[] = "XDSChannelCredentials";
+static const char __pyx_k_contextvars_supported[] = "_contextvars_supported";
+static const char __pyx_k_credentials_roots_pem[] = "_credentials/roots.pem";
+static const char __pyx_k_fork_register_channel[] = "fork_register_channel";
+static const char __pyx_k_get_event_loop_policy[] = "get_event_loop_policy";
+static const char __pyx_k_grpc_shutdown_wrapper[] = "_grpc_shutdown_wrapper";
+static const char __pyx_k_initiate_unary_stream[] = "initiate_unary_stream";
+static const char __pyx_k_observability_enabled[] = "observability_enabled";
+static const char __pyx_k_operationses_and_tags[] = "operationses_and_tags";
+static const char __pyx_k_pem_root_certificates[] = "pem_root_certificates";
+static const char __pyx_k_send_initial_metadata[] = "_send_initial_metadata";
+static const char __pyx_k_set_trailing_metadata[] = "set_trailing_metadata";
+static const char __pyx_k_sync_servicer_context[] = "sync_servicer_context";
+static const char __pyx_k_ALTSChannelCredentials[] = "ALTSChannelCredentials";
+static const char __pyx_k_AioCall_time_remaining[] = "_AioCall.time_remaining";
+static const char __pyx_k_Call___setstate_cython[] = "Call.__setstate_cython__";
+static const char __pyx_k_CallbackFailureHandler[] = "CallbackFailureHandler";
+static const char __pyx_k_ForkManagedThread_join[] = "ForkManagedThread.join";
+static const char __pyx_k_IntegratedCall_operate[] = "IntegratedCall.operate";
+static const char __pyx_k_OK_CALL_REPRESENTATION[] = "_OK_CALL_REPRESENTATION";
+static const char __pyx_k_SegregatedCall_operate[] = "SegregatedCall.operate";
+static const char __pyx_k_Server___reduce_cython[] = "Server.__reduce_cython__";
+static const char __pyx_k_Server_already_stopped[] = "Server already stopped.";
+static const char __pyx_k_async_message_receiver[] = "_async_message_receiver";
+static const char __pyx_k_client_config_in_slice[] = "client_config_in_slice";
+static const char __pyx_k_decrease_once_finished[] = "decrease_once_finished";
+static const char __pyx_k_grpc_call_error_string[] = "grpc_call_error_string";
+static const char __pyx_k_handle_unary_unary_rpc[] = "_handle_unary_unary_rpc";
+static const char __pyx_k_initiate_stream_stream[] = "initiate_stream_stream";
+static const char __pyx_k_max_concurrent_streams[] = "max_concurrent_streams";
+static const char __pyx_k_metadata_sent_observer[] = "metadata_sent_observer";
+static const char __pyx_k_metadata_was_invalid_s[] = "metadata was invalid: %s";
+static const char __pyx_k_pyx_unpickle_AioServer[] = "__pyx_unpickle_AioServer";
+static const char __pyx_k_registered_call_handle[] = "registered_call_handle";
+static const char __pyx_k_reset_grpc_config_vars[] = "reset_grpc_config_vars";
+static const char __pyx_k_send_close_from_client[] = "send_close_from_client";
+static const char __pyx_k_server_credentials_ssl[] = "server_credentials_ssl";
+static const char __pyx_k_xds_server_credentials[] = "xds_server_credentials";
+static const char __pyx_k_AioCall___reduce_cython[] = "_AioCall.__reduce_cython__";
+static const char __pyx_k_AioServer__request_call[] = "AioServer._request_call";
+static const char __pyx_k_Call_start_client_batch[] = "Call.start_client_batch";
+static const char __pyx_k_Call_start_server_batch[] = "Call.start_server_batch";
+static const char __pyx_k_Channel___reduce_cython[] = "Channel.__reduce_cython__";
+static const char __pyx_k_Channel_integrated_call[] = "Channel.integrated_call";
+static const char __pyx_k_Channel_next_call_event[] = "Channel.next_call_event";
+static const char __pyx_k_Channel_segregated_call[] = "Channel.segregated_call";
+static const char __pyx_k_ForkManagedThread_start[] = "ForkManagedThread.start";
+static const char __pyx_k_GRPC_PROPAGATE_DEADLINE[] = "GRPC_PROPAGATE_DEADLINE";
+static const char __pyx_k_GRPC_PROPAGATE_DEFAULTS[] = "GRPC_PROPAGATE_DEFAULTS";
+static const char __pyx_k_LocalChannelCredentials[] = "LocalChannelCredentials";
+static const char __pyx_k_MessageReceiver___anext[] = "_MessageReceiver.__anext__";
+static const char __pyx_k_ReceiveMessageOperation[] = "ReceiveMessageOperation";
+static const char __pyx_k_ServerCertificateConfig[] = "ServerCertificateConfig";
+static const char __pyx_k_Server_cancel_all_calls[] = "Server.cancel_all_calls";
+static const char __pyx_k_ServicerContext_details[] = "_ServicerContext.details";
+static const char __pyx_k_WatchConnectivityFailed[] = "_WatchConnectivityFailed";
+static const char __pyx_k_channelz_get_subchannel[] = "channelz_get_subchannel";
+static const char __pyx_k_cython_call_credentials[] = "cython_call_credentials";
+static const char __pyx_k_fork_handler_registered[] = "fork_handler_registered";
+static const char __pyx_k_fork_unregister_channel[] = "fork_unregister_channel";
+static const char __pyx_k_handle_callback_wrapper[] = "_handle_callback_wrapper";
+static const char __pyx_k_handle_stream_unary_rpc[] = "_handle_stream_unary_rpc";
+static const char __pyx_k_handle_unary_stream_rpc[] = "_handle_unary_stream_rpc";
+static const char __pyx_k_is_fork_support_enabled[] = "is_fork_support_enabled";
+static const char __pyx_k_max_send_message_length[] = "max_send_message_length";
+static const char __pyx_k_maximum_concurrent_rpcs[] = "maximum_concurrent_rpcs";
+static const char __pyx_k_metadata_locals_genexpr[] = "_metadata.<locals>.genexpr";
+static const char __pyx_k_postfork_state_to_reset[] = "postfork_state_to_reset";
+static const char __pyx_k_python_call_credentials[] = "python_call_credentials";
+static const char __pyx_k_receive_close_on_server[] = "receive_close_on_server";
+static const char __pyx_k_send_initial_metadata_2[] = "send_initial_metadata";
+static const char __pyx_k_send_serialized_message[] = "send_serialized_message";
+static const char __pyx_k_send_status_from_server[] = "send_status_from_server";
+static const char __pyx_k_server_credentials_alts[] = "server_credentials_alts";
+static const char __pyx_k_set_async_callback_func[] = "set_async_callback_func";
+static const char __pyx_k_ActiveThreadCount___init[] = "_ActiveThreadCount.__init__";
+static const char __pyx_k_AioCall_initial_metadata[] = "_AioCall.initial_metadata";
+static const char __pyx_k_AioState___reduce_cython[] = "_AioState.__reduce_cython__";
+static const char __pyx_k_CompletionQueue_shutdown[] = "CompletionQueue.shutdown";
+static const char __pyx_k_CompositeCallCredentials[] = "CompositeCallCredentials";
+static const char __pyx_k_ForkManagedThread___init[] = "ForkManagedThread.__init__";
+static const char __pyx_k_GRPC_ENABLE_FORK_SUPPORT[] = "_GRPC_ENABLE_FORK_SUPPORT";
+static const char __pyx_k_IMMUTABLE_EMPTY_METADATA[] = "_IMMUTABLE_EMPTY_METADATA";
+static const char __pyx_k_Internal_error_from_Core[] = "Internal error from Core";
+static const char __pyx_k_RPCState___reduce_cython[] = "RPCState.__reduce_cython__";
+static const char __pyx_k_Server___setstate_cython[] = "Server.__setstate_cython__";
+static const char __pyx_k_ServicerContext_set_code[] = "_ServicerContext.set_code";
+static const char __pyx_k_SyncServicerContext_peer[] = "_SyncServicerContext.peer";
+static const char __pyx_k_add_generic_rpc_handlers[] = "add_generic_rpc_handlers";
+static const char __pyx_k_async_response_generator[] = "async_response_generator";
+static const char __pyx_k_channel_credentials_alts[] = "channel_credentials_alts";
+static const char __pyx_k_check_connectivity_state[] = "check_connectivity_state";
+static const char __pyx_k_grpc_server_request_call[] = "grpc_server_request_call";
+static const char __pyx_k_handle_stream_stream_rpc[] = "_handle_stream_stream_rpc";
+static const char __pyx_k_postfork_states_to_reset[] = "postfork_states_to_reset";
+static const char __pyx_k_receive_initial_metadata[] = "_receive_initial_metadata";
+static const char __pyx_k_receive_status_on_client[] = "receive_status_on_client";
+static const char __pyx_k_run_coroutine_threadsafe[] = "run_coroutine_threadsafe";
+static const char __pyx_k_schedule_coro_threadsafe[] = "schedule_coro_threadsafe";
+static const char __pyx_k_send_initial_metadata_op[] = "send_initial_metadata_op";
+static const char __pyx_k_server_credentials_local[] = "server_credentials_local";
+static const char __pyx_k_spawn_callback_in_thread[] = "_spawn_callback_in_thread";
+static const char __pyx_k_ssl_target_name_override[] = "ssl_target_name_override";
+static const char __pyx_k_watch_connectivity_state[] = "watch_connectivity_state";
+static const char __pyx_k_AioCall___setstate_cython[] = "_AioCall.__setstate_cython__";
+static const char __pyx_k_AioCall_add_done_callback[] = "_AioCall.add_done_callback";
+static const char __pyx_k_AioServer___reduce_cython[] = "AioServer.__reduce_cython__";
+static const char __pyx_k_AioServer_add_secure_port[] = "AioServer.add_secure_port";
+static const char __pyx_k_CallState___reduce_cython[] = "_CallState.__reduce_cython__";
+static const char __pyx_k_Call__custom_op_on_c_call[] = "Call._custom_op_on_c_call";
+static const char __pyx_k_Channel___setstate_cython[] = "Channel.__setstate_cython__";
+static const char __pyx_k_Non_thread_safe_operation[] = "Non-thread-safe operation";
+static const char __pyx_k_Operation___reduce_cython[] = "Operation.__reduce_cython__";
+static const char __pyx_k_SegregatedCall_next_event[] = "SegregatedCall.next_event";
+static const char __pyx_k_SendMessageOperation_type[] = "SendMessageOperation.type";
+static const char __pyx_k_Server_not_in_ready_state[] = "Server not in ready state";
+static const char __pyx_k_ServicerContext_cancelled[] = "_ServicerContext.cancelled";
+static const char __pyx_k_SyncServicerContext_abort[] = "_SyncServicerContext.abort";
+static const char __pyx_k_Unsupported_engine_type_s[] = "Unsupported engine type [%s]";
+static const char __pyx_k_block_if_fork_in_progress[] = "block_if_fork_in_progress";
+static const char __pyx_k_certificate_configuration[] = "_certificate_configuration";
+static const char __pyx_k_channel_credentials_local[] = "channel_credentials_local";
+static const char __pyx_k_channelz_get_top_channels[] = "channelz_get_top_channels";
+static const char __pyx_k_check_before_request_call[] = "check_before_request_call";
+static const char __pyx_k_create_client_call_tracer[] = "create_client_call_tracer";
+static const char __pyx_k_get_deadline_from_context[] = "get_deadline_from_context";
+static const char __pyx_k_outbound_initial_metadata[] = "outbound_initial_metadata";
+static const char __pyx_k_primary_user_agent_string[] = "primary_user_agent_string";
+static const char __pyx_k_register_completion_queue[] = "register_completion_queue";
+static const char __pyx_k_AioCall_send_receive_close[] = "_AioCall.send_receive_close";
+static const char __pyx_k_AioCall_set_internal_error[] = "_AioCall.set_internal_error";
+static const char __pyx_k_AioChannel___reduce_cython[] = "AioChannel.__reduce_cython__";
+static const char __pyx_k_AioState___setstate_cython[] = "_AioState.__setstate_cython__";
+static const char __pyx_k_CallHandle___reduce_cython[] = "CallHandle.__reduce_cython__";
+static const char __pyx_k_ChannelArg___reduce_cython[] = "_ChannelArg.__reduce_cython__";
+static const char __pyx_k_GRPC_ENABLE_FORK_SUPPORT_2[] = "GRPC_ENABLE_FORK_SUPPORT";
+static const char __pyx_k_InsecureChannelCredentials[] = "InsecureChannelCredentials";
+static const char __pyx_k_Internal_gRPC_call_error_d[] = "Internal gRPC call error %d. ";
+static const char __pyx_k_NON_OK_CALL_REPRESENTATION[] = "_NON_OK_CALL_REPRESENTATION";
+static const char __pyx_k_RPCState___setstate_cython[] = "RPCState.__setstate_cython__";
+static const char __pyx_k_compression_algorithm_name[] = "compression_algorithm_name";
+static const char __pyx_k_decrease_active_rpcs_count[] = "_decrease_active_rpcs_count";
+static const char __pyx_k_fork_in_progress_condition[] = "fork_in_progress_condition";
+static const char __pyx_k_get_registered_call_handle[] = "get_registered_call_handle";
+static const char __pyx_k_max_receive_message_length[] = "max_receive_message_length";
+static const char __pyx_k_pyx_unpickle_CensusContext[] = "__pyx_unpickle_CensusContext";
+static const char __pyx_k_receive_initial_metadata_2[] = "receive_initial_metadata";
+static const char __pyx_k_receive_serialized_message[] = "receive_serialized_message";
+static const char __pyx_k_serving_task_crash_handler[] = "_serving_task_crash_handler";
+static const char __pyx_k_set_census_context_on_call[] = "set_census_context_on_call";
+static const char __pyx_k_ActiveThreadCount_decrement[] = "_ActiveThreadCount.decrement";
+static const char __pyx_k_ActiveThreadCount_increment[] = "_ActiveThreadCount.increment";
+static const char __pyx_k_AioServer___setstate_cython[] = "AioServer.__setstate_cython__";
+static const char __pyx_k_AioServer__server_main_loop[] = "AioServer._server_main_loop";
+static const char __pyx_k_AioServer_add_insecure_port[] = "AioServer.add_insecure_port";
+static const char __pyx_k_CallDetails___reduce_cython[] = "CallDetails.__reduce_cython__";
+static const char __pyx_k_CallState___setstate_cython[] = "_CallState.__setstate_cython__";
+static const char __pyx_k_ChannelArgs___reduce_cython[] = "_ChannelArgs.__reduce_cython__";
+static const char __pyx_k_CompositeChannelCredentials[] = "CompositeChannelCredentials";
+static const char __pyx_k_ForkManagedThread_setDaemon[] = "ForkManagedThread.setDaemon";
+static const char __pyx_k_GRPC_PROPAGATE_CANCELLATION[] = "GRPC_PROPAGATE_CANCELLATION";
+static const char __pyx_k_Operation___setstate_cython[] = "Operation.__setstate_cython__";
+static const char __pyx_k_ServicerContext_set_details[] = "_ServicerContext.set_details";
+static const char __pyx_k_channelz_get_server_sockets[] = "channelz_get_server_sockets";
+static const char __pyx_k_fork_handlers_and_grpc_init[] = "fork_handlers_and_grpc_init";
+static const char __pyx_k_g_interrupt_check_period_ms[] = "g_interrupt_check_period_ms";
+static const char __pyx_k_handle_status_once_received[] = "_handle_status_once_received";
+static const char __pyx_k_insecure_server_credentials[] = "insecure_server_credentials";
+static const char __pyx_k_receive_initial_metadata_op[] = "receive_initial_metadata_op";
+static const char __pyx_k_receive_status_on_client_op[] = "receive_status_on_client_op";
+static const char __pyx_k_secondary_user_agent_string[] = "secondary_user_agent_string";
+static const char __pyx_k_AioCall_is_locally_cancelled[] = "_AioCall.is_locally_cancelled";
+static const char __pyx_k_AioChannel___setstate_cython[] = "AioChannel.__setstate_cython__";
+static const char __pyx_k_AioRpcStatus___reduce_cython[] = "AioRpcStatus.__reduce_cython__";
+static const char __pyx_k_CallHandle___setstate_cython[] = "CallHandle.__setstate_cython__";
+static const char __pyx_k_ChannelArg___setstate_cython[] = "_ChannelArg.__setstate_cython__";
+static const char __pyx_k_ChannelState___reduce_cython[] = "_ChannelState.__reduce_cython__";
+static const char __pyx_k_Expecting_non_ok_status_code[] = "Expecting non-ok status code.";
+static const char __pyx_k_ReceiveMessageOperation_type[] = "ReceiveMessageOperation.type";
+static const char __pyx_k_SendCloseFromClientOperation[] = "SendCloseFromClientOperation";
+static const char __pyx_k_SendInitialMetadataOperation[] = "SendInitialMetadataOperation";
+static const char __pyx_k_ServicerContext_auth_context[] = "_ServicerContext.auth_context";
+static const char __pyx_k_SyncServicerContext_set_code[] = "_SyncServicerContext.set_code";
+static const char __pyx_k_UNKNOWN_CANCELLATION_DETAILS[] = "_UNKNOWN_CANCELLATION_DETAILS";
+static const char __pyx_k_async_generator_to_generator[] = "async_generator_to_generator";
+static const char __pyx_k_channel_credentials_insecure[] = "channel_credentials_insecure";
+static const char __pyx_k_enter_user_request_generator[] = "enter_user_request_generator";
+static const char __pyx_k_fork_handler_registered_lock[] = "fork_handler_registered_lock";
+static const char __pyx_k_generator_to_async_generator[] = "generator_to_async_generator";
+static const char __pyx_k_get_metadata_locals_callback[] = "_get_metadata.<locals>.callback";
+static const char __pyx_k_next_event_locals_on_failure[] = "next_event.<locals>.on_failure";
+static const char __pyx_k_next_event_locals_on_success[] = "next_event.<locals>.on_success";
+static const char __pyx_k_run_with_context_locals__run[] = "_run_with_context.<locals>._run";
+static const char __pyx_k_shutdown_await_next_greenlet[] = "shutdown_await_next_greenlet";
+static const char __pyx_k_AWAIT_THREADS_TIMEOUT_SECONDS[] = "_AWAIT_THREADS_TIMEOUT_SECONDS";
+static const char __pyx_k_Abort_error_has_been_replaced[] = "Abort error has been replaced!";
+static const char __pyx_k_AioCall_initiate_unary_stream[] = "_AioCall.initiate_unary_stream";
+static const char __pyx_k_CallDetails___setstate_cython[] = "CallDetails.__setstate_cython__";
+static const char __pyx_k_CensusContext___reduce_cython[] = "CensusContext.__reduce_cython__";
+static const char __pyx_k_ChannelArgs___setstate_cython[] = "_ChannelArgs.__setstate_cython__";
+static const char __pyx_k_Concurrent_RPC_limit_exceeded[] = "Concurrent RPC limit exceeded!";
+static const char __pyx_k_MetadataPluginCallCredentials[] = "MetadataPluginCallCredentials";
+static const char __pyx_k_ReceiveCloseOnServerOperation[] = "ReceiveCloseOnServerOperation";
+static const char __pyx_k_SendStatusFromServerOperation[] = "SendStatusFromServerOperation";
+static const char __pyx_k_handle_cancellation_from_core[] = "_handle_cancellation_from_core";
+static const char __pyx_k_http2_initial_sequence_number[] = "http2_initial_sequence_number";
+static const char __pyx_k_send_error_status_from_server[] = "_send_error_status_from_server";
+static const char __pyx_k_server_certificate_config_ssl[] = "server_certificate_config_ssl";
+static const char __pyx_k_the_server_hasn_t_started_yet[] = "the server hasn't started yet";
+static const char __pyx_k_wait_for_ready_explicitly_set[] = "wait_for_ready_explicitly_set";
+static const char __pyx_k_AioCall_initiate_stream_stream[] = "_AioCall.initiate_stream_stream";
+static const char __pyx_k_AioRpcStatus___setstate_cython[] = "AioRpcStatus.__setstate_cython__";
+static const char __pyx_k_AioRpcStatus_trailing_metadata[] = "AioRpcStatus.trailing_metadata";
+static const char __pyx_k_AioServer__start_shutting_down[] = "AioServer._start_shutting_down";
+static const char __pyx_k_AioServer_wait_for_termination[] = "AioServer.wait_for_termination";
+static const char __pyx_k_BoundEventLoop___reduce_cython[] = "_BoundEventLoop.__reduce_cython__";
+static const char __pyx_k_Cannot_monitor_channel_state_s[] = "Cannot monitor channel state: %s";
+static const char __pyx_k_ChannelState___setstate_cython[] = "_ChannelState.__setstate_cython__";
+static const char __pyx_k_CompletionQueue__internal_poll[] = "CompletionQueue._internal_poll";
+static const char __pyx_k_ConcurrentRpcLimiter__decrease[] = "_ConcurrentRpcLimiter._decrease_active_rpcs_count";
+static const char __pyx_k_Error_in_callback_for_method_s[] = "Error in callback for method [%s]";
+static const char __pyx_k_GrpcArgWrapper___reduce_cython[] = "_GrpcArgWrapper.__reduce_cython__";
+static const char __pyx_k_IntegratedCall___reduce_cython[] = "IntegratedCall.__reduce_cython__";
+static const char __pyx_k_MessageReceiver__async_message[] = "_MessageReceiver._async_message_receiver";
+static const char __pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj[] = "__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg.<locals>.wrap";
+static const char __pyx_k_Pyx_CFunc_7_cython_6cygrpc_voi[] = "__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_.<locals>.wrap";
+static const char __pyx_k_ReceiveStatusOnClientOperation[] = "ReceiveStatusOnClientOperation";
+static const char __pyx_k_RequestCallTag___reduce_cython[] = "_RequestCallTag.__reduce_cython__";
+static const char __pyx_k_SegregatedCall___reduce_cython[] = "SegregatedCall.__reduce_cython__";
+static const char __pyx_k_ServerCertificateConfiguration[] = "ServerCertificateConfiguration";
+static const char __pyx_k_ServicerContext_time_remaining[] = "_ServicerContext.time_remaining";
+static const char __pyx_k_SyncServicerContext___setstate[] = "_SyncServicerContext.__setstate_cython__";
+static const char __pyx_k_SyncServicerContext_invocation[] = "_SyncServicerContext.invocation_metadata";
+static const char __pyx_k_dealloc___called_on_running_se[] = "__dealloc__ called on running server %s with status %d";
+static const char __pyx_k_gevent_decrement_channel_count[] = "gevent_decrement_channel_count";
+static const char __pyx_k_gevent_increment_channel_count[] = "gevent_increment_channel_count";
+static const char __pyx_k_grpc_completion_queue_shutdown[] = "grpc_completion_queue_shutdown";
+static const char __pyx_k_pyx_unpickle_ChannelCredential[] = "__pyx_unpickle_ChannelCredentials";
+static const char __pyx_k_pyx_unpickle_InsecureChannelCr[] = "__pyx_unpickle_InsecureChannelCredentials";
+static const char __pyx_k_set_server_call_tracer_factory[] = "set_server_call_tracer_factory";
+static const char __pyx_k_src_python_grpcio_grpc__cython[] = "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi";
+static const char __pyx_k_the_server_has_already_started[] = "the server has already started";
+static const char __pyx_k_ALTSChannelCredentials___reduce[] = "ALTSChannelCredentials.__reduce_cython__";
+static const char __pyx_k_Aborting_method_s_due_to_server[] = "Aborting method [%s] due to server stop.";
+static const char __pyx_k_ActiveThreadCount_await_zero_th[] = "_ActiveThreadCount.await_zero_threads";
+static const char __pyx_k_AioCall__handle_status_once_rec[] = "_AioCall._handle_status_once_received";
+static const char __pyx_k_AioCall_receive_serialized_mess[] = "_AioCall.receive_serialized_message";
+static const char __pyx_k_AioCall_send_serialized_message[] = "_AioCall.send_serialized_message";
+static const char __pyx_k_AioRpcStatus_debug_error_string[] = "AioRpcStatus.debug_error_string";
+static const char __pyx_k_BatchOperationTag___reduce_cyth[] = "_BatchOperationTag.__reduce_cython__";
+static const char __pyx_k_BatchOperationTag___setstate_cy[] = "_BatchOperationTag.__setstate_cython__";
+static const char __pyx_k_BoundEventLoop___setstate_cytho[] = "_BoundEventLoop.__setstate_cython__";
+static const char __pyx_k_COMPRESSION_METADATA_STRING_MAP[] = "_COMPRESSION_METADATA_STRING_MAPPING";
+static const char __pyx_k_CallCredentials___reduce_cython[] = "CallCredentials.__reduce_cython__";
+static const char __pyx_k_Call_credentials_are_only_valid[] = "Call credentials are only valid on secure channels";
+static const char __pyx_k_CallbackFailureHandler___reduce[] = "CallbackFailureHandler.__reduce_cython__";
+static const char __pyx_k_CallbackWrapper___reduce_cython[] = "CallbackWrapper.__reduce_cython__";
+static const char __pyx_k_CensusContext___setstate_cython[] = "CensusContext.__setstate_cython__";
+static const char __pyx_k_CompletionQueue___reduce_cython[] = "CompletionQueue.__reduce_cython__";
+static const char __pyx_k_CompressionOptions_is_algorithm[] = "CompressionOptions.is_algorithm_enabled";
+static const char __pyx_k_ComputeEngineChannelCredentials[] = "ComputeEngineChannelCredentials";
+static const char __pyx_k_ConcurrentRpcLimiter___reduce_c[] = "_ConcurrentRpcLimiter.__reduce_cython__";
+static const char __pyx_k_ConcurrentRpcLimiter___setstate[] = "_ConcurrentRpcLimiter.__setstate_cython__";
+static const char __pyx_k_ConcurrentRpcLimiter_check_befo[] = "_ConcurrentRpcLimiter.check_before_request_call";
+static const char __pyx_k_ConcurrentRpcLimiter_decrease_o[] = "_ConcurrentRpcLimiter.decrease_once_finished";
+static const char __pyx_k_ConnectivityTag___reduce_cython[] = "_ConnectivityTag.__reduce_cython__";
+static const char __pyx_k_ConnectivityTag___setstate_cyth[] = "_ConnectivityTag.__setstate_cython__";
+static const char __pyx_k_Failed_to_get_the_server_please[] = "Failed to get the server, please ensure your server_id==%s is valid";
+static const char __pyx_k_Failed_to_get_the_socket_please[] = "Failed to get the socket, please ensure your socket_id==%s is valid";
+static const char __pyx_k_GrpcArgWrapper___setstate_cytho[] = "_GrpcArgWrapper.__setstate_cython__";
+static const char __pyx_k_HandlerCallDetails___reduce_cyt[] = "_HandlerCallDetails.__reduce_cython__";
+static const char __pyx_k_HandlerCallDetails___setstate_c[] = "_HandlerCallDetails.__setstate_cython__";
+static const char __pyx_k_INTERNAL_CALL_ERROR_MESSAGE_FOR[] = "_INTERNAL_CALL_ERROR_MESSAGE_FORMAT";
+static const char __pyx_k_MessageReceiver___reduce_cython[] = "_MessageReceiver.__reduce_cython__";
+static const char __pyx_k_MessageReceiver___setstate_cyth[] = "_MessageReceiver.__setstate_cython__";
+static const char __pyx_k_MetadataPluginCallCredentials_2[] = "MetadataPluginCallCredentials.__reduce_cython__";
+static const char __pyx_k_MetadataPluginCallCredentials_3[] = "MetadataPluginCallCredentials.__setstate_cython__";
+static const char __pyx_k_No_custom_hooks_are_implemented[] = "No custom hooks are implemented";
+static const char __pyx_k_PollerCompletionQueue_bind_loop[] = "PollerCompletionQueue.bind_loop";
+static const char __pyx_k_Raised_if_the_server_is_stopped[] = "Raised if the server is stopped.";
+static const char __pyx_k_Raised_when_the_usage_of_API_by[] = "Raised when the usage of API by applications is inappropriate.\n\n    For example, trying to invoke RPC on a closed channel, mixing two styles\n    of streaming API on the client side. This exception should not be\n    suppressed.\n    ";
+static const char __pyx_k_ReceiveCloseOnServerOperation_2[] = "ReceiveCloseOnServerOperation.__reduce_cython__";
+static const char __pyx_k_ReceiveCloseOnServerOperation_3[] = "ReceiveCloseOnServerOperation.__setstate_cython__";
+static const char __pyx_k_ReceiveInitialMetadataOperation[] = "ReceiveInitialMetadataOperation";
+static const char __pyx_k_ReceiveMessageOperation_message[] = "ReceiveMessageOperation.message";
+static const char __pyx_k_RequestCallTag___setstate_cytho[] = "_RequestCallTag.__setstate_cython__";
+static const char __pyx_k_SendMessageOperation___setstate[] = "SendMessageOperation.__setstate_cython__";
+static const char __pyx_k_SendStatusFromServerOperation_2[] = "SendStatusFromServerOperation.__reduce_cython__";
+static const char __pyx_k_SendStatusFromServerOperation_3[] = "SendStatusFromServerOperation.__setstate_cython__";
+static const char __pyx_k_ServerShutdownTag___reduce_cyth[] = "_ServerShutdownTag.__reduce_cython__";
+static const char __pyx_k_ServerShutdownTag___setstate_cy[] = "_ServerShutdownTag.__setstate_cython__";
+static const char __pyx_k_ServicerContext___reduce_cython[] = "_ServicerContext.__reduce_cython__";
+static const char __pyx_k_ServicerContext___setstate_cyth[] = "_ServicerContext.__setstate_cython__";
+static const char __pyx_k_ServicerContext_abort_with_stat[] = "_ServicerContext.abort_with_status";
+static const char __pyx_k_ServicerContext_add_done_callba[] = "_ServicerContext.add_done_callback";
+static const char __pyx_k_ServicerContext_disable_next_me[] = "_ServicerContext.disable_next_message_compression";
+static const char __pyx_k_ServicerContext_invocation_meta[] = "_ServicerContext.invocation_metadata";
+static const char __pyx_k_ServicerContext_peer_identities[] = "_ServicerContext.peer_identities";
+static const char __pyx_k_ServicerContext_peer_identity_k[] = "_ServicerContext.peer_identity_key";
+static const char __pyx_k_ServicerContext_send_initial_me[] = "_ServicerContext.send_initial_metadata";
+static const char __pyx_k_ServicerContext_set_compression[] = "_ServicerContext.set_compression";
+static const char __pyx_k_ServicerContext_set_trailing_me[] = "_ServicerContext.set_trailing_metadata";
+static const char __pyx_k_ServicerContext_trailing_metada[] = "_ServicerContext.trailing_metadata";
+static const char __pyx_k_SyncServicerContext___reduce_cy[] = "_SyncServicerContext.__reduce_cython__";
+static const char __pyx_k_SyncServicerContext_add_callbac[] = "_SyncServicerContext.add_callback";
+static const char __pyx_k_SyncServicerContext_auth_contex[] = "_SyncServicerContext.auth_context";
+static const char __pyx_k_SyncServicerContext_disable_nex[] = "_SyncServicerContext.disable_next_message_compression";
+static const char __pyx_k_SyncServicerContext_peer_identi[] = "_SyncServicerContext.peer_identities";
+static const char __pyx_k_SyncServicerContext_send_initia[] = "_SyncServicerContext.send_initial_metadata";
+static const char __pyx_k_SyncServicerContext_set_compres[] = "_SyncServicerContext.set_compression";
+static const char __pyx_k_SyncServicerContext_set_details[] = "_SyncServicerContext.set_details";
+static const char __pyx_k_SyncServicerContext_set_trailin[] = "_SyncServicerContext.set_trailing_metadata";
+static const char __pyx_k_SyncServicerContext_time_remain[] = "_SyncServicerContext.time_remaining";
+static const char __pyx_k_Tuple_Tuple_str_Union_str_bytes[] = "Tuple[Tuple[str, Union[str, bytes]]...]";
+static const char __pyx_k_Unexpected_s_raised_by_servicer[] = "Unexpected [%s] raised by servicer method [%s]";
+static const char __pyx_k_add_callback_handler_locals_han[] = "_add_callback_handler.<locals>.handle_callbacks";
+static const char __pyx_k_find_method_handler_locals_quer[] = "_find_method_handler.<locals>.query_handlers";
+static const char __pyx_k_finish_handler_with_stream_resp[] = "_finish_handler_with_stream_responses";
+static const char __pyx_k_finish_handler_with_unary_respo[] = "_finish_handler_with_unary_response";
+static const char __pyx_k_grpc_server_shutdown_and_notify[] = "grpc_server_shutdown_and_notify";
+static const char __pyx_k_integrated_call_locals_on_succe[] = "_integrated_call.<locals>.on_success";
+static const char __pyx_k_maybe_save_server_trace_context[] = "maybe_save_server_trace_context";
+static const char __pyx_k_of_RPC_that_terminated_with_sta[] = "<{} of RPC that terminated with:\n\tstatus = {}\n\tdetails = \"{}\"\n>";
+static const char __pyx_k_segregated_call_locals_on_succe[] = "_segregated_call.<locals>.on_success";
+static const char __pyx_k_self__cq_cannot_be_converted_to[] = "self._cq cannot be converted to a Python object for pickling";
+static const char __pyx_k_self_arg_cannot_be_converted_to[] = "self.arg cannot be converted to a Python object for pickling";
+static const char __pyx_k_ALTSChannelCredentials___setstat[] = "ALTSChannelCredentials.__setstate_cython__";
+static const char __pyx_k_Abort_error_unexpectedly_suppres[] = "Abort error unexpectedly suppressed: %s";
+static const char __pyx_k_AioChannel_check_connectivity_st[] = "AioChannel.check_connectivity_state";
+static const char __pyx_k_AioChannel_watch_connectivity_st[] = "AioChannel.watch_connectivity_state";
+static const char __pyx_k_AioServer__serving_task_crash_ha[] = "AioServer._serving_task_crash_handler";
+static const char __pyx_k_AioServer_add_generic_rpc_handle[] = "AioServer.add_generic_rpc_handlers";
+static const char __pyx_k_BaseCompletionQueue___reduce_cyt[] = "BaseCompletionQueue.__reduce_cython__";
+static const char __pyx_k_BaseCompletionQueue___setstate_c[] = "BaseCompletionQueue.__setstate_cython__";
+static const char __pyx_k_BatchOperationEvent___reduce_cyt[] = "BatchOperationEvent.__reduce_cython__";
+static const char __pyx_k_BatchOperationEvent___setstate_c[] = "BatchOperationEvent.__setstate_cython__";
+static const char __pyx_k_Binary_metadata_key_s_expected_b[] = "Binary metadata key=\"%s\" expected bytes, got %s";
+static const char __pyx_k_CYGRPC_STATUS_CODE_TO_STATUS_COD[] = "CYGRPC_STATUS_CODE_TO_STATUS_CODE";
+static const char __pyx_k_CallCredentials___setstate_cytho[] = "CallCredentials.__setstate_cython__";
+static const char __pyx_k_Call_credentials_may_not_be_NULL[] = "Call credentials may not be NULL.";
+static const char __pyx_k_CallbackFailureHandler___setstat[] = "CallbackFailureHandler.__setstate_cython__";
+static const char __pyx_k_CallbackWrapper___setstate_cytho[] = "CallbackWrapper.__setstate_cython__";
+static const char __pyx_k_Cannot_invoke_RPC_on_closed_chan[] = "Cannot invoke RPC on closed channel!";
+static const char __pyx_k_ChannelCredentials___reduce_cyth[] = "ChannelCredentials.__reduce_cython__";
+static const char __pyx_k_ChannelCredentials___setstate_cy[] = "ChannelCredentials.__setstate_cython__";
+static const char __pyx_k_Channel_check_connectivity_state[] = "Channel.check_connectivity_state";
+static const char __pyx_k_Channel_get_registered_call_hand[] = "Channel.get_registered_call_handle";
+static const char __pyx_k_Channel_watch_connectivity_state[] = "Channel.watch_connectivity_state";
+static const char __pyx_k_CompletionQueue___setstate_cytho[] = "CompletionQueue.__setstate_cython__";
+static const char __pyx_k_CompositeCallCredentials___reduc[] = "CompositeCallCredentials.__reduce_cython__";
+static const char __pyx_k_CompositeCallCredentials___setst[] = "CompositeCallCredentials.__setstate_cython__";
+static const char __pyx_k_CompositeChannelCredentials___re[] = "CompositeChannelCredentials.__reduce_cython__";
+static const char __pyx_k_CompositeChannelCredentials___se[] = "CompositeChannelCredentials.__setstate_cython__";
+static const char __pyx_k_CompressionOptions___reduce_cyth[] = "CompressionOptions.__reduce_cython__";
+static const char __pyx_k_CompressionOptions___setstate_cy[] = "CompressionOptions.__setstate_cython__";
+static const char __pyx_k_CompressionOptions_disable_algor[] = "CompressionOptions.disable_algorithm";
+static const char __pyx_k_CompressionOptions_enable_algori[] = "CompressionOptions.enable_algorithm";
+static const char __pyx_k_CompressionOptions_to_channel_ar[] = "CompressionOptions.to_channel_arg";
+static const char __pyx_k_Compression_setting_must_be_spec[] = "Compression setting must be specified before sending initial metadata";
+static const char __pyx_k_ConnectivityEvent___reduce_cytho[] = "ConnectivityEvent.__reduce_cython__";
+static const char __pyx_k_ConnectivityEvent___setstate_cyt[] = "ConnectivityEvent.__setstate_cython__";
+static const char __pyx_k_Core_should_not_return_GRPC_QUEU[] = "Core should not return GRPC_QUEUE_TIMEOUT!";
+static const char __pyx_k_Credentials_couldn_t_have_been_s[] = "Credentials couldn't have been set: {0}";
+static const char __pyx_k_Dedicated_exception_class_for_wa[] = "Dedicated exception class for watch connectivity failed.\n\n    It might be failed due to deadline exceeded.\n    ";
+static const char __pyx_k_Error_fetching_certificate_confi[] = "Error fetching certificate config";
+static const char __pyx_k_Error_in_grpc_server_request_cal[] = "Error in grpc_server_request_call: %s";
+static const char __pyx_k_ExecuteBatchError_raised_in_core[] = "ExecuteBatchError raised in core by servicer method [%s]";
+static const char __pyx_k_Exiting_child_due_to_raised_exce[] = "Exiting child due to raised exception";
+static const char __pyx_k_Expected_bytes_str_or_unicode_no[] = "Expected bytes, str, or unicode, not {}";
+static const char __pyx_k_Expected_int_bytes_or_behavior_g[] = "Expected int, bytes, or behavior, got {}";
+static const char __pyx_k_Failed_grpc_call_start_batch_wit[] = "Failed grpc_call_start_batch: {} with grpc_call_error value: '{}'";
+static const char __pyx_k_Failed_sending_error_status_from[] = "Failed sending error status from server";
+static const char __pyx_k_Failed_to_get_server_sockets_ple[] = "Failed to get server sockets, please ensure your server_id==%s and start_socket_id==%s and max_results==%s is valid";
+static const char __pyx_k_Failed_to_get_servers_please_ens[] = "Failed to get servers, please ensure your start_server_id==%s is valid";
+static const char __pyx_k_Failed_to_get_the_channel_please[] = "Failed to get the channel, please ensure your channel_id==%s is valid";
+static const char __pyx_k_Failed_to_get_the_subchannel_ple[] = "Failed to get the subchannel, please ensure your subchannel_id==%s is valid";
+static const char __pyx_k_Failed_to_get_top_channels_pleas[] = "Failed to get top channels, please ensure your start_channel_id==%s is valid";
+static const char __pyx_k_Failed_to_receive_any_message_fr[] = "Failed to receive any message from Core";
+static const char __pyx_k_Failed_to_shutdown_gRPC_Core_aft[] = "Failed to shutdown gRPC Core after fork()";
+static const char __pyx_k_Failed_to_shutdown_gRPC_Python_t[] = "Failed to shutdown gRPC Python threads prior to fork. Behavior after fork will be undefined.";
+static const char __pyx_k_ForkManagedThread___init___local[] = "ForkManagedThread.__init__.<locals>.managed_target";
+static const char __pyx_k_GRPC_COMPRESSION_CHANNEL_DEFAULT[] = "GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM";
+static const char __pyx_k_GRPC_COMPRESSION_REQUEST_ALGORIT[] = "GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY";
+static const char __pyx_k_GRPC_PROPAGATE_CENSUS_STATS_CONT[] = "GRPC_PROPAGATE_CENSUS_STATS_CONTEXT";
+static const char __pyx_k_GRPC_PROPAGATE_CENSUS_TRACING_CO[] = "GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT";
+static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())";
+static const char __pyx_k_InsecureChannelCredentials___red[] = "InsecureChannelCredentials.__reduce_cython__";
+static const char __pyx_k_InsecureChannelCredentials___set[] = "InsecureChannelCredentials.__setstate_cython__";
+static const char __pyx_k_IntegratedCall___setstate_cython[] = "IntegratedCall.__setstate_cython__";
+static const char __pyx_k_Invalid_trailing_metadata_type_e[] = "Invalid trailing metadata type, expected ";
+static const char __pyx_k_LocalChannelCredentials___reduce[] = "LocalChannelCredentials.__reduce_cython__";
+static const char __pyx_k_LocalChannelCredentials___setsta[] = "LocalChannelCredentials.__setstate_cython__";
+static const char __pyx_k_Please_report_to_https_github_co[] = "Please report to https://github.com/grpc/grpc/issues";
+static const char __pyx_k_PollerCompletionQueue___reduce_c[] = "PollerCompletionQueue.__reduce_cython__";
+static const char __pyx_k_PollerCompletionQueue___setstate[] = "PollerCompletionQueue.__setstate_cython__";
+static const char __pyx_k_PollerCompletionQueue__handle_ev[] = "PollerCompletionQueue._handle_events";
+static const char __pyx_k_PollerCompletionQueue__poll_wrap[] = "PollerCompletionQueue._poll_wrapper";
+static const char __pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj_2[] = "__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_.<locals>.wrap";
+static const char __pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj_3[] = "__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args.<locals>.wrap";
+static const char __pyx_k_RPC_cancelled_for_servicer_metho[] = "RPC cancelled for servicer method [%s]";
+static const char __pyx_k_RPC_cancelled_for_unknown_reason[] = "RPC cancelled for unknown reason.";
+static const char __pyx_k_Raised_upon_unexpected_errors_in[] = "Raised upon unexpected errors in native code.";
+static const char __pyx_k_Raised_when_calling_abort_in_ser[] = "Raised when calling abort in servicer methods.\n\n    This exception should not be suppressed. Applications may catch it to\n    perform certain clean-up logic, and then re-raise it.\n    ";
+static const char __pyx_k_Raised_when_execute_batch_return[] = "Raised when execute batch returns a failure from Core.";
+static const char __pyx_k_ReceiveCloseOnServerOperation_ca[] = "ReceiveCloseOnServerOperation.cancelled";
+static const char __pyx_k_ReceiveCloseOnServerOperation_ty[] = "ReceiveCloseOnServerOperation.type";
+static const char __pyx_k_ReceiveMessageOperation___reduce[] = "ReceiveMessageOperation.__reduce_cython__";
+static const char __pyx_k_ReceiveMessageOperation___setsta[] = "ReceiveMessageOperation.__setstate_cython__";
+static const char __pyx_k_ReceiveStatusOnClientOperation_2[] = "ReceiveStatusOnClientOperation.__reduce_cython__";
+static const char __pyx_k_ReceiveStatusOnClientOperation_3[] = "ReceiveStatusOnClientOperation.__setstate_cython__";
+static const char __pyx_k_ReceiveStatusOnClientOperation_c[] = "ReceiveStatusOnClientOperation.code";
+static const char __pyx_k_ReceiveStatusOnClientOperation_d[] = "ReceiveStatusOnClientOperation.details";
+static const char __pyx_k_ReceiveStatusOnClientOperation_e[] = "ReceiveStatusOnClientOperation.error_string";
+static const char __pyx_k_ReceiveStatusOnClientOperation_t[] = "ReceiveStatusOnClientOperation.type";
+static const char __pyx_k_RequestCallEvent___reduce_cython[] = "RequestCallEvent.__reduce_cython__";
+static const char __pyx_k_RequestCallEvent___setstate_cyth[] = "RequestCallEvent.__setstate_cython__";
+static const char __pyx_k_SSLChannelCredentials___reduce_c[] = "SSLChannelCredentials.__reduce_cython__";
+static const char __pyx_k_SSLChannelCredentials___setstate[] = "SSLChannelCredentials.__setstate_cython__";
+static const char __pyx_k_SSLSessionCacheLRU___reduce_cyth[] = "SSLSessionCacheLRU.__reduce_cython__";
+static const char __pyx_k_SSLSessionCacheLRU___setstate_cy[] = "SSLSessionCacheLRU.__setstate_cython__";
+static const char __pyx_k_SegregatedCall___setstate_cython[] = "SegregatedCall.__setstate_cython__";
+static const char __pyx_k_SendCloseFromClientOperation___r[] = "SendCloseFromClientOperation.__reduce_cython__";
+static const char __pyx_k_SendCloseFromClientOperation___s[] = "SendCloseFromClientOperation.__setstate_cython__";
+static const char __pyx_k_SendCloseFromClientOperation_typ[] = "SendCloseFromClientOperation.type";
+static const char __pyx_k_SendInitialMetadataOperation___r[] = "SendInitialMetadataOperation.__reduce_cython__";
+static const char __pyx_k_SendInitialMetadataOperation___s[] = "SendInitialMetadataOperation.__setstate_cython__";
+static const char __pyx_k_SendInitialMetadataOperation_typ[] = "SendInitialMetadataOperation.type";
+static const char __pyx_k_SendMessageOperation___reduce_cy[] = "SendMessageOperation.__reduce_cython__";
+static const char __pyx_k_SendStatusFromServerOperation_ty[] = "SendStatusFromServerOperation.type";
+static const char __pyx_k_Send_initial_metadata_failed_alr[] = "Send initial metadata failed: already sent";
+static const char __pyx_k_ServerCertificateConfig___reduce[] = "ServerCertificateConfig.__reduce_cython__";
+static const char __pyx_k_ServerCertificateConfig___setsta[] = "ServerCertificateConfig.__setstate_cython__";
+static const char __pyx_k_ServerCredentials___reduce_cytho[] = "ServerCredentials.__reduce_cython__";
+static const char __pyx_k_ServerCredentials___setstate_cyt[] = "ServerCredentials.__setstate_cython__";
+static const char __pyx_k_ServerShutdownEvent___reduce_cyt[] = "ServerShutdownEvent.__reduce_cython__";
+static const char __pyx_k_ServerShutdownEvent___setstate_c[] = "ServerShutdownEvent.__setstate_cython__";
+static const char __pyx_k_Server_register_completion_queue[] = "Server.register_completion_queue";
+static const char __pyx_k_Server_shutdown_failed_no_comple[] = "Server shutdown failed: no completion queue.";
+static const char __pyx_k_SslPemKeyCertPair___reduce_cytho[] = "SslPemKeyCertPair.__reduce_cython__";
+static const char __pyx_k_SslPemKeyCertPair___setstate_cyt[] = "SslPemKeyCertPair.__setstate_cython__";
+static const char __pyx_k_The_base_class_for_exceptions_ge[] = "The base class for exceptions generated by gRPC AsyncIO stack.";
+static const char __pyx_k_XDSChannelCredentials___reduce_c[] = "XDSChannelCredentials.__reduce_cython__";
+static const char __pyx_k_XDSChannelCredentials___setstate[] = "XDSChannelCredentials.__setstate_cython__";
+static const char __pyx_k_cannot_register_completion_queue[] = "cannot register completion queues after start";
+static const char __pyx_k_cert_config_fetcher_must_be_call[] = "cert_config_fetcher must be callable";
+static const char __pyx_k_channel_credentials_compute_engi[] = "channel_credentials_compute_engine";
+static const char __pyx_k_clear_server_call_tracer_factory[] = "clear_server_call_tracer_factory";
+static const char __pyx_k_create_server_call_tracer_factor[] = "create_server_call_tracer_factory";
+static const char __pyx_k_disable_next_message_compression[] = "disable_next_message_compression";
+static const char __pyx_k_expected_certificate_to_be_bytes[] = "expected certificate to be bytes, got %s";
+static const char __pyx_k_expected_pem_key_cert_pairs_to_b[] = "expected pem_key_cert_pairs to be sequence of SslPemKeyCertPair";
+static const char __pyx_k_expected_registered_completion_q[] = "expected registered completion queue";
+static const char __pyx_k_generator_to_async_generator_loc[] = "generator_to_async_generator.<locals>.yield_to_queue";
+static const char __pyx_k_grpc_python__cygrpc__GrpcArgWrap[] = "grpc.python._cygrpc._GrpcArgWrapper";
+static const char __pyx_k_if_error_code_is_specified_so_mu[] = "if error_code is specified, so must details (and vice-versa)";
+static const char __pyx_k_initial_cert_config_must_be_a_gr[] = "initial_cert_config must be a grpc.ServerCertificateConfiguration";
+static const char __pyx_k_install_context_from_request_cal[] = "install_context_from_request_call_event_aio";
+static const char __pyx_k_internal_error_user_data_must_be[] = "internal error: user_data must be specified";
+static const char __pyx_k_invalid_call_object_cannot_be_us[] = "invalid call object cannot be used from Python";
+static const char __pyx_k_maximum_concurrent_rpcs_should_b[] = "maximum_concurrent_rpcs should be a postive integer";
+static const char __pyx_k_next_call_event_locals_on_succes[] = "next_call_event.<locals>.on_success";
+static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__";
+static const char __pyx_k_queue_must_be_shutting_down_to_b[] = "queue must be shutting down to be cleared";
+static const char __pyx_k_raise_if_not_valid_trailing_meta[] = "raise_if_not_valid_trailing_metadata";
+static const char __pyx_k_return_from_user_request_generat[] = "return_from_user_request_generator";
+static const char __pyx_k_self_c_argument_cannot_be_conver[] = "self.c_argument cannot be converted to a Python object for pickling";
+static const char __pyx_k_self_c_credentials_cannot_be_con[] = "self.c_credentials cannot be converted to a Python object for pickling";
+static const char __pyx_k_self_c_op_cannot_be_converted_to[] = "self.c_op cannot be converted to a Python object for pickling";
+static const char __pyx_k_server_credentials_ssl_dynamic_c[] = "server_credentials_ssl_dynamic_cert_config";
+static const char __pyx_k_server_must_be_started_and_not_s[] = "server must be started and not shutting down";
+static const char __pyx_k_server_queue_must_be_a_registere[] = "server_queue must be a registered completion queue";
+static const char __pyx_k_set_instrumentation_context_on_c[] = "set_instrumentation_context_on_call_aio";
+static const char __pyx_k_src_python_grpcio_grpc__cython_2[] = "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_3[] = "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_4[] = "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_5[] = "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_6[] = "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_7[] = "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_8[] = "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_9[] = "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi";
+static const char __pyx_k_the_server_must_be_shutting_down[] = "the server must be shutting down to cancel all calls";
+static const char __pyx_k_ComputeEngineChannelCredentials_2[] = "ComputeEngineChannelCredentials.__reduce_cython__";
+static const char __pyx_k_ComputeEngineChannelCredentials_3[] = "ComputeEngineChannelCredentials.__setstate_cython__";
+static const char __pyx_k_ReceiveInitialMetadataOperation_2[] = "ReceiveInitialMetadataOperation.type";
+static const char __pyx_k_ReceiveInitialMetadataOperation_3[] = "ReceiveInitialMetadataOperation.initial_metadata";
+static const char __pyx_k_ReceiveInitialMetadataOperation_4[] = "ReceiveInitialMetadataOperation.__reduce_cython__";
+static const char __pyx_k_ReceiveInitialMetadataOperation_5[] = "ReceiveInitialMetadataOperation.__setstate_cython__";
+static const char __pyx_k_SyncServicerContext_peer_identi_2[] = "_SyncServicerContext.peer_identity_key";
+static const char __pyx_k_of_RPC_that_terminated_with_sta_2[] = "<{} of RPC that terminated with:\n\tstatus = {}\n\tdetails = \"{}\"\n\tdebug_error_string = \"{}\"\n>";
+static const char __pyx_k_src_python_grpcio_grpc__cython_10[] = "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_11[] = "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_12[] = "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_13[] = "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_14[] = "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_15[] = "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_16[] = "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_17[] = "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_18[] = "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_19[] = "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_20[] = "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_21[] = "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_22[] = "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi";
+static const char __pyx_k_src_python_grpcio_grpc__cython_23[] = "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi";
+static const char __pyx_k_Error_fetching_certificate_confi_2[] = "Error fetching certificate configuration: certificate configuration must be of type grpc.ServerCertificateConfiguration, not %s";
+static const char __pyx_k_Incompatible_checksums_0x_x_vs_0_2[] = "Incompatible checksums (0x%x vs (0xa3b308d, 0x7117f7c, 0xa3714dd) = (_crash_exception, _generic_handlers, _interceptors, _limiter, _loop, _server, _serving_task, _shutdown_callback_wrapper, _shutdown_completed, _shutdown_lock, _status, _thread_pool))";
+static const char __pyx_k_ReceiveStatusOnClientOperation_t_2[] = "ReceiveStatusOnClientOperation.trailing_metadata";
+static const char __pyx_k_install_context_from_request_cal_2[] = "install_context_from_request_call_event";
+/* #### Code section: decls ### */
+static PyObject *__pyx_pf_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_wrap(PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *__pyx_v_latent_event_arg); /* proto */
+static PyObject *__pyx_pf_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__wrap(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_wrap(PyObject *__pyx_self, PyObject *__pyx_v_cb, PyObject *__pyx_v_args); /* proto */
+static PyObject *__pyx_pf_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__wrap(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_GrpcArgWrapper___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_GrpcArgWrapper_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_11_ChannelArg___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelArg *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_11_ChannelArg_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelArg *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_12_ChannelArgs___cinit__(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self, PyObject *__pyx_v_arguments); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_12_ChannelArgs_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12_ChannelArgs_10_arguments___get__(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12_ChannelArgs_11_references___get__(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12_ChannelArgs_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12_ChannelArgs_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_4Call___cinit__(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_2_start_batch(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag, PyObject *__pyx_v_retain_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_4start_client_batch(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_6start_server_batch(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_8cancel(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, grpc_status_code __pyx_v_error_code, PyObject *__pyx_v_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_10set_credentials(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_credentials); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_12peer(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_4Call_14__dealloc__(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_8is_valid___get__(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_16_custom_op_on_c_call(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, int __pyx_v_op); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_18__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_20__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_10_CallState___cinit__(struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10_CallState_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10_CallState_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_13_ChannelState___cinit__(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_self, PyObject *__pyx_v_target); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_13_ChannelState_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_13_ChannelState_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_10CallHandle___cinit__(struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, PyObject *__pyx_v_method); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_10CallHandle_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10CallHandle_11call_handle___get__(struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10CallHandle_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10CallHandle_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_14IntegratedCall___cinit__(struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14IntegratedCall_2operate(struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14IntegratedCall_4cancel(struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14IntegratedCall_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14IntegratedCall_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_integrated_call_on_success(PyObject *__pyx_self, PyObject *__pyx_v_started_tags); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_14SegregatedCall___cinit__(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_2operate(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_4cancel(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_10next_event_on_success(PyObject *__pyx_self, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_10next_event_2on_failure(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_6next_event(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_8__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_10__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_segregated_call_on_success(PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_started_tags); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_7Channel___cinit__(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, PyObject *__pyx_v_target, PyObject *__pyx_v_arguments, struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_channel_credentials); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_2target(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_4integrated_call(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, int __pyx_v_flags, PyObject *__pyx_v_method, PyObject *__pyx_v_host, PyObject *__pyx_v_deadline, PyObject *__pyx_v_metadata, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials, PyObject *__pyx_v_operationses_and_tags, PyObject *__pyx_v_context, PyObject *__pyx_v_registered_call_handle); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_15next_call_event_on_success(PyObject *__pyx_self, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_6next_call_event(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_8segregated_call(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, int __pyx_v_flags, PyObject *__pyx_v_method, PyObject *__pyx_v_host, PyObject *__pyx_v_deadline, PyObject *__pyx_v_metadata, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials, PyObject *__pyx_v_operationses_and_tags, PyObject *__pyx_v_context, PyObject *__pyx_v_registered_call_handle); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_10check_connectivity_state(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, int __pyx_v_try_to_connect); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_12watch_connectivity_state(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, grpc_connectivity_state __pyx_v_last_observed_state, PyObject *__pyx_v_deadline); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_14close(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_16close_on_fork(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_18get_registered_call_handle(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, PyObject *__pyx_v_method); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_20__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_22__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_channelz_get_top_channels(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_start_channel_id); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_2channelz_get_servers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_start_server_id); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4channelz_get_server(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_server_id); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6channelz_get_server_sockets(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_server_id, PyObject *__pyx_v_start_socket_id, PyObject *__pyx_v_max_results); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8channelz_get_channel(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_channel_id); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10channelz_get_subchannel(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_subchannel_id); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12channelz_get_socket(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_socket_id); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_14dump_xds_configs(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_spawn_callback_in_thread(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_cb_func, PyObject *__pyx_v_args); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18set_async_callback_func(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_callback_func); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_spawn_callback_async(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_callback, PyObject *__pyx_v_args); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CallCredentials___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CallCredentials_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_13_get_metadata_callback(PyObject *__pyx_self, PyObject *__pyx_v_metadata, grpc_status_code __pyx_v_status, PyObject *__pyx_v_error_details); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self, PyObject *__pyx_v_metadata_plugin, PyObject *__pyx_v_name); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_16_metadata_plugin___get__(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_5_name___get__(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self, PyObject *__pyx_v_call_credentialses); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_19_call_credentialses___get__(struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18ChannelCredentials___reduce_cython__(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18ChannelCredentials_2__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU___cinit__(struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self, PyObject *__pyx_v_capacity); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_2__int__(struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_4__dealloc__(struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self, PyObject *__pyx_v_pem_root_certificates, PyObject *__pyx_v_private_key, PyObject *__pyx_v_certificate_chain); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_22_pem_root_certificates___get__(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_12_private_key___get__(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_18_certificate_chain___get__(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self, PyObject *__pyx_v_call_credentialses, PyObject *__pyx_v_channel_credentials); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_19_call_credentialses___get__(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_20_channel_credentials___get__(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self, PyObject *__pyx_v_fallback_credentials); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_21_fallback_credentials___get__(struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig___cinit__(struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_self); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_17ServerCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_self); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_17ServerCredentials_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ServerCredentials_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ServerCredentials_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_22server_credentials_ssl(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pem_root_certs, PyObject *__pyx_v_pem_key_cert_pairs, int __pyx_v_force_client_auth); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_24server_certificate_config_ssl(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pem_root_certs, PyObject *__pyx_v_pem_key_cert_pairs); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_26server_credentials_ssl_dynamic_cert_config(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_initial_cert_config, PyObject *__pyx_v_cert_config_fetcher, int __pyx_v_force_client_auth); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *__pyx_v_self, grpc_local_connect_type __pyx_v_local_connect_type); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28channel_credentials_local(CYTHON_UNUSED PyObject *__pyx_self, grpc_local_connect_type __pyx_v_local_connect_type); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_26InsecureChannelCredentials___reduce_cython__(struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_26InsecureChannelCredentials_2__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30channel_credentials_insecure(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_32server_credentials_local(CYTHON_UNUSED PyObject *__pyx_self, grpc_local_connect_type __pyx_v_local_connect_type); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_34xds_server_credentials(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_fallback_credentials); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_36insecure_server_credentials(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self, PyObject *__pyx_v_service_accounts); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_38channel_credentials_alts(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_service_accounts); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_40server_credentials_alts(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_creds); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_42channel_credentials_compute_engine(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_call_creds); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_15CompletionQueue___cinit__(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, PyObject *__pyx_v_shutdown_cq); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_2_internal_poll(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, PyObject *__pyx_v_deadline); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_4poll(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, PyObject *__pyx_v_deadline); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_6shutdown(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_8clear(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_15CompletionQueue_10__dealloc__(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_12__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_14__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_17ConnectivityEvent___cinit__(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self, grpc_completion_type __pyx_v_completion_type, int __pyx_v_success, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_15completion_type___get__(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_7success___get__(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_3tag___get__(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_16RequestCallEvent___cinit__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self, grpc_completion_type __pyx_v_completion_type, int __pyx_v_success, PyObject *__pyx_v_tag, struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call, struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_call_details, PyObject *__pyx_v_invocation_metadata); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_15completion_type___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_7success___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_3tag___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_4call___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_12call_details___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_19invocation_metadata___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent___cinit__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self, grpc_completion_type __pyx_v_completion_type, int __pyx_v_success, PyObject *__pyx_v_tag, PyObject *__pyx_v_batch_operations); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_15completion_type___get__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_7success___get__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_3tag___get__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_16batch_operations___get__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent___cinit__(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self, grpc_completion_type __pyx_v_completion_type, int __pyx_v_success, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_15completion_type___get__(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_7success___get__(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_3tag___get__(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9_metadata_genexpr(PyObject *__pyx_self, size_t __pyx_genexpr_arg_0); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9Operation___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9Operation_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self, PyObject *__pyx_v_initial_metadata, PyObject *__pyx_v_flags); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_17_initial_metadata___get__(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_20SendMessageOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self, PyObject *__pyx_v_message, int __pyx_v_flags); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_8_message___get__(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self, int __pyx_v_flags); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self, PyObject *__pyx_v_trailing_metadata, PyObject *__pyx_v_code, PyObject *__pyx_v_details, int __pyx_v_flags); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_18_trailing_metadata___get__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_5_code___get__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_8_details___get__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self, PyObject *__pyx_v_flags); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_4initial_metadata(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self, PyObject *__pyx_v_flags); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_4message(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self, PyObject *__pyx_v_flags); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_4trailing_metadata(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6code(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_8details(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_10error_string(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_12__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_14__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self, PyObject *__pyx_v_flags); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_4cancelled(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_11CallDetails___cinit__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_11CallDetails_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_6method___get__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_4host___get__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_8deadline___get__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair___cinit__(struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self, PyObject *__pyx_v_private_key, PyObject *__pyx_v_certificate_chain); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_11private_key___get__(struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_17certificate_chain___get__(struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_18CompressionOptions___cinit__(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_2enable_algorithm(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self, grpc_compression_algorithm __pyx_v_algorithm); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_4disable_algorithm(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self, grpc_compression_algorithm __pyx_v_algorithm); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_6is_algorithm_enabled(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self, grpc_compression_algorithm __pyx_v_algorithm); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_8to_channel_arg(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_44compression_algorithm_name(CYTHON_UNUSED PyObject *__pyx_self, grpc_compression_algorithm __pyx_v_algorithm); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_46reset_grpc_config_vars(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_48peer_identities(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_50peer_identity_key(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_52auth_context(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_6Server___cinit__(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, PyObject *__pyx_v_arguments, int __pyx_v_xds); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_2request_call(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_call_queue, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_server_queue, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_4register_completion_queue(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_queue); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_6start(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, PyObject *__pyx_v_backup_queue); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_8add_http2_port(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, PyObject *__pyx_v_address, struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_server_credentials); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_10shutdown(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_queue, PyObject *__pyx_v_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_12cancel_all_calls(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_14destroy(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_6Server_16__dealloc__(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_18__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_20__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_Tag___reduce_cython__(struct __pyx_obj_7_cython_6cygrpc__Tag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_Tag_2__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc__Tag *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_16_ConnectivityTag___cinit__(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self, PyObject *__pyx_v_user_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_9_user_tag___get__(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_15_RequestCallTag___cinit__(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self, PyObject *__pyx_v_user_tag); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_RequestCallTag_9_user_tag___get__(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_RequestCallTag_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_RequestCallTag_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_18_BatchOperationTag___cinit__(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self, PyObject *__pyx_v_user_tag, PyObject *__pyx_v_operations, PyObject *__pyx_v_call); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_11_operations___get__(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_14_retained_call___get__(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag___cinit__(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self, PyObject *__pyx_v_user_tag, PyObject *__pyx_v_shutting_down_server); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_9_user_tag___get__(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_21_shutting_down_server___get__(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_54install_context_from_request_call_event(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_event); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_56install_context_from_request_call_event_aio(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_event); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_58uninstall_context(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_60build_census_context(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_13CensusContext___reduce_cython__(struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_13CensusContext_2__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_62set_census_context_on_call(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_census_ctx); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_64set_instrumentation_context_on_call_aio(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_call_state, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_census_ctx); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_66get_deadline_from_context(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_68set_server_call_tracer_factory(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_observability_plugin); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_70clear_server_call_tracer_factory(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_72maybe_save_server_trace_context(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_event); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_74gevent_increment_channel_count(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_76gevent_decrement_channel_count(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_78spawn_greenlets(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_80run_spawn_greenlets(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_82shutdown_await_next_greenlet(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_84init_grpc_gevent(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_86_contextvars_supported(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_88_run_with_context(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_target); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17_run_with_context__run(PyObject *__pyx_self, PyObject *__pyx_v_args); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_90_run_with_context(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_target); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17_run_with_context_2_run(PyObject *__pyx_self, PyObject *__pyx_v_args); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_92_run_with_context(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_target); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_94fork_handlers_and_grpc_init(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread_8__init___managed_target(PyObject *__pyx_self, PyObject *__pyx_v_args); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_target, PyObject *__pyx_v_args); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread_2setDaemon(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_daemonic); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread_4start(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread_6join(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_96block_if_fork_in_progress(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_postfork_state_to_reset); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_98enter_user_request_generator(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_100return_from_user_request_generator(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_102get_fork_epoch(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_104is_fork_support_enabled(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_106fork_register_channel(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_channel); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_108fork_unregister_channel(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_channel); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_2increment(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_4decrement(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_6await_zero_threads(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_timeout_secs); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10_ForkState___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF___bool__(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF_2__len__(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF_4_repr(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF_6__repr__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF_8__str__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_110schedule_coro_threadsafe(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_coro, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_112async_generator_to_generator(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_agen, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_115generator_to_async_generator(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_gen, PyObject *__pyx_v_loop, PyObject *__pyx_v_thread_pool); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_28generator_to_async_generator_yield_to_queue(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_118get_working_loop(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_120get_working_loop(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_122raise_if_not_valid_trailing_metadata(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_metadata); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_12AioRpcStatus___cinit__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, grpc_status_code __pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_trailing_metadata, PyObject *__pyx_v_debug_error_string); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_2code(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_4details(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_6trailing_metadata(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_8debug_error_string(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_5_code___get__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_8_details___get__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_18_trailing_metadata___get__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_19_debug_error_string___get__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_124_handle_callback_wrapper(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_callback_wrapper, int __pyx_v_success); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BaseCompletionQueue___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BaseCompletionQueue_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_15_BoundEventLoop___cinit__(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self, PyObject *__pyx_v_loop, PyObject *__pyx_v_read_socket, PyObject *__pyx_v_handler); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_2close(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_4loop___get__(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_11read_socket___get__(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue___cinit__(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_2bind_loop(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_4_poll_wrapper(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_6_handle_events(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self, PyObject *__pyx_v_context_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_8__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_10__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler___cinit__(struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_self, PyObject *__pyx_v_core_function_name, PyObject *__pyx_v_error_details, PyObject *__pyx_v_exception_type); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_15CallbackWrapper___cinit__(struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_self, PyObject *__pyx_v_future, PyObject *__pyx_v_loop, struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_failure_handler); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CallbackWrapper_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CallbackWrapper_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_126execute_batch(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_operations, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_129_receive_message(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_132_send_message(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_message, struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_initial_metadata_op, int __pyx_v_write_flag, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_135_send_initial_metadata(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_metadata, int __pyx_v_flags, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_138_receive_initial_metadata(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_141_send_error_status_from_server(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, grpc_status_code __pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_trailing_metadata, struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_initial_metadata_op, PyObject *__pyx_v_loop); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_9_AioState___cinit__(struct __pyx_obj_7_cython_6cygrpc__AioState *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9_AioState_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__AioState *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9_AioState_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__AioState *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_144_grpc_shutdown_wrapper(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v__); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_146init_grpc_aio(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_148shutdown_grpc_aio(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_8_AioCall___cinit__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_channel, PyObject *__pyx_v_deadline, PyObject *__pyx_v_method, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_credentials, PyObject *__pyx_v_wait_for_ready); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_8_AioCall_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_4_repr(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_6__repr__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_8__str__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_10add_done_callback(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_callback); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_12time_remaining(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_14cancel(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_16done(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_18cancelled(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_20status(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_23is_ok(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_25initial_metadata(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_28is_locally_cancelled(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_30set_internal_error(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_error_str); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_32unary_unary(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_request, PyObject *__pyx_v_outbound_initial_metadata, PyObject *__pyx_v_context); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_35_handle_status_once_received(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_38receive_serialized_message(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_41send_serialized_message(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_message); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_44send_receive_close(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_47initiate_unary_stream(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_request, PyObject *__pyx_v_outbound_initial_metadata, PyObject *__pyx_v_context); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_50stream_unary(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_outbound_initial_metadata, PyObject *__pyx_v_metadata_sent_observer, PyObject *__pyx_v_context); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_53initiate_stream_stream(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_outbound_initial_metadata, PyObject *__pyx_v_metadata_sent_observer, PyObject *__pyx_v_context); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_8_channel___get__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_7_status___get__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_17_initial_metadata___get__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_56__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_58__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_10AioChannel___cinit__(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, PyObject *__pyx_v_target, PyObject *__pyx_v_options, struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_credentials, PyObject *__pyx_v_loop); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_10AioChannel_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_4__repr__(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_6check_connectivity_state(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, int __pyx_v_try_to_connect); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_8watch_connectivity_state(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, grpc_connectivity_state __pyx_v_last_observed_state, PyObject *__pyx_v_deadline); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_11closing(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_13close(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_15closed(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_17call(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, PyObject *__pyx_v_method, PyObject *__pyx_v_deadline, PyObject *__pyx_v_python_call_credentials, PyObject *__pyx_v_wait_for_ready); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_19__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_21__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails___cinit__(struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self, PyObject *__pyx_v_method, PyObject *__pyx_v_invocation_metadata); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_6method___get__(struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_19invocation_metadata___get__(struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_8RPCState___cinit__(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_server); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_8RPCState_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8RPCState_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_8RPCState_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_16_ServicerContext___cinit__(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_request_deserializer, PyObject *__pyx_v_response_serializer, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_2read(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_5write(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_message); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_8send_initial_metadata(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_metadata); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_11abort(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_trailing_metadata); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_14abort_with_status(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_status); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_17set_trailing_metadata(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_metadata); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_19trailing_metadata(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_21invocation_metadata(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_23set_code(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_code); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_25code(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_27set_details(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_29details(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_31set_compression(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_compression); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_33disable_next_message_compression(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_35peer(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_37peer_identities(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_39peer_identity_key(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_41auth_context(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_43time_remaining(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_45add_done_callback(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_callback); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_47done(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_49cancelled(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_51__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_53__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext___cinit__(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_context); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_2abort(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_trailing_metadata); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_4send_initial_metadata(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_metadata); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_6set_trailing_metadata(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_metadata); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_8invocation_metadata(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_10set_code(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_code); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_12set_details(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_14set_compression(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_compression); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_16disable_next_message_compression(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_18add_callback(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_callback); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_20peer(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_22peer_identities(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_24peer_identity_key(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_26auth_context(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_28time_remaining(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_30__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_32__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_150_run_interceptor(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_interceptors, PyObject *__pyx_v_query_handler, PyObject *__pyx_v_handler_call_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_153_is_async_handler(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_handler); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_155_find_method_handler(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method, PyObject *__pyx_v_metadata, PyObject *__pyx_v_generic_handlers, PyObject *__pyx_v_interceptors); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_find_method_handler_query_handlers(PyObject *__pyx_self, PyObject *__pyx_v_handler_call_details); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_158_finish_handler_with_unary_response(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_unary_handler, PyObject *__pyx_v_request, struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context, PyObject *__pyx_v_response_serializer, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_161_finish_handler_with_stream_responses(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_stream_handler, PyObject *__pyx_v_request, struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_164_handle_unary_unary_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method_handler, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_167_handle_unary_stream_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method_handler, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_16_MessageReceiver___cinit__(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_2_async_message_receiver(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_5__aiter__(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_7__anext__(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_170_handle_stream_unary_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method_handler, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_173_handle_stream_stream_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method_handler, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_176_handle_exceptions(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_rpc_coro, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_add_callback_handler_handle_callbacks(PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_unused_task); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_179_handle_cancellation_from_core(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rpc_task, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_182_schedule_rpc_coro(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rpc_coro, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_185_handle_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_generic_handlers, PyObject *__pyx_v_interceptors, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop, int __pyx_v_concurrency_exceeded); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter___cinit__(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self, int __pyx_v_maximum_concurrent_rpcs); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_2check_before_request_call(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_4_decrease_active_rpcs_count(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_unused_future); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_6decrease_once_finished(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self, PyObject *__pyx_v_rpc_task); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_8__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_10__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_7_cython_6cygrpc_9AioServer___init__(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_loop, PyObject *__pyx_v_thread_pool, PyObject *__pyx_v_generic_handlers, PyObject *__pyx_v_interceptors, PyObject *__pyx_v_options, PyObject *__pyx_v_maximum_concurrent_rpcs); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_2add_generic_rpc_handlers(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_generic_rpc_handlers); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_4add_insecure_port(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_address); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_6add_secure_port(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_address, PyObject *__pyx_v_server_credentials); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_8_request_call(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_11_server_main_loop(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_server_started); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_14_serving_task_crash_handler(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_task); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_16start(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_19_start_shutting_down(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_22shutdown(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_grace); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_25wait_for_termination(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_timeout); /* proto */
+static void __pyx_pf_7_cython_6cygrpc_9AioServer_28__dealloc__(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_30is_running(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_32__reduce_cython__(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_34__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_188__pyx_unpickle_ChannelCredentials(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_190__pyx_unpickle_InsecureChannelCredentials(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_192__pyx_unpickle__Tag(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_194__pyx_unpickle_CensusContext(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_7_cython_6cygrpc_196__pyx_unpickle_AioServer(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ChannelArg(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ChannelArgs(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_Call(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__CallState(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ChannelState(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_IntegratedCall(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SegregatedCall(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_Channel(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallHandle(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_MetadataPluginCallCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CompositeCallCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SSLSessionCacheLRU(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SSLChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CompositeChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_XDSChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ServerCertificateConfig(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ServerCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_LocalChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ALTSChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__LatentEventArg(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CompletionQueue(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_BaseEvent(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ConnectivityEvent(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_RequestCallEvent(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_BatchOperationEvent(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ServerShutdownEvent(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_Operation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SendInitialMetadataOperation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SendMessageOperation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SendCloseFromClientOperation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SendStatusFromServerOperation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ReceiveInitialMetadataOperation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ReceiveMessageOperation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ReceiveStatusOnClientOperation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ReceiveCloseOnServerOperation(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallDetails(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SslPemKeyCertPair(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CompressionOptions(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_Server(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__Tag(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ConnectivityTag(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__RequestCallTag(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__BatchOperationTag(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ServerShutdownTag(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_BaseCompletionQueue(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__BoundEventLoop(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_PollerCompletionQueue(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_AioRpcStatus(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__AioState(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallbackFailureHandler(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallbackWrapper(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_GrpcCallWrapper(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__AioCall(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_AioChannel(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__HandlerCallDetails(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_RPCState(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ServicerContext(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__SyncServicerContext(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__MessageReceiver(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ConcurrentRpcLimiter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_AioServer(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__GrpcArgWrapper(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_InsecureChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ComputeEngineChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CensusContext(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_1_next_event(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_6_genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_9___init__(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_13__receive_message(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_14__send_message(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_18_status(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_29_read(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_30_write(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_32_abort(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_41___anext__(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_49__request_call(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_51_start(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_53_shutdown(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_get = {0, 0, 0, 0, 0};
+static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_keys = {0, 0, 0, 0, 0};
+static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_pop = {0, 0, 0, 0, 0};
+static __Pyx_CachedCFunction __pyx_umethod_PyDict_Type_values = {0, 0, 0, 0, 0};
+/* #### Code section: late_includes ### */
+/* #### Code section: module_state ### */
+typedef struct {
+  PyObject *__pyx_d;
+  PyObject *__pyx_b;
+  PyObject *__pyx_cython_runtime;
+  PyObject *__pyx_empty_tuple;
+  PyObject *__pyx_empty_bytes;
+  PyObject *__pyx_empty_unicode;
+  #ifdef __Pyx_CyFunction_USED
+  PyTypeObject *__pyx_CyFunctionType;
+  #endif
+  #ifdef __Pyx_FusedFunction_USED
+  PyTypeObject *__pyx_FusedFunctionType;
+  #endif
+  #ifdef __Pyx_Generator_USED
+  PyTypeObject *__pyx_GeneratorType;
+  #endif
+  #ifdef __Pyx_IterableCoroutine_USED
+  PyTypeObject *__pyx_IterableCoroutineType;
+  #endif
+  #ifdef __Pyx_Coroutine_USED
+  PyTypeObject *__pyx_CoroutineAwaitType;
+  #endif
+  #ifdef __Pyx_Coroutine_USED
+  PyTypeObject *__pyx_CoroutineType;
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  PyTypeObject *__pyx_ptype_7cpython_4type_type;
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  PyTypeObject *__pyx_ptype_7cpython_4bool_bool;
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  PyTypeObject *__pyx_ptype_7cpython_7complex_complex;
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  #endif
+  #if CYTHON_USE_MODULE_STATE
+  PyObject *__pyx_type_7_cython_6cygrpc__ChannelArg;
+  PyObject *__pyx_type_7_cython_6cygrpc__ChannelArgs;
+  PyObject *__pyx_type_7_cython_6cygrpc_Call;
+  PyObject *__pyx_type_7_cython_6cygrpc__CallState;
+  PyObject *__pyx_type_7_cython_6cygrpc__ChannelState;
+  PyObject *__pyx_type_7_cython_6cygrpc_IntegratedCall;
+  PyObject *__pyx_type_7_cython_6cygrpc_SegregatedCall;
+  PyObject *__pyx_type_7_cython_6cygrpc_Channel;
+  PyObject *__pyx_type_7_cython_6cygrpc_CallHandle;
+  PyObject *__pyx_type_7_cython_6cygrpc_CallCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_CompositeCallCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_ChannelCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU;
+  PyObject *__pyx_type_7_cython_6cygrpc_SSLChannelCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_CompositeChannelCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_XDSChannelCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_ServerCertificateConfig;
+  PyObject *__pyx_type_7_cython_6cygrpc_ServerCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_LocalChannelCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_ALTSChannelCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc__LatentEventArg;
+  PyObject *__pyx_type_7_cython_6cygrpc_CompletionQueue;
+  PyObject *__pyx_type_7_cython_6cygrpc_BaseEvent;
+  PyObject *__pyx_type_7_cython_6cygrpc_ConnectivityEvent;
+  PyObject *__pyx_type_7_cython_6cygrpc_RequestCallEvent;
+  PyObject *__pyx_type_7_cython_6cygrpc_BatchOperationEvent;
+  PyObject *__pyx_type_7_cython_6cygrpc_ServerShutdownEvent;
+  PyObject *__pyx_type_7_cython_6cygrpc_Operation;
+  PyObject *__pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation;
+  PyObject *__pyx_type_7_cython_6cygrpc_SendMessageOperation;
+  PyObject *__pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation;
+  PyObject *__pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation;
+  PyObject *__pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation;
+  PyObject *__pyx_type_7_cython_6cygrpc_ReceiveMessageOperation;
+  PyObject *__pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation;
+  PyObject *__pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation;
+  PyObject *__pyx_type_7_cython_6cygrpc_CallDetails;
+  PyObject *__pyx_type_7_cython_6cygrpc_SslPemKeyCertPair;
+  PyObject *__pyx_type_7_cython_6cygrpc_CompressionOptions;
+  PyObject *__pyx_type_7_cython_6cygrpc_Server;
+  PyObject *__pyx_type_7_cython_6cygrpc__Tag;
+  PyObject *__pyx_type_7_cython_6cygrpc__ConnectivityTag;
+  PyObject *__pyx_type_7_cython_6cygrpc__RequestCallTag;
+  PyObject *__pyx_type_7_cython_6cygrpc__BatchOperationTag;
+  PyObject *__pyx_type_7_cython_6cygrpc__ServerShutdownTag;
+  PyObject *__pyx_type_7_cython_6cygrpc_BaseCompletionQueue;
+  PyObject *__pyx_type_7_cython_6cygrpc__BoundEventLoop;
+  PyObject *__pyx_type_7_cython_6cygrpc_PollerCompletionQueue;
+  PyObject *__pyx_type_7_cython_6cygrpc_AioRpcStatus;
+  PyObject *__pyx_type_7_cython_6cygrpc__AioState;
+  PyObject *__pyx_type_7_cython_6cygrpc_CallbackFailureHandler;
+  PyObject *__pyx_type_7_cython_6cygrpc_CallbackWrapper;
+  PyObject *__pyx_type_7_cython_6cygrpc_GrpcCallWrapper;
+  PyObject *__pyx_type_7_cython_6cygrpc__AioCall;
+  PyObject *__pyx_type_7_cython_6cygrpc_AioChannel;
+  PyObject *__pyx_type_7_cython_6cygrpc__HandlerCallDetails;
+  PyObject *__pyx_type_7_cython_6cygrpc_RPCState;
+  PyObject *__pyx_type_7_cython_6cygrpc__ServicerContext;
+  PyObject *__pyx_type_7_cython_6cygrpc__SyncServicerContext;
+  PyObject *__pyx_type_7_cython_6cygrpc__MessageReceiver;
+  PyObject *__pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter;
+  PyObject *__pyx_type_7_cython_6cygrpc_AioServer;
+  PyObject *__pyx_type_7_cython_6cygrpc__GrpcArgWrapper;
+  PyObject *__pyx_type_7_cython_6cygrpc_InsecureChannelCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials;
+  PyObject *__pyx_type_7_cython_6cygrpc_CensusContext;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init__;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext__;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown;
+  PyObject *__pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination;
+  PyObject *__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg;
+  PyObject *__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_;
+  PyObject *__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args;
+  PyObject *__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_;
+  #endif
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__ChannelArg;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__ChannelArgs;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_Call;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__CallState;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__ChannelState;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_IntegratedCall;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_SegregatedCall;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_Channel;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CallHandle;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CallCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ChannelCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ServerCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__LatentEventArg;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CompletionQueue;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_BaseEvent;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_RequestCallEvent;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_Operation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_SendMessageOperation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CallDetails;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CompressionOptions;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_Server;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__Tag;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__ConnectivityTag;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__RequestCallTag;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__BatchOperationTag;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__BoundEventLoop;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_AioRpcStatus;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__AioState;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CallbackWrapper;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__AioCall;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_AioChannel;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__HandlerCallDetails;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_RPCState;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__ServicerContext;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__SyncServicerContext;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__MessageReceiver;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_AioServer;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc_CensusContext;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown;
+  PyTypeObject *__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination;
+  PyTypeObject *__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg;
+  PyTypeObject *__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_;
+  PyTypeObject *__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args;
+  PyTypeObject *__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_;
+  PyObject *__pyx_kp_s_0;
+  PyObject *__pyx_kp_s_1;
+  PyObject *__pyx_n_s_ALTSChannelCredentials;
+  PyObject *__pyx_n_s_ALTSChannelCredentials___reduce;
+  PyObject *__pyx_n_s_ALTSChannelCredentials___setstat;
+  PyObject *__pyx_n_s_AWAIT_THREADS_TIMEOUT_SECONDS;
+  PyObject *__pyx_n_s_AbortError;
+  PyObject *__pyx_kp_s_Abort_already_called;
+  PyObject *__pyx_kp_s_Abort_error_has_been_replaced;
+  PyObject *__pyx_kp_s_Abort_error_unexpectedly_suppres;
+  PyObject *__pyx_kp_s_Aborting_method_s_due_to_server;
+  PyObject *__pyx_n_s_ActiveThreadCount;
+  PyObject *__pyx_n_s_ActiveThreadCount___init;
+  PyObject *__pyx_n_s_ActiveThreadCount_await_zero_th;
+  PyObject *__pyx_n_s_ActiveThreadCount_decrement;
+  PyObject *__pyx_n_s_ActiveThreadCount_increment;
+  PyObject *__pyx_n_s_AioCall;
+  PyObject *__pyx_n_s_AioCall___reduce_cython;
+  PyObject *__pyx_n_s_AioCall___setstate_cython;
+  PyObject *__pyx_n_s_AioCall__handle_status_once_rec;
+  PyObject *__pyx_n_s_AioCall__repr;
+  PyObject *__pyx_n_s_AioCall_add_done_callback;
+  PyObject *__pyx_n_s_AioCall_cancel;
+  PyObject *__pyx_n_s_AioCall_cancelled;
+  PyObject *__pyx_n_s_AioCall_done;
+  PyObject *__pyx_n_s_AioCall_initial_metadata;
+  PyObject *__pyx_n_s_AioCall_initiate_stream_stream;
+  PyObject *__pyx_n_s_AioCall_initiate_unary_stream;
+  PyObject *__pyx_n_s_AioCall_is_locally_cancelled;
+  PyObject *__pyx_n_s_AioCall_is_ok;
+  PyObject *__pyx_n_s_AioCall_receive_serialized_mess;
+  PyObject *__pyx_n_s_AioCall_send_receive_close;
+  PyObject *__pyx_n_s_AioCall_send_serialized_message;
+  PyObject *__pyx_n_s_AioCall_set_internal_error;
+  PyObject *__pyx_n_s_AioCall_status;
+  PyObject *__pyx_n_s_AioCall_stream_unary;
+  PyObject *__pyx_n_s_AioCall_time_remaining;
+  PyObject *__pyx_n_s_AioCall_unary_unary;
+  PyObject *__pyx_n_s_AioChannel;
+  PyObject *__pyx_n_s_AioChannel___reduce_cython;
+  PyObject *__pyx_n_s_AioChannel___setstate_cython;
+  PyObject *__pyx_n_s_AioChannel_call;
+  PyObject *__pyx_n_s_AioChannel_check_connectivity_st;
+  PyObject *__pyx_n_s_AioChannel_close;
+  PyObject *__pyx_n_s_AioChannel_closed;
+  PyObject *__pyx_n_s_AioChannel_closing;
+  PyObject *__pyx_n_s_AioChannel_watch_connectivity_st;
+  PyObject *__pyx_n_s_AioRpcStatus;
+  PyObject *__pyx_n_s_AioRpcStatus___reduce_cython;
+  PyObject *__pyx_n_s_AioRpcStatus___setstate_cython;
+  PyObject *__pyx_n_s_AioRpcStatus_code;
+  PyObject *__pyx_n_s_AioRpcStatus_debug_error_string;
+  PyObject *__pyx_n_s_AioRpcStatus_details;
+  PyObject *__pyx_n_s_AioRpcStatus_trailing_metadata;
+  PyObject *__pyx_n_s_AioServer;
+  PyObject *__pyx_n_s_AioServer___reduce_cython;
+  PyObject *__pyx_n_s_AioServer___setstate_cython;
+  PyObject *__pyx_n_s_AioServer__request_call;
+  PyObject *__pyx_n_s_AioServer__server_main_loop;
+  PyObject *__pyx_n_s_AioServer__serving_task_crash_ha;
+  PyObject *__pyx_n_s_AioServer__start_shutting_down;
+  PyObject *__pyx_n_s_AioServer_add_generic_rpc_handle;
+  PyObject *__pyx_n_s_AioServer_add_insecure_port;
+  PyObject *__pyx_n_s_AioServer_add_secure_port;
+  PyObject *__pyx_n_s_AioServer_is_running;
+  PyObject *__pyx_n_s_AioServer_shutdown;
+  PyObject *__pyx_n_s_AioServer_start;
+  PyObject *__pyx_n_s_AioServer_wait_for_termination;
+  PyObject *__pyx_n_s_AioState;
+  PyObject *__pyx_n_s_AioState___reduce_cython;
+  PyObject *__pyx_n_s_AioState___setstate_cython;
+  PyObject *__pyx_n_s_AssertionError;
+  PyObject *__pyx_n_s_AsyncIOEngine;
+  PyObject *__pyx_n_s_AttributeError;
+  PyObject *__pyx_n_s_BaseCompletionQueue;
+  PyObject *__pyx_n_s_BaseCompletionQueue___reduce_cyt;
+  PyObject *__pyx_n_s_BaseCompletionQueue___setstate_c;
+  PyObject *__pyx_n_s_BaseError;
+  PyObject *__pyx_n_s_BaseEvent;
+  PyObject *__pyx_n_s_BatchOperationEvent;
+  PyObject *__pyx_n_s_BatchOperationEvent___reduce_cyt;
+  PyObject *__pyx_n_s_BatchOperationEvent___setstate_c;
+  PyObject *__pyx_n_s_BatchOperationTag;
+  PyObject *__pyx_n_s_BatchOperationTag___reduce_cyth;
+  PyObject *__pyx_n_s_BatchOperationTag___setstate_cy;
+  PyObject *__pyx_kp_s_Binary_metadata_key_s_expected_b;
+  PyObject *__pyx_n_s_BoundEventLoop;
+  PyObject *__pyx_n_s_BoundEventLoop___reduce_cython;
+  PyObject *__pyx_n_s_BoundEventLoop___setstate_cytho;
+  PyObject *__pyx_n_s_BoundEventLoop_close;
+  PyObject *__pyx_n_s_COMPRESSION_METADATA_STRING_MAP;
+  PyObject *__pyx_n_s_CUSTOM_IO_MANAGER;
+  PyObject *__pyx_n_s_CYGRPC_STATUS_CODE_TO_STATUS_COD;
+  PyObject *__pyx_n_s_Call;
+  PyObject *__pyx_n_s_CallCredentials;
+  PyObject *__pyx_n_s_CallCredentials___reduce_cython;
+  PyObject *__pyx_n_s_CallCredentials___setstate_cytho;
+  PyObject *__pyx_n_s_CallDetails;
+  PyObject *__pyx_n_s_CallDetails___reduce_cython;
+  PyObject *__pyx_n_s_CallDetails___setstate_cython;
+  PyObject *__pyx_n_s_CallError;
+  PyObject *__pyx_n_s_CallHandle;
+  PyObject *__pyx_n_s_CallHandle___reduce_cython;
+  PyObject *__pyx_n_s_CallHandle___setstate_cython;
+  PyObject *__pyx_n_s_CallState;
+  PyObject *__pyx_n_s_CallState___reduce_cython;
+  PyObject *__pyx_n_s_CallState___setstate_cython;
+  PyObject *__pyx_n_s_Call___reduce_cython;
+  PyObject *__pyx_n_s_Call___setstate_cython;
+  PyObject *__pyx_n_s_Call__custom_op_on_c_call;
+  PyObject *__pyx_n_s_Call__start_batch;
+  PyObject *__pyx_n_s_Call_cancel;
+  PyObject *__pyx_kp_s_Call_credentials_are_only_valid;
+  PyObject *__pyx_kp_s_Call_credentials_may_not_be_NULL;
+  PyObject *__pyx_n_s_Call_peer;
+  PyObject *__pyx_n_s_Call_set_credentials;
+  PyObject *__pyx_n_s_Call_start_client_batch;
+  PyObject *__pyx_n_s_Call_start_server_batch;
+  PyObject *__pyx_n_s_CallbackFailureHandler;
+  PyObject *__pyx_n_s_CallbackFailureHandler___reduce;
+  PyObject *__pyx_n_s_CallbackFailureHandler___setstat;
+  PyObject *__pyx_n_s_CallbackWrapper;
+  PyObject *__pyx_n_s_CallbackWrapper___reduce_cython;
+  PyObject *__pyx_n_s_CallbackWrapper___setstate_cytho;
+  PyObject *__pyx_n_s_CancelledError;
+  PyObject *__pyx_kp_s_Cannot_invoke_RPC_on_closed_chan;
+  PyObject *__pyx_kp_s_Cannot_invoke_RPC_s;
+  PyObject *__pyx_kp_s_Cannot_monitor_channel_state_s;
+  PyObject *__pyx_n_s_CensusContext;
+  PyObject *__pyx_n_s_CensusContext___reduce_cython;
+  PyObject *__pyx_n_s_CensusContext___setstate_cython;
+  PyObject *__pyx_n_s_Channel;
+  PyObject *__pyx_n_s_ChannelArg;
+  PyObject *__pyx_n_s_ChannelArgKey;
+  PyObject *__pyx_n_s_ChannelArg___reduce_cython;
+  PyObject *__pyx_n_s_ChannelArg___setstate_cython;
+  PyObject *__pyx_n_s_ChannelArgs;
+  PyObject *__pyx_n_s_ChannelArgs___reduce_cython;
+  PyObject *__pyx_n_s_ChannelArgs___setstate_cython;
+  PyObject *__pyx_n_s_ChannelCredentials;
+  PyObject *__pyx_n_s_ChannelCredentials___reduce_cyth;
+  PyObject *__pyx_n_s_ChannelCredentials___setstate_cy;
+  PyObject *__pyx_n_s_ChannelState;
+  PyObject *__pyx_n_s_ChannelState___reduce_cython;
+  PyObject *__pyx_n_s_ChannelState___setstate_cython;
+  PyObject *__pyx_n_s_Channel___reduce_cython;
+  PyObject *__pyx_n_s_Channel___setstate_cython;
+  PyObject *__pyx_n_s_Channel_check_connectivity_state;
+  PyObject *__pyx_n_s_Channel_close;
+  PyObject *__pyx_n_s_Channel_close_on_fork;
+  PyObject *__pyx_n_s_Channel_get_registered_call_hand;
+  PyObject *__pyx_n_s_Channel_integrated_call;
+  PyObject *__pyx_kp_s_Channel_is_closed;
+  PyObject *__pyx_n_s_Channel_next_call_event;
+  PyObject *__pyx_n_s_Channel_segregated_call;
+  PyObject *__pyx_n_s_Channel_target;
+  PyObject *__pyx_n_s_Channel_watch_connectivity_state;
+  PyObject *__pyx_n_s_CompletionQueue;
+  PyObject *__pyx_n_s_CompletionQueue___reduce_cython;
+  PyObject *__pyx_n_s_CompletionQueue___setstate_cytho;
+  PyObject *__pyx_n_s_CompletionQueue__internal_poll;
+  PyObject *__pyx_n_s_CompletionQueue_clear;
+  PyObject *__pyx_n_s_CompletionQueue_poll;
+  PyObject *__pyx_n_s_CompletionQueue_shutdown;
+  PyObject *__pyx_n_s_CompletionType;
+  PyObject *__pyx_n_s_CompositeCallCredentials;
+  PyObject *__pyx_n_s_CompositeCallCredentials___reduc;
+  PyObject *__pyx_n_s_CompositeCallCredentials___setst;
+  PyObject *__pyx_n_s_CompositeChannelCredentials;
+  PyObject *__pyx_n_s_CompositeChannelCredentials___re;
+  PyObject *__pyx_n_s_CompositeChannelCredentials___se;
+  PyObject *__pyx_n_s_CompressionAlgorithm;
+  PyObject *__pyx_n_s_CompressionLevel;
+  PyObject *__pyx_n_s_CompressionOptions;
+  PyObject *__pyx_n_s_CompressionOptions___reduce_cyth;
+  PyObject *__pyx_n_s_CompressionOptions___setstate_cy;
+  PyObject *__pyx_n_s_CompressionOptions_disable_algor;
+  PyObject *__pyx_n_s_CompressionOptions_enable_algori;
+  PyObject *__pyx_n_s_CompressionOptions_is_algorithm;
+  PyObject *__pyx_n_s_CompressionOptions_to_channel_ar;
+  PyObject *__pyx_kp_s_Compression_setting_must_be_spec;
+  PyObject *__pyx_n_s_ComputeEngineChannelCredentials;
+  PyObject *__pyx_n_s_ComputeEngineChannelCredentials_2;
+  PyObject *__pyx_n_s_ComputeEngineChannelCredentials_3;
+  PyObject *__pyx_n_s_ConcurrentRpcLimiter;
+  PyObject *__pyx_n_s_ConcurrentRpcLimiter___reduce_c;
+  PyObject *__pyx_n_s_ConcurrentRpcLimiter___setstate;
+  PyObject *__pyx_n_s_ConcurrentRpcLimiter__decrease;
+  PyObject *__pyx_n_s_ConcurrentRpcLimiter_check_befo;
+  PyObject *__pyx_n_s_ConcurrentRpcLimiter_decrease_o;
+  PyObject *__pyx_kp_s_Concurrent_RPC_limit_exceeded;
+  PyObject *__pyx_n_s_Condition;
+  PyObject *__pyx_n_s_ConnectivityEvent;
+  PyObject *__pyx_n_s_ConnectivityEvent___reduce_cytho;
+  PyObject *__pyx_n_s_ConnectivityEvent___setstate_cyt;
+  PyObject *__pyx_n_s_ConnectivityState;
+  PyObject *__pyx_n_s_ConnectivityTag;
+  PyObject *__pyx_n_s_ConnectivityTag___reduce_cython;
+  PyObject *__pyx_n_s_ConnectivityTag___setstate_cyth;
+  PyObject *__pyx_kp_s_Core_should_not_return_GRPC_QUEU;
+  PyObject *__pyx_kp_s_Credentials_couldn_t_have_been_s;
+  PyObject *__pyx_kp_s_Dedicated_exception_class_for_wa;
+  PyObject *__pyx_n_s_DeprecationWarning;
+  PyObject *__pyx_n_s_EMPTY_FLAGS;
+  PyObject *__pyx_n_s_EMPTY_MASK;
+  PyObject *__pyx_n_s_EOF;
+  PyObject *__pyx_n_s_EOF_2;
+  PyObject *__pyx_n_s_EOF___bool;
+  PyObject *__pyx_n_s_EOF___len;
+  PyObject *__pyx_n_s_EOF___repr;
+  PyObject *__pyx_n_s_EOF___str;
+  PyObject *__pyx_n_s_EOF__repr;
+  PyObject *__pyx_n_s_EX_USAGE;
+  PyObject *__pyx_n_s_Enum;
+  PyObject *__pyx_kp_s_Error_fetching_certificate_confi;
+  PyObject *__pyx_kp_s_Error_fetching_certificate_confi_2;
+  PyObject *__pyx_kp_s_Error_in_callback_for_method_s;
+  PyObject *__pyx_kp_s_Error_in_grpc_server_request_cal;
+  PyObject *__pyx_n_s_ExecuteBatchError;
+  PyObject *__pyx_kp_s_ExecuteBatchError_raised_in_core;
+  PyObject *__pyx_kp_s_Exiting_child_due_to_raised_exce;
+  PyObject *__pyx_kp_s_Expected_bytes_str_or_unicode_no;
+  PyObject *__pyx_kp_s_Expected_int_bytes_or_behavior_g;
+  PyObject *__pyx_kp_s_Expected_str_not;
+  PyObject *__pyx_kp_s_Expecting_non_ok_status_code;
+  PyObject *__pyx_kp_s_Failed_grpc_call_start_batch_wit;
+  PyObject *__pyx_kp_s_Failed_s_s;
+  PyObject *__pyx_kp_s_Failed_sending_error_status_from;
+  PyObject *__pyx_kp_s_Failed_to_get_server_sockets_ple;
+  PyObject *__pyx_kp_s_Failed_to_get_servers_please_ens;
+  PyObject *__pyx_kp_s_Failed_to_get_the_channel_please;
+  PyObject *__pyx_kp_s_Failed_to_get_the_server_please;
+  PyObject *__pyx_kp_s_Failed_to_get_the_socket_please;
+  PyObject *__pyx_kp_s_Failed_to_get_the_subchannel_ple;
+  PyObject *__pyx_kp_s_Failed_to_get_top_channels_pleas;
+  PyObject *__pyx_kp_s_Failed_to_receive_any_message_fr;
+  PyObject *__pyx_kp_s_Failed_to_shutdown_gRPC_Core_aft;
+  PyObject *__pyx_kp_s_Failed_to_shutdown_gRPC_Python_t;
+  PyObject *__pyx_n_s_ForkManagedThread;
+  PyObject *__pyx_n_s_ForkManagedThread___init;
+  PyObject *__pyx_n_s_ForkManagedThread___init___local;
+  PyObject *__pyx_n_s_ForkManagedThread_join;
+  PyObject *__pyx_n_s_ForkManagedThread_setDaemon;
+  PyObject *__pyx_n_s_ForkManagedThread_start;
+  PyObject *__pyx_n_s_ForkState;
+  PyObject *__pyx_n_s_ForkState___init;
+  PyObject *__pyx_n_s_GRPC_ASYNCIO_ENGINE;
+  PyObject *__pyx_n_s_GRPC_COMPRESSION_CHANNEL_DEFAULT;
+  PyObject *__pyx_n_s_GRPC_COMPRESSION_REQUEST_ALGORIT;
+  PyObject *__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT;
+  PyObject *__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT_2;
+  PyObject *__pyx_n_s_GRPC_PROPAGATE_CANCELLATION;
+  PyObject *__pyx_n_s_GRPC_PROPAGATE_CENSUS_STATS_CONT;
+  PyObject *__pyx_n_s_GRPC_PROPAGATE_CENSUS_TRACING_CO;
+  PyObject *__pyx_n_s_GRPC_PROPAGATE_DEADLINE;
+  PyObject *__pyx_n_s_GRPC_PROPAGATE_DEFAULTS;
+  PyObject *__pyx_n_s_Group;
+  PyObject *__pyx_n_s_GrpcArgWrapper;
+  PyObject *__pyx_n_s_GrpcArgWrapper___reduce_cython;
+  PyObject *__pyx_n_s_GrpcArgWrapper___setstate_cytho;
+  PyObject *__pyx_n_s_GrpcCallWrapper;
+  PyObject *__pyx_n_s_HandlerCallDetails;
+  PyObject *__pyx_n_s_HandlerCallDetails___reduce_cyt;
+  PyObject *__pyx_n_s_HandlerCallDetails___setstate_c;
+  PyObject *__pyx_n_s_IMMUTABLE_EMPTY_METADATA;
+  PyObject *__pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR;
+  PyObject *__pyx_n_s_ImportError;
+  PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0;
+  PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2;
+  PyObject *__pyx_n_s_InitialMetadataFlags;
+  PyObject *__pyx_n_s_InsecureChannelCredentials;
+  PyObject *__pyx_n_s_InsecureChannelCredentials___red;
+  PyObject *__pyx_n_s_InsecureChannelCredentials___set;
+  PyObject *__pyx_n_s_IntegratedCall;
+  PyObject *__pyx_n_s_IntegratedCall___reduce_cython;
+  PyObject *__pyx_n_s_IntegratedCall___setstate_cython;
+  PyObject *__pyx_n_s_IntegratedCall_cancel;
+  PyObject *__pyx_n_s_IntegratedCall_operate;
+  PyObject *__pyx_n_s_InternalError;
+  PyObject *__pyx_kp_s_Internal_error_from_Core;
+  PyObject *__pyx_kp_s_Internal_gRPC_call_error_d;
+  PyObject *__pyx_kp_s_Invalid_encoding_on_s;
+  PyObject *__pyx_kp_u_Invalid_trailing_metadata_type_e;
+  PyObject *__pyx_n_s_KeyError;
+  PyObject *__pyx_n_s_KeyboardInterrupt;
+  PyObject *__pyx_n_s_LOGGER;
+  PyObject *__pyx_n_s_LatentEventArg;
+  PyObject *__pyx_n_s_LocalChannelCredentials;
+  PyObject *__pyx_n_s_LocalChannelCredentials___reduce;
+  PyObject *__pyx_n_s_LocalChannelCredentials___setsta;
+  PyObject *__pyx_n_s_LocalConnectionType;
+  PyObject *__pyx_kp_s_Locally_aborted;
+  PyObject *__pyx_n_s_Lock;
+  PyObject *__pyx_n_s_MessageReceiver;
+  PyObject *__pyx_n_s_MessageReceiver___anext;
+  PyObject *__pyx_n_s_MessageReceiver___reduce_cython;
+  PyObject *__pyx_n_s_MessageReceiver___setstate_cyth;
+  PyObject *__pyx_n_s_MessageReceiver__async_message;
+  PyObject *__pyx_n_s_MetadataPluginCallCredentials;
+  PyObject *__pyx_n_s_MetadataPluginCallCredentials_2;
+  PyObject *__pyx_n_s_MetadataPluginCallCredentials_3;
+  PyObject *__pyx_n_s_Metadatum;
+  PyObject *__pyx_kp_s_Method_not_found;
+  PyObject *__pyx_n_s_NON_OK_CALL_REPRESENTATION;
+  PyObject *__pyx_kp_s_No_custom_hooks_are_implemented;
+  PyObject *__pyx_kp_s_Non_thread_safe_operation;
+  PyObject *__pyx_n_s_None;
+  PyObject *__pyx_n_s_NotImplementedError;
+  PyObject *__pyx_n_s_OK_CALL_REPRESENTATION;
+  PyObject *__pyx_n_s_Operation;
+  PyObject *__pyx_n_s_OperationType;
+  PyObject *__pyx_n_s_Operation___reduce_cython;
+  PyObject *__pyx_n_s_Operation___setstate_cython;
+  PyObject *__pyx_n_s_Optional;
+  PyObject *__pyx_n_s_POLLER;
+  PyObject *__pyx_n_s_PickleError;
+  PyObject *__pyx_kp_s_Please_report_to_https_github_co;
+  PyObject *__pyx_n_s_PollerCompletionQueue;
+  PyObject *__pyx_n_s_PollerCompletionQueue___reduce_c;
+  PyObject *__pyx_n_s_PollerCompletionQueue___setstate;
+  PyObject *__pyx_n_s_PollerCompletionQueue__handle_ev;
+  PyObject *__pyx_n_s_PollerCompletionQueue__poll_wrap;
+  PyObject *__pyx_n_s_PollerCompletionQueue_bind_loop;
+  PyObject *__pyx_n_s_PropagationConstants;
+  PyObject *__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj;
+  PyObject *__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_2;
+  PyObject *__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_3;
+  PyObject *__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_voi;
+  PyObject *__pyx_n_s_Queue;
+  PyObject *__pyx_n_s_RLock;
+  PyObject *__pyx_n_s_RPCState;
+  PyObject *__pyx_n_s_RPCState___reduce_cython;
+  PyObject *__pyx_n_s_RPCState___setstate_cython;
+  PyObject *__pyx_kp_s_RPC_already_finished;
+  PyObject *__pyx_kp_s_RPC_cancelled_for_servicer_metho;
+  PyObject *__pyx_kp_s_RPC_cancelled_for_unknown_reason;
+  PyObject *__pyx_kp_s_Raised_if_the_server_is_stopped;
+  PyObject *__pyx_kp_s_Raised_upon_unexpected_errors_in;
+  PyObject *__pyx_kp_s_Raised_when_calling_abort_in_ser;
+  PyObject *__pyx_kp_s_Raised_when_execute_batch_return;
+  PyObject *__pyx_kp_s_Raised_when_the_usage_of_API_by;
+  PyObject *__pyx_n_s_ReceiveCloseOnServerOperation;
+  PyObject *__pyx_n_s_ReceiveCloseOnServerOperation_2;
+  PyObject *__pyx_n_s_ReceiveCloseOnServerOperation_3;
+  PyObject *__pyx_n_s_ReceiveCloseOnServerOperation_ca;
+  PyObject *__pyx_n_s_ReceiveCloseOnServerOperation_ty;
+  PyObject *__pyx_n_s_ReceiveInitialMetadataOperation;
+  PyObject *__pyx_n_s_ReceiveInitialMetadataOperation_2;
+  PyObject *__pyx_n_s_ReceiveInitialMetadataOperation_3;
+  PyObject *__pyx_n_s_ReceiveInitialMetadataOperation_4;
+  PyObject *__pyx_n_s_ReceiveInitialMetadataOperation_5;
+  PyObject *__pyx_n_s_ReceiveMessageOperation;
+  PyObject *__pyx_n_s_ReceiveMessageOperation___reduce;
+  PyObject *__pyx_n_s_ReceiveMessageOperation___setsta;
+  PyObject *__pyx_n_s_ReceiveMessageOperation_message;
+  PyObject *__pyx_n_s_ReceiveMessageOperation_type;
+  PyObject *__pyx_n_s_ReceiveStatusOnClientOperation;
+  PyObject *__pyx_n_s_ReceiveStatusOnClientOperation_2;
+  PyObject *__pyx_n_s_ReceiveStatusOnClientOperation_3;
+  PyObject *__pyx_n_s_ReceiveStatusOnClientOperation_c;
+  PyObject *__pyx_n_s_ReceiveStatusOnClientOperation_d;
+  PyObject *__pyx_n_s_ReceiveStatusOnClientOperation_e;
+  PyObject *__pyx_n_s_ReceiveStatusOnClientOperation_t;
+  PyObject *__pyx_n_s_ReceiveStatusOnClientOperation_t_2;
+  PyObject *__pyx_n_s_RequestCallError;
+  PyObject *__pyx_n_s_RequestCallEvent;
+  PyObject *__pyx_n_s_RequestCallEvent___reduce_cython;
+  PyObject *__pyx_n_s_RequestCallEvent___setstate_cyth;
+  PyObject *__pyx_n_s_RequestCallTag;
+  PyObject *__pyx_n_s_RequestCallTag___reduce_cython;
+  PyObject *__pyx_n_s_RequestCallTag___setstate_cytho;
+  PyObject *__pyx_n_s_RuntimeError;
+  PyObject *__pyx_n_s_SERVICES_TO_EXCLUDE;
+  PyObject *__pyx_n_s_SSLChannelCredentials;
+  PyObject *__pyx_n_s_SSLChannelCredentials___reduce_c;
+  PyObject *__pyx_n_s_SSLChannelCredentials___setstate;
+  PyObject *__pyx_n_s_SSLSessionCacheLRU;
+  PyObject *__pyx_n_s_SSLSessionCacheLRU___reduce_cyth;
+  PyObject *__pyx_n_s_SSLSessionCacheLRU___setstate_cy;
+  PyObject *__pyx_n_s_SegregatedCall;
+  PyObject *__pyx_n_s_SegregatedCall___reduce_cython;
+  PyObject *__pyx_n_s_SegregatedCall___setstate_cython;
+  PyObject *__pyx_n_s_SegregatedCall_cancel;
+  PyObject *__pyx_n_s_SegregatedCall_next_event;
+  PyObject *__pyx_n_s_SegregatedCall_operate;
+  PyObject *__pyx_n_s_SendCloseFromClientOperation;
+  PyObject *__pyx_n_s_SendCloseFromClientOperation___r;
+  PyObject *__pyx_n_s_SendCloseFromClientOperation___s;
+  PyObject *__pyx_n_s_SendCloseFromClientOperation_typ;
+  PyObject *__pyx_n_s_SendInitialMetadataOperation;
+  PyObject *__pyx_n_s_SendInitialMetadataOperation___r;
+  PyObject *__pyx_n_s_SendInitialMetadataOperation___s;
+  PyObject *__pyx_n_s_SendInitialMetadataOperation_typ;
+  PyObject *__pyx_n_s_SendMessageOperation;
+  PyObject *__pyx_n_s_SendMessageOperation___reduce_cy;
+  PyObject *__pyx_n_s_SendMessageOperation___setstate;
+  PyObject *__pyx_n_s_SendMessageOperation_type;
+  PyObject *__pyx_n_s_SendStatusFromServerOperation;
+  PyObject *__pyx_n_s_SendStatusFromServerOperation_2;
+  PyObject *__pyx_n_s_SendStatusFromServerOperation_3;
+  PyObject *__pyx_n_s_SendStatusFromServerOperation_ty;
+  PyObject *__pyx_kp_s_Send_initial_metadata_failed_alr;
+  PyObject *__pyx_n_s_Server;
+  PyObject *__pyx_n_s_ServerCertificateConfig;
+  PyObject *__pyx_n_s_ServerCertificateConfig___reduce;
+  PyObject *__pyx_n_s_ServerCertificateConfig___setsta;
+  PyObject *__pyx_n_s_ServerCertificateConfiguration;
+  PyObject *__pyx_n_s_ServerCredentials;
+  PyObject *__pyx_n_s_ServerCredentials___reduce_cytho;
+  PyObject *__pyx_n_s_ServerCredentials___setstate_cyt;
+  PyObject *__pyx_n_s_ServerShutdownEvent;
+  PyObject *__pyx_n_s_ServerShutdownEvent___reduce_cyt;
+  PyObject *__pyx_n_s_ServerShutdownEvent___setstate_c;
+  PyObject *__pyx_n_s_ServerShutdownTag;
+  PyObject *__pyx_n_s_ServerShutdownTag___reduce_cyth;
+  PyObject *__pyx_n_s_ServerShutdownTag___setstate_cy;
+  PyObject *__pyx_n_s_ServerStoppedError;
+  PyObject *__pyx_n_s_Server___reduce_cython;
+  PyObject *__pyx_n_s_Server___setstate_cython;
+  PyObject *__pyx_n_s_Server_add_http2_port;
+  PyObject *__pyx_kp_s_Server_already_stopped;
+  PyObject *__pyx_n_s_Server_cancel_all_calls;
+  PyObject *__pyx_n_s_Server_destroy;
+  PyObject *__pyx_kp_s_Server_not_in_ready_state;
+  PyObject *__pyx_n_s_Server_register_completion_queue;
+  PyObject *__pyx_n_s_Server_request_call;
+  PyObject *__pyx_n_s_Server_shutdown;
+  PyObject *__pyx_kp_s_Server_shutdown_failed_no_comple;
+  PyObject *__pyx_n_s_Server_start;
+  PyObject *__pyx_n_s_ServicerContext;
+  PyObject *__pyx_n_s_ServicerContext___reduce_cython;
+  PyObject *__pyx_n_s_ServicerContext___setstate_cyth;
+  PyObject *__pyx_n_s_ServicerContext_abort;
+  PyObject *__pyx_n_s_ServicerContext_abort_with_stat;
+  PyObject *__pyx_n_s_ServicerContext_add_done_callba;
+  PyObject *__pyx_n_s_ServicerContext_auth_context;
+  PyObject *__pyx_n_s_ServicerContext_cancelled;
+  PyObject *__pyx_n_s_ServicerContext_code;
+  PyObject *__pyx_n_s_ServicerContext_details;
+  PyObject *__pyx_n_s_ServicerContext_disable_next_me;
+  PyObject *__pyx_n_s_ServicerContext_done;
+  PyObject *__pyx_n_s_ServicerContext_invocation_meta;
+  PyObject *__pyx_n_s_ServicerContext_peer;
+  PyObject *__pyx_n_s_ServicerContext_peer_identities;
+  PyObject *__pyx_n_s_ServicerContext_peer_identity_k;
+  PyObject *__pyx_n_s_ServicerContext_read;
+  PyObject *__pyx_n_s_ServicerContext_send_initial_me;
+  PyObject *__pyx_n_s_ServicerContext_set_code;
+  PyObject *__pyx_n_s_ServicerContext_set_compression;
+  PyObject *__pyx_n_s_ServicerContext_set_details;
+  PyObject *__pyx_n_s_ServicerContext_set_trailing_me;
+  PyObject *__pyx_n_s_ServicerContext_time_remaining;
+  PyObject *__pyx_n_s_ServicerContext_trailing_metada;
+  PyObject *__pyx_n_s_ServicerContext_write;
+  PyObject *__pyx_n_s_SslPemKeyCertPair;
+  PyObject *__pyx_n_s_SslPemKeyCertPair___reduce_cytho;
+  PyObject *__pyx_n_s_SslPemKeyCertPair___setstate_cyt;
+  PyObject *__pyx_n_s_StatusCode;
+  PyObject *__pyx_n_s_SyncServicerContext;
+  PyObject *__pyx_n_s_SyncServicerContext___reduce_cy;
+  PyObject *__pyx_n_s_SyncServicerContext___setstate;
+  PyObject *__pyx_n_s_SyncServicerContext_abort;
+  PyObject *__pyx_n_s_SyncServicerContext_add_callbac;
+  PyObject *__pyx_n_s_SyncServicerContext_auth_contex;
+  PyObject *__pyx_n_s_SyncServicerContext_disable_nex;
+  PyObject *__pyx_n_s_SyncServicerContext_invocation;
+  PyObject *__pyx_n_s_SyncServicerContext_peer;
+  PyObject *__pyx_n_s_SyncServicerContext_peer_identi;
+  PyObject *__pyx_n_s_SyncServicerContext_peer_identi_2;
+  PyObject *__pyx_n_s_SyncServicerContext_send_initia;
+  PyObject *__pyx_n_s_SyncServicerContext_set_code;
+  PyObject *__pyx_n_s_SyncServicerContext_set_compres;
+  PyObject *__pyx_n_s_SyncServicerContext_set_details;
+  PyObject *__pyx_n_s_SyncServicerContext_set_trailin;
+  PyObject *__pyx_n_s_SyncServicerContext_time_remain;
+  PyObject *__pyx_n_s_SystemExit;
+  PyObject *__pyx_n_s_TRUE;
+  PyObject *__pyx_n_s_TRUE_VALUES;
+  PyObject *__pyx_n_s_TYPE_METADATA_STRING;
+  PyObject *__pyx_n_s_Tag;
+  PyObject *__pyx_n_s_Tag___reduce_cython;
+  PyObject *__pyx_n_s_Tag___setstate_cython;
+  PyObject *__pyx_kp_s_The_base_class_for_exceptions_ge;
+  PyObject *__pyx_n_s_Thread;
+  PyObject *__pyx_kp_s_Timed_out;
+  PyObject *__pyx_n_s_TimeoutError;
+  PyObject *__pyx_n_s_True;
+  PyObject *__pyx_kp_s_Tuple_Tuple_str_Union_str_bytes;
+  PyObject *__pyx_n_s_TypeError;
+  PyObject *__pyx_n_s_UNKNOWN_CANCELLATION_DETAILS;
+  PyObject *__pyx_kp_s_Unexpected_s_raised_by_servicer;
+  PyObject *__pyx_kp_s_Unexpected_s_s;
+  PyObject *__pyx_n_s_UnicodeDecodeError;
+  PyObject *__pyx_n_s_Unknown;
+  PyObject *__pyx_kp_s_Unsupported_engine_type_s;
+  PyObject *__pyx_n_s_UsageError;
+  PyObject *__pyx_kp_s_Using_s_as_I_O_engine;
+  PyObject *__pyx_n_s_ValueError;
+  PyObject *__pyx_n_s_WatchConnectivityFailed;
+  PyObject *__pyx_n_s_WriteFlag;
+  PyObject *__pyx_n_s_XDSChannelCredentials;
+  PyObject *__pyx_n_s_XDSChannelCredentials___reduce_c;
+  PyObject *__pyx_n_s_XDSChannelCredentials___setstate;
+  PyObject *__pyx_n_s_YES;
+  PyObject *__pyx_n_s_Yes;
+  PyObject *__pyx_n_s__107;
+  PyObject *__pyx_n_s__38;
+  PyObject *__pyx_kp_u__49;
+  PyObject *__pyx_n_s__57;
+  PyObject *__pyx_kp_u__58;
+  PyObject *__pyx_kp_u__69;
+  PyObject *__pyx_kp_b__7;
+  PyObject *__pyx_kp_s__7;
+  PyObject *__pyx_kp_u__70;
+  PyObject *__pyx_kp_u__71;
+  PyObject *__pyx_n_s_abort;
+  PyObject *__pyx_n_s_abort_with_status;
+  PyObject *__pyx_n_s_aborted;
+  PyObject *__pyx_n_s_active_thread_count;
+  PyObject *__pyx_n_s_actual_code;
+  PyObject *__pyx_n_s_add;
+  PyObject *__pyx_n_s_add_callback;
+  PyObject *__pyx_n_s_add_callback_handler_locals_han;
+  PyObject *__pyx_n_s_add_done_callback;
+  PyObject *__pyx_n_s_add_generic_rpc_handlers;
+  PyObject *__pyx_n_s_add_http2_port;
+  PyObject *__pyx_n_s_add_insecure_port;
+  PyObject *__pyx_n_s_add_reader;
+  PyObject *__pyx_n_s_add_secure_port;
+  PyObject *__pyx_n_s_address;
+  PyObject *__pyx_n_s_address_c_string;
+  PyObject *__pyx_n_s_aenter;
+  PyObject *__pyx_n_s_aexit;
+  PyObject *__pyx_n_s_after_in_child;
+  PyObject *__pyx_n_s_after_in_parent;
+  PyObject *__pyx_n_s_agen;
+  PyObject *__pyx_n_s_aiter;
+  PyObject *__pyx_n_s_algorithm;
+  PyObject *__pyx_n_s_already_accepted;
+  PyObject *__pyx_n_s_already_exists;
+  PyObject *__pyx_n_s_already_finished;
+  PyObject *__pyx_n_s_already_invoked;
+  PyObject *__pyx_n_s_anext;
+  PyObject *__pyx_n_s_append;
+  PyObject *__pyx_n_s_apply;
+  PyObject *__pyx_n_s_args;
+  PyObject *__pyx_n_s_arguments;
+  PyObject *__pyx_n_s_ascii;
+  PyObject *__pyx_n_s_async_callback_func;
+  PyObject *__pyx_n_s_async_generator_to_generator;
+  PyObject *__pyx_n_s_async_message_receiver;
+  PyObject *__pyx_n_s_async_response_generator;
+  PyObject *__pyx_n_s_asyncio;
+  PyObject *__pyx_n_s_asyncio_coroutines;
+  PyObject *__pyx_n_s_asyncio_tasks;
+  PyObject *__pyx_n_s_atexit;
+  PyObject *__pyx_n_s_auth_context;
+  PyObject *__pyx_n_s_await;
+  PyObject *__pyx_n_s_await_zero_threads;
+  PyObject *__pyx_n_s_backup_queue;
+  PyObject *__pyx_n_s_batch_error;
+  PyObject *__pyx_n_s_batch_operation_tag;
+  PyObject *__pyx_n_s_batch_operations;
+  PyObject *__pyx_n_s_before;
+  PyObject *__pyx_kp_b_bin;
+  PyObject *__pyx_n_s_bind_loop;
+  PyObject *__pyx_n_s_block_if_fork_in_progress;
+  PyObject *__pyx_n_s_bool;
+  PyObject *__pyx_n_s_buffer_hint;
+  PyObject *__pyx_n_s_build_census_context;
+  PyObject *__pyx_n_s_bytes_ctx;
+  PyObject *__pyx_n_s_c_call_credentials;
+  PyObject *__pyx_n_s_c_cert_config;
+  PyObject *__pyx_n_s_c_deadline;
+  PyObject *__pyx_n_s_c_details;
+  PyObject *__pyx_n_s_c_error_details;
+  PyObject *__pyx_n_s_c_event;
+  PyObject *__pyx_n_s_c_key;
+  PyObject *__pyx_n_s_c_options;
+  PyObject *__pyx_n_s_c_peer;
+  PyObject *__pyx_n_s_c_pem_root_certs;
+  PyObject *__pyx_n_s_c_returned_str;
+  PyObject *__pyx_n_s_c_target;
+  PyObject *__pyx_n_s_call;
+  PyObject *__pyx_n_s_call_credentials;
+  PyObject *__pyx_n_s_call_credentialses;
+  PyObject *__pyx_n_s_call_creds;
+  PyObject *__pyx_n_s_call_details;
+  PyObject *__pyx_n_s_call_error;
+  PyObject *__pyx_n_s_call_handle;
+  PyObject *__pyx_n_s_call_queue;
+  PyObject *__pyx_n_s_call_soon_threadsafe;
+  PyObject *__pyx_n_s_call_state;
+  PyObject *__pyx_n_s_callback;
+  PyObject *__pyx_n_s_callback_func;
+  PyObject *__pyx_n_s_callback_wrapper;
+  PyObject *__pyx_n_s_cancel;
+  PyObject *__pyx_n_s_cancel_all_calls;
+  PyObject *__pyx_n_s_cancelled;
+  PyObject *__pyx_kp_s_cannot_register_completion_queue;
+  PyObject *__pyx_n_s_capacity;
+  PyObject *__pyx_n_s_capsule;
+  PyObject *__pyx_n_s_capsule_ptr;
+  PyObject *__pyx_n_s_catch_warnings;
+  PyObject *__pyx_n_s_cb;
+  PyObject *__pyx_n_s_cb_func;
+  PyObject *__pyx_n_s_census_ctx;
+  PyObject *__pyx_n_s_cert_config;
+  PyObject *__pyx_n_s_cert_config_fetcher;
+  PyObject *__pyx_kp_s_cert_config_fetcher_must_be_call;
+  PyObject *__pyx_n_s_certificate_chain;
+  PyObject *__pyx_n_s_certificate_configuration;
+  PyObject *__pyx_n_s_cfunc_to_py;
+  PyObject *__pyx_n_s_channel;
+  PyObject *__pyx_n_s_channel_credentials;
+  PyObject *__pyx_n_s_channel_credentials_alts;
+  PyObject *__pyx_n_s_channel_credentials_compute_engi;
+  PyObject *__pyx_n_s_channel_credentials_insecure;
+  PyObject *__pyx_n_s_channel_credentials_local;
+  PyObject *__pyx_n_s_channel_id;
+  PyObject *__pyx_n_s_channel_state;
+  PyObject *__pyx_n_s_channels;
+  PyObject *__pyx_n_s_channelz_get_channel;
+  PyObject *__pyx_n_s_channelz_get_server;
+  PyObject *__pyx_n_s_channelz_get_server_sockets;
+  PyObject *__pyx_n_s_channelz_get_servers;
+  PyObject *__pyx_n_s_channelz_get_socket;
+  PyObject *__pyx_n_s_channelz_get_subchannel;
+  PyObject *__pyx_n_s_channelz_get_top_channels;
+  PyObject *__pyx_n_s_check_before_request_call;
+  PyObject *__pyx_n_s_check_connectivity_state;
+  PyObject *__pyx_n_s_class;
+  PyObject *__pyx_n_s_class_getitem;
+  PyObject *__pyx_n_s_clear;
+  PyObject *__pyx_n_s_clear_server_call_tracer_factory;
+  PyObject *__pyx_n_s_client_config_in_slice;
+  PyObject *__pyx_n_s_cline_in_traceback;
+  PyObject *__pyx_n_s_close;
+  PyObject *__pyx_n_s_close_on_fork;
+  PyObject *__pyx_n_s_close_on_fork_2;
+  PyObject *__pyx_n_s_closed;
+  PyObject *__pyx_n_s_closing;
+  PyObject *__pyx_n_s_code;
+  PyObject *__pyx_n_s_codecs;
+  PyObject *__pyx_n_s_collections;
+  PyObject *__pyx_n_s_common;
+  PyObject *__pyx_n_s_completion_type;
+  PyObject *__pyx_n_s_compression;
+  PyObject *__pyx_n_s_compression_algorithm_name;
+  PyObject *__pyx_n_s_concurrency_exceeded;
+  PyObject *__pyx_n_s_condition;
+  PyObject *__pyx_n_s_connecting;
+  PyObject *__pyx_n_s_context;
+  PyObject *__pyx_n_s_context_loop;
+  PyObject *__pyx_n_s_contextvars;
+  PyObject *__pyx_n_s_contextvars_supported;
+  PyObject *__pyx_n_s_continuation;
+  PyObject *__pyx_n_s_copy;
+  PyObject *__pyx_n_s_copy_context;
+  PyObject *__pyx_n_s_core_function_name;
+  PyObject *__pyx_n_s_coro;
+  PyObject *__pyx_n_s_create_client_call_tracer;
+  PyObject *__pyx_n_s_create_future;
+  PyObject *__pyx_n_s_create_server_call_tracer_factor;
+  PyObject *__pyx_n_s_create_task;
+  PyObject *__pyx_n_s_credentials;
+  PyObject *__pyx_n_s_credentials_2;
+  PyObject *__pyx_kp_s_credentials_roots_pem;
+  PyObject *__pyx_n_s_creds;
+  PyObject *__pyx_n_s_ctx;
+  PyObject *__pyx_n_s_custom_io_manager;
+  PyObject *__pyx_n_s_custom_op_on_c_call;
+  PyObject *__pyx_kp_s_cygrpc;
+  PyObject *__pyx_n_s_cython_call_credentials;
+  PyObject *__pyx_n_s_cython_cygrpc;
+  PyObject *__pyx_n_s_daemon;
+  PyObject *__pyx_n_s_daemonic;
+  PyObject *__pyx_n_s_data;
+  PyObject *__pyx_n_s_data_loss;
+  PyObject *__pyx_n_s_deadline;
+  PyObject *__pyx_n_s_deadline_exceeded;
+  PyObject *__pyx_kp_s_dealloc___called_on_running_se;
+  PyObject *__pyx_n_s_debug;
+  PyObject *__pyx_n_s_debug_error_string;
+  PyObject *__pyx_n_s_decode;
+  PyObject *__pyx_n_s_decrease_active_rpcs_count;
+  PyObject *__pyx_n_s_decrease_once_finished;
+  PyObject *__pyx_n_s_decrement;
+  PyObject *__pyx_n_s_default_authority;
+  PyObject *__pyx_n_s_default_vtable;
+  PyObject *__pyx_n_s_deflate;
+  PyObject *__pyx_n_s_delete_call_tracer;
+  PyObject *__pyx_n_s_destroy;
+  PyObject *__pyx_n_s_details;
+  PyObject *__pyx_n_s_details_bytes;
+  PyObject *__pyx_n_s_dict;
+  PyObject *__pyx_n_s_dict_2;
+  PyObject *__pyx_kp_u_disable;
+  PyObject *__pyx_n_s_disable_algorithm;
+  PyObject *__pyx_n_s_disable_next_message_compression;
+  PyObject *__pyx_n_s_discard;
+  PyObject *__pyx_n_s_doc;
+  PyObject *__pyx_n_s_done;
+  PyObject *__pyx_n_s_dump_xds_configs;
+  PyObject *__pyx_n_s_e;
+  PyObject *__pyx_kp_u_enable;
+  PyObject *__pyx_n_s_enable_algorithm;
+  PyObject *__pyx_n_s_enable_census;
+  PyObject *__pyx_n_s_encode;
+  PyObject *__pyx_n_s_end_time;
+  PyObject *__pyx_n_s_endswith;
+  PyObject *__pyx_n_s_enter;
+  PyObject *__pyx_n_s_enter_user_request_generator;
+  PyObject *__pyx_n_s_enum;
+  PyObject *__pyx_n_s_enumerate;
+  PyObject *__pyx_n_s_environ;
+  PyObject *__pyx_n_s_errno;
+  PyObject *__pyx_n_s_error;
+  PyObject *__pyx_n_s_error_code;
+  PyObject *__pyx_n_s_error_details;
+  PyObject *__pyx_n_s_error_str;
+  PyObject *__pyx_n_s_error_string;
+  PyObject *__pyx_n_s_event;
+  PyObject *__pyx_n_s_exc_info;
+  PyObject *__pyx_n_s_exception;
+  PyObject *__pyx_n_s_exception_type;
+  PyObject *__pyx_n_s_execute_batch;
+  PyObject *__pyx_n_s_exit;
+  PyObject *__pyx_n_s_exit_2;
+  PyObject *__pyx_kp_s_expected_certificate_to_be_bytes;
+  PyObject *__pyx_kp_s_expected_pem_key_cert_pairs_to_b;
+  PyObject *__pyx_kp_s_expected_registered_completion_q;
+  PyObject *__pyx_n_s_failed_precondition;
+  PyObject *__pyx_n_s_failure_handler;
+  PyObject *__pyx_n_s_fallback_credentials;
+  PyObject *__pyx_n_s_fileno;
+  PyObject *__pyx_n_s_find_method_handler;
+  PyObject *__pyx_n_s_find_method_handler_locals_quer;
+  PyObject *__pyx_n_s_finish_handler_with_stream_resp;
+  PyObject *__pyx_n_s_finish_handler_with_unary_respo;
+  PyObject *__pyx_n_s_finish_ops;
+  PyObject *__pyx_n_s_flags;
+  PyObject *__pyx_n_s_fn;
+  PyObject *__pyx_n_s_force_client_auth;
+  PyObject *__pyx_n_s_fork_epoch;
+  PyObject *__pyx_n_s_fork_handler_failed;
+  PyObject *__pyx_n_s_fork_handler_registered;
+  PyObject *__pyx_n_s_fork_handler_registered_lock;
+  PyObject *__pyx_n_s_fork_handlers_and_grpc_init;
+  PyObject *__pyx_n_s_fork_in_progress;
+  PyObject *__pyx_n_s_fork_in_progress_condition;
+  PyObject *__pyx_n_s_fork_register_channel;
+  PyObject *__pyx_n_s_fork_state;
+  PyObject *__pyx_n_s_fork_unregister_channel;
+  PyObject *__pyx_n_s_format;
+  PyObject *__pyx_n_s_format_exception;
+  PyObject *__pyx_n_s_functools;
+  PyObject *__pyx_n_s_future;
+  PyObject *__pyx_n_s_g_gevent_activated;
+  PyObject *__pyx_n_s_g_gevent_pool;
+  PyObject *__pyx_n_s_g_gevent_threadpool;
+  PyObject *__pyx_n_s_g_interrupt_check_period_ms;
+  PyObject *__pyx_kp_u_gc;
+  PyObject *__pyx_n_s_gen;
+  PyObject *__pyx_n_s_generator_to_async_generator;
+  PyObject *__pyx_n_s_generator_to_async_generator_loc;
+  PyObject *__pyx_n_s_generic_handler;
+  PyObject *__pyx_n_s_generic_handlers;
+  PyObject *__pyx_n_s_generic_rpc_handlers;
+  PyObject *__pyx_n_s_genexpr;
+  PyObject *__pyx_n_s_get;
+  PyObject *__pyx_n_s_getLogger;
+  PyObject *__pyx_n_s_get_data;
+  PyObject *__pyx_n_s_get_deadline_from_context;
+  PyObject *__pyx_n_s_get_event_loop;
+  PyObject *__pyx_n_s_get_event_loop_policy;
+  PyObject *__pyx_n_s_get_fork_epoch;
+  PyObject *__pyx_n_s_get_hub;
+  PyObject *__pyx_n_s_get_metadata_locals_callback;
+  PyObject *__pyx_n_s_get_plugin;
+  PyObject *__pyx_n_s_get_registered_call_handle;
+  PyObject *__pyx_n_s_get_running_loop;
+  PyObject *__pyx_n_s_get_working_loop;
+  PyObject *__pyx_n_s_getstate;
+  PyObject *__pyx_n_s_gevent;
+  PyObject *__pyx_n_s_gevent_decrement_channel_count;
+  PyObject *__pyx_n_s_gevent_hub;
+  PyObject *__pyx_n_s_gevent_increment_channel_count;
+  PyObject *__pyx_n_s_gevent_pool;
+  PyObject *__pyx_n_s_grace;
+  PyObject *__pyx_n_s_grpc;
+  PyObject *__pyx_kp_s_grpc_aio_EOF;
+  PyObject *__pyx_n_s_grpc_call_error_string;
+  PyObject *__pyx_n_s_grpc_call_wrapper;
+  PyObject *__pyx_n_s_grpc_completion_queue_shutdown;
+  PyObject *__pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap;
+  PyObject *__pyx_n_s_grpc_server_request_call;
+  PyObject *__pyx_n_s_grpc_server_shutdown_and_notify;
+  PyObject *__pyx_n_s_grpc_shutdown_wrapper;
+  PyObject *__pyx_n_s_gzip;
+  PyObject *__pyx_n_s_handle_callback_wrapper;
+  PyObject *__pyx_n_s_handle_callbacks;
+  PyObject *__pyx_n_s_handle_cancellation_from_core;
+  PyObject *__pyx_n_s_handle_events;
+  PyObject *__pyx_n_s_handle_exceptions;
+  PyObject *__pyx_n_s_handle_rpc;
+  PyObject *__pyx_n_s_handle_status_once_received;
+  PyObject *__pyx_n_s_handle_stream_stream_rpc;
+  PyObject *__pyx_n_s_handle_stream_unary_rpc;
+  PyObject *__pyx_n_s_handle_unary_stream_rpc;
+  PyObject *__pyx_n_s_handle_unary_unary_rpc;
+  PyObject *__pyx_n_s_handler;
+  PyObject *__pyx_n_s_handler_call_details;
+  PyObject *__pyx_n_s_hex_codec;
+  PyObject *__pyx_n_s_high;
+  PyObject *__pyx_n_s_host;
+  PyObject *__pyx_n_s_http2_initial_sequence_number;
+  PyObject *__pyx_n_s_hub;
+  PyObject *__pyx_n_s_id;
+  PyObject *__pyx_n_s_identities;
+  PyObject *__pyx_n_s_identity;
+  PyObject *__pyx_n_s_identity_key;
+  PyObject *__pyx_n_s_idle;
+  PyObject *__pyx_kp_s_if_error_code_is_specified_so_mu;
+  PyObject *__pyx_n_s_import;
+  PyObject *__pyx_n_s_inbound_ops;
+  PyObject *__pyx_n_s_increment;
+  PyObject *__pyx_n_s_init;
+  PyObject *__pyx_n_s_init_grpc_aio;
+  PyObject *__pyx_n_s_init_grpc_gevent;
+  PyObject *__pyx_n_s_init_subclass;
+  PyObject *__pyx_n_s_initial_cert_config;
+  PyObject *__pyx_kp_s_initial_cert_config_must_be_a_gr;
+  PyObject *__pyx_n_s_initial_metadata;
+  PyObject *__pyx_n_s_initial_metadata_op;
+  PyObject *__pyx_n_s_initializing;
+  PyObject *__pyx_n_s_initiate_stream_stream;
+  PyObject *__pyx_n_s_initiate_unary_stream;
+  PyObject *__pyx_n_s_insecure_server_credentials;
+  PyObject *__pyx_n_s_inspect;
+  PyObject *__pyx_n_s_install_context_from_request_cal;
+  PyObject *__pyx_n_s_install_context_from_request_cal_2;
+  PyObject *__pyx_n_s_int;
+  PyObject *__pyx_n_s_integrated_call;
+  PyObject *__pyx_n_s_integrated_call_locals_on_succe;
+  PyObject *__pyx_n_s_intercept_service;
+  PyObject *__pyx_n_s_interceptor;
+  PyObject *__pyx_n_s_interceptors;
+  PyObject *__pyx_n_s_internal;
+  PyObject *__pyx_kp_s_internal_error_user_data_must_be;
+  PyObject *__pyx_n_s_internal_poll;
+  PyObject *__pyx_n_s_invalid_argument;
+  PyObject *__pyx_kp_s_invalid_call_object_cannot_be_us;
+  PyObject *__pyx_n_s_invalid_flags;
+  PyObject *__pyx_n_s_invalid_metadata;
+  PyObject *__pyx_n_s_invocation_metadata;
+  PyObject *__pyx_n_s_is_algorithm_enabled;
+  PyObject *__pyx_n_s_is_async_handler;
+  PyObject *__pyx_n_s_is_coroutine;
+  PyObject *__pyx_n_s_is_fork_support_enabled;
+  PyObject *__pyx_n_s_is_locally_cancelled;
+  PyObject *__pyx_n_s_is_ok;
+  PyObject *__pyx_n_s_is_running;
+  PyObject *__pyx_n_s_is_sampled;
+  PyObject *__pyx_n_s_is_valid;
+  PyObject *__pyx_n_s_isasyncgenfunction;
+  PyObject *__pyx_n_s_isawaitable;
+  PyObject *__pyx_n_s_iscoroutinefunction;
+  PyObject *__pyx_kp_u_isenabled;
+  PyObject *__pyx_n_s_item;
+  PyObject *__pyx_n_s_iter;
+  PyObject *__pyx_n_s_join;
+  PyObject *__pyx_n_s_key;
+  PyObject *__pyx_n_s_keys;
+  PyObject *__pyx_n_s_last_observed_state;
+  PyObject *__pyx_n_s_latent_event_arg;
+  PyObject *__pyx_n_s_len;
+  PyObject *__pyx_n_s_lk;
+  PyObject *__pyx_n_s_local_connect_type;
+  PyObject *__pyx_n_s_local_tcp;
+  PyObject *__pyx_n_s_logging;
+  PyObject *__pyx_n_s_loop;
+  PyObject *__pyx_n_s_low;
+  PyObject *__pyx_n_s_lower;
+  PyObject *__pyx_n_s_main;
+  PyObject *__pyx_n_s_managed_target;
+  PyObject *__pyx_n_s_max_concurrent_streams;
+  PyObject *__pyx_n_s_max_receive_message_length;
+  PyObject *__pyx_n_s_max_results;
+  PyObject *__pyx_n_s_max_send_message_length;
+  PyObject *__pyx_n_s_maximum_concurrent_rpcs;
+  PyObject *__pyx_kp_s_maximum_concurrent_rpcs_should_b;
+  PyObject *__pyx_n_s_maxsize;
+  PyObject *__pyx_n_s_maybe_save_server_trace_context;
+  PyObject *__pyx_n_s_medium;
+  PyObject *__pyx_n_s_members;
+  PyObject *__pyx_n_s_message;
+  PyObject *__pyx_n_s_metaclass;
+  PyObject *__pyx_n_s_metadata;
+  PyObject *__pyx_n_s_metadata_locals_genexpr;
+  PyObject *__pyx_n_s_metadata_plugin;
+  PyObject *__pyx_n_s_metadata_sent_observer;
+  PyObject *__pyx_kp_s_metadata_was_invalid_s;
+  PyObject *__pyx_n_s_method;
+  PyObject *__pyx_n_s_method_handler;
+  PyObject *__pyx_n_s_module;
+  PyObject *__pyx_n_s_mro_entries;
+  PyObject *__pyx_n_s_name;
+  PyObject *__pyx_n_s_name_2;
+  PyObject *__pyx_n_s_namedtuple;
+  PyObject *__pyx_n_s_new;
+  PyObject *__pyx_n_s_new_event_loop;
+  PyObject *__pyx_n_s_next_call_event;
+  PyObject *__pyx_n_s_next_call_event_locals_on_succes;
+  PyObject *__pyx_n_s_next_event;
+  PyObject *__pyx_n_s_next_event_locals_on_failure;
+  PyObject *__pyx_n_s_next_event_locals_on_success;
+  PyObject *__pyx_n_s_no_compress;
+  PyObject *__pyx_kp_s_no_default___reduce___due_to_non;
+  PyObject *__pyx_n_s_none;
+  PyObject *__pyx_n_s_not_found;
+  PyObject *__pyx_n_s_not_invoked;
+  PyObject *__pyx_n_s_not_on_client;
+  PyObject *__pyx_n_s_not_on_server;
+  PyObject *__pyx_n_s_notify_all;
+  PyObject *__pyx_n_s_num_active_threads;
+  PyObject *__pyx_n_s_object;
+  PyObject *__pyx_kp_s_object_2;
+  PyObject *__pyx_n_s_observability;
+  PyObject *__pyx_n_s_observability_enabled;
+  PyObject *__pyx_n_s_observability_plugin;
+  PyObject *__pyx_kp_s_of_RPC_that_terminated_with_sta;
+  PyObject *__pyx_kp_s_of_RPC_that_terminated_with_sta_2;
+  PyObject *__pyx_n_s_ok;
+  PyObject *__pyx_n_s_on_failure;
+  PyObject *__pyx_n_s_on_success;
+  PyObject *__pyx_n_s_op;
+  PyObject *__pyx_n_s_operate;
+  PyObject *__pyx_n_s_operation_complete;
+  PyObject *__pyx_n_s_operations;
+  PyObject *__pyx_n_s_operationses_and_tags;
+  PyObject *__pyx_n_s_ops;
+  PyObject *__pyx_n_s_options;
+  PyObject *__pyx_n_s_os;
+  PyObject *__pyx_n_s_out_of_range;
+  PyObject *__pyx_n_s_outbound_initial_metadata;
+  PyObject *__pyx_n_s_outbound_ops;
+  PyObject *__pyx_n_s_partial;
+  PyObject *__pyx_n_s_peer;
+  PyObject *__pyx_n_s_peer_identities;
+  PyObject *__pyx_n_s_peer_identity_key;
+  PyObject *__pyx_n_s_pem_key_cert_pairs;
+  PyObject *__pyx_n_s_pem_root_certificates;
+  PyObject *__pyx_n_s_pem_root_certs;
+  PyObject *__pyx_n_s_permission_denied;
+  PyObject *__pyx_n_s_pickle;
+  PyObject *__pyx_n_s_pkgutil;
+  PyObject *__pyx_n_s_plugin;
+  PyObject *__pyx_n_s_poll;
+  PyObject *__pyx_n_s_poll_wrapper;
+  PyObject *__pyx_n_s_poller;
+  PyObject *__pyx_n_s_pool;
+  PyObject *__pyx_n_s_pop;
+  PyObject *__pyx_n_s_postfork_state_to_reset;
+  PyObject *__pyx_n_s_postfork_states_to_reset;
+  PyObject *__pyx_n_s_prepare;
+  PyObject *__pyx_n_s_primary_user_agent_string;
+  PyObject *__pyx_n_s_print_exc;
+  PyObject *__pyx_n_s_private_key;
+  PyObject *__pyx_n_s_properties;
+  PyObject *__pyx_n_s_property;
+  PyObject *__pyx_n_s_put;
+  PyObject *__pyx_n_s_py_auth_context;
+  PyObject *__pyx_n_s_python_call_credentials;
+  PyObject *__pyx_n_s_pyx_PickleError;
+  PyObject *__pyx_n_s_pyx_capi;
+  PyObject *__pyx_n_s_pyx_checksum;
+  PyObject *__pyx_n_s_pyx_result;
+  PyObject *__pyx_n_s_pyx_state;
+  PyObject *__pyx_n_s_pyx_type;
+  PyObject *__pyx_n_s_pyx_unpickle_AioServer;
+  PyObject *__pyx_n_s_pyx_unpickle_CensusContext;
+  PyObject *__pyx_n_s_pyx_unpickle_ChannelCredential;
+  PyObject *__pyx_n_s_pyx_unpickle_InsecureChannelCr;
+  PyObject *__pyx_n_s_pyx_unpickle__Tag;
+  PyObject *__pyx_n_s_pyx_vtable;
+  PyObject *__pyx_n_s_qualname;
+  PyObject *__pyx_n_s_query_call;
+  PyObject *__pyx_n_s_query_handler;
+  PyObject *__pyx_n_s_query_handlers;
+  PyObject *__pyx_n_s_queue;
+  PyObject *__pyx_n_s_queue_deadline;
+  PyObject *__pyx_kp_s_queue_must_be_live;
+  PyObject *__pyx_kp_s_queue_must_be_shutting_down_to_b;
+  PyObject *__pyx_n_s_queue_shutdown;
+  PyObject *__pyx_n_s_queue_timeout;
+  PyObject *__pyx_n_s_raise_if_not_valid_trailing_meta;
+  PyObject *__pyx_n_s_range;
+  PyObject *__pyx_n_s_raw_message;
+  PyObject *__pyx_n_s_read;
+  PyObject *__pyx_n_s_read_socket;
+  PyObject *__pyx_n_s_ready;
+  PyObject *__pyx_n_s_receive_close_on_server;
+  PyObject *__pyx_n_s_receive_initial_metadata;
+  PyObject *__pyx_n_s_receive_initial_metadata_2;
+  PyObject *__pyx_n_s_receive_initial_metadata_op;
+  PyObject *__pyx_n_s_receive_message;
+  PyObject *__pyx_n_s_receive_message_2;
+  PyObject *__pyx_n_s_receive_message_op;
+  PyObject *__pyx_n_s_receive_op;
+  PyObject *__pyx_n_s_receive_serialized_message;
+  PyObject *__pyx_n_s_receive_status_on_client;
+  PyObject *__pyx_n_s_receive_status_on_client_op;
+  PyObject *__pyx_n_s_received_message;
+  PyObject *__pyx_n_s_recv;
+  PyObject *__pyx_n_s_reduce;
+  PyObject *__pyx_n_s_reduce_cython;
+  PyObject *__pyx_n_s_reduce_ex;
+  PyObject *__pyx_n_s_register;
+  PyObject *__pyx_n_s_register_at_fork;
+  PyObject *__pyx_n_s_register_completion_queue;
+  PyObject *__pyx_n_s_registered_call_handle;
+  PyObject *__pyx_n_s_remove_reader;
+  PyObject *__pyx_n_s_repr;
+  PyObject *__pyx_n_s_repr_2;
+  PyObject *__pyx_n_s_request;
+  PyObject *__pyx_n_s_request_call;
+  PyObject *__pyx_n_s_request_call_2;
+  PyObject *__pyx_n_s_request_call_tag;
+  PyObject *__pyx_n_s_request_deserializer;
+  PyObject *__pyx_n_s_request_iterator;
+  PyObject *__pyx_n_s_request_message;
+  PyObject *__pyx_n_s_request_raw;
+  PyObject *__pyx_n_s_request_streaming;
+  PyObject *__pyx_n_s_reset_grpc_config_vars;
+  PyObject *__pyx_n_s_reset_postfork_child;
+  PyObject *__pyx_n_s_resource_exhausted;
+  PyObject *__pyx_n_s_response;
+  PyObject *__pyx_n_s_response_message;
+  PyObject *__pyx_n_s_response_raw;
+  PyObject *__pyx_n_s_response_serializer;
+  PyObject *__pyx_n_s_response_streaming;
+  PyObject *__pyx_n_s_result;
+  PyObject *__pyx_n_s_retain_self;
+  PyObject *__pyx_n_s_return;
+  PyObject *__pyx_n_s_return_from_user_request_generat;
+  PyObject *__pyx_n_s_rpc_coro;
+  PyObject *__pyx_n_s_rpc_state;
+  PyObject *__pyx_n_s_rpc_task;
+  PyObject *__pyx_n_s_run;
+  PyObject *__pyx_n_s_run_2;
+  PyObject *__pyx_n_s_run_coroutine_threadsafe;
+  PyObject *__pyx_n_s_run_in_executor;
+  PyObject *__pyx_n_s_run_interceptor;
+  PyObject *__pyx_n_s_run_spawn_greenlets;
+  PyObject *__pyx_n_s_run_with_context;
+  PyObject *__pyx_n_s_run_with_context_locals__run;
+  PyObject *__pyx_n_s_runtime_error;
+  PyObject *__pyx_n_s_save_trace_context;
+  PyObject *__pyx_n_s_schedule_coro_threadsafe;
+  PyObject *__pyx_n_s_schedule_rpc_coro;
+  PyObject *__pyx_n_s_secondary_user_agent_string;
+  PyObject *__pyx_n_s_segregated_call;
+  PyObject *__pyx_n_s_segregated_call_locals_on_succe;
+  PyObject *__pyx_n_s_self;
+  PyObject *__pyx_kp_s_self__cq_cannot_be_converted_to;
+  PyObject *__pyx_kp_s_self_arg_cannot_be_converted_to;
+  PyObject *__pyx_kp_s_self_c_argument_cannot_be_conver;
+  PyObject *__pyx_kp_s_self_c_credentials_cannot_be_con;
+  PyObject *__pyx_kp_s_self_c_op_cannot_be_converted_to;
+  PyObject *__pyx_n_s_send;
+  PyObject *__pyx_n_s_send_close_from_client;
+  PyObject *__pyx_n_s_send_close_op;
+  PyObject *__pyx_n_s_send_error_status_from_server;
+  PyObject *__pyx_n_s_send_initial_metadata;
+  PyObject *__pyx_n_s_send_initial_metadata_2;
+  PyObject *__pyx_n_s_send_initial_metadata_op;
+  PyObject *__pyx_n_s_send_message;
+  PyObject *__pyx_n_s_send_message_2;
+  PyObject *__pyx_n_s_send_message_op;
+  PyObject *__pyx_n_s_send_receive_close;
+  PyObject *__pyx_n_s_send_serialized_message;
+  PyObject *__pyx_n_s_send_status_from_server;
+  PyObject *__pyx_n_s_server;
+  PyObject *__pyx_n_s_server_call_tracer;
+  PyObject *__pyx_n_s_server_certificate_config_ssl;
+  PyObject *__pyx_n_s_server_credentials;
+  PyObject *__pyx_n_s_server_credentials_alts;
+  PyObject *__pyx_n_s_server_credentials_local;
+  PyObject *__pyx_n_s_server_credentials_ssl;
+  PyObject *__pyx_n_s_server_credentials_ssl_dynamic_c;
+  PyObject *__pyx_n_s_server_id;
+  PyObject *__pyx_n_s_server_main_loop;
+  PyObject *__pyx_kp_s_server_must_be_started_and_not_s;
+  PyObject *__pyx_n_s_server_queue;
+  PyObject *__pyx_kp_s_server_queue_must_be_a_registere;
+  PyObject *__pyx_n_s_server_started;
+  PyObject *__pyx_n_s_service;
+  PyObject *__pyx_n_s_service_accounts;
+  PyObject *__pyx_n_s_servicer_context;
+  PyObject *__pyx_n_s_serving_task_crash_handler;
+  PyObject *__pyx_n_s_setDaemon;
+  PyObject *__pyx_n_s_set_async_callback_func;
+  PyObject *__pyx_n_s_set_census_context_on_call;
+  PyObject *__pyx_n_s_set_code;
+  PyObject *__pyx_n_s_set_compression;
+  PyObject *__pyx_n_s_set_credentials;
+  PyObject *__pyx_n_s_set_details;
+  PyObject *__pyx_n_s_set_exception;
+  PyObject *__pyx_n_s_set_instrumentation_context_on_c;
+  PyObject *__pyx_n_s_set_internal_error;
+  PyObject *__pyx_n_s_set_name;
+  PyObject *__pyx_n_s_set_result;
+  PyObject *__pyx_n_s_set_server_call_tracer_factory;
+  PyObject *__pyx_n_s_set_trailing_metadata;
+  PyObject *__pyx_n_s_setblocking;
+  PyObject *__pyx_n_s_setstate;
+  PyObject *__pyx_n_s_setstate_cython;
+  PyObject *__pyx_n_s_shield;
+  PyObject *__pyx_n_s_shutdown;
+  PyObject *__pyx_n_s_shutdown_await_next_greenlet;
+  PyObject *__pyx_n_s_shutdown_cq;
+  PyObject *__pyx_n_s_shutdown_grpc_aio;
+  PyObject *__pyx_n_s_shutting_down_server;
+  PyObject *__pyx_n_s_simplefilter;
+  PyObject *__pyx_n_s_sleep;
+  PyObject *__pyx_n_s_socket;
+  PyObject *__pyx_n_s_socket_id;
+  PyObject *__pyx_n_s_socketpair;
+  PyObject *__pyx_n_s_span_id;
+  PyObject *__pyx_n_s_spawn;
+  PyObject *__pyx_n_s_spawn_callback_async;
+  PyObject *__pyx_n_s_spawn_callback_in_thread;
+  PyObject *__pyx_n_s_spawn_greenlets;
+  PyObject *__pyx_n_s_spec;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_10;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_11;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_12;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_13;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_14;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_15;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_16;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_17;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_18;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_19;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_2;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_20;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_21;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_22;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_23;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_3;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_4;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_5;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_6;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_7;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_8;
+  PyObject *__pyx_kp_s_src_python_grpcio_grpc__cython_9;
+  PyObject *__pyx_n_s_ssl_session_cache;
+  PyObject *__pyx_n_s_ssl_target_name_override;
+  PyObject *__pyx_n_s_start;
+  PyObject *__pyx_n_s_start_batch;
+  PyObject *__pyx_n_s_start_channel_id;
+  PyObject *__pyx_n_s_start_client_batch;
+  PyObject *__pyx_n_s_start_server_batch;
+  PyObject *__pyx_n_s_start_server_id;
+  PyObject *__pyx_n_s_start_shutting_down;
+  PyObject *__pyx_n_s_start_socket_id;
+  PyObject *__pyx_n_s_started_tag;
+  PyObject *__pyx_n_s_started_tags;
+  PyObject *__pyx_n_s_state;
+  PyObject *__pyx_n_s_status;
+  PyObject *__pyx_n_s_status_code;
+  PyObject *__pyx_n_s_status_task;
+  PyObject *__pyx_n_s_stored_ctx;
+  PyObject *__pyx_n_s_str;
+  PyObject *__pyx_n_s_str_2;
+  PyObject *__pyx_n_s_stream_handler;
+  PyObject *__pyx_n_s_stream_stream;
+  PyObject *__pyx_n_s_stream_unary;
+  PyObject *__pyx_kp_s_stringsource;
+  PyObject *__pyx_n_s_subchannel_id;
+  PyObject *__pyx_n_s_success;
+  PyObject *__pyx_n_s_super;
+  PyObject *__pyx_n_s_sync_servicer_context;
+  PyObject *__pyx_n_s_sys;
+  PyObject *__pyx_n_s_t;
+  PyObject *__pyx_n_s_tag;
+  PyObject *__pyx_n_s_target;
+  PyObject *__pyx_n_s_task;
+  PyObject *__pyx_n_s_test;
+  PyObject *__pyx_kp_s_the_server_has_already_started;
+  PyObject *__pyx_kp_s_the_server_hasn_t_started_yet;
+  PyObject *__pyx_kp_s_the_server_must_be_shutting_down;
+  PyObject *__pyx_n_s_thread;
+  PyObject *__pyx_n_s_thread_pool;
+  PyObject *__pyx_n_s_threading;
+  PyObject *__pyx_n_s_threadpool;
+  PyObject *__pyx_n_s_throw;
+  PyObject *__pyx_n_s_time;
+  PyObject *__pyx_n_s_time_remaining;
+  PyObject *__pyx_n_s_timeout;
+  PyObject *__pyx_n_s_timeout_secs;
+  PyObject *__pyx_n_s_to_call;
+  PyObject *__pyx_n_s_to_channel_arg;
+  PyObject *__pyx_n_s_too_many_operations;
+  PyObject *__pyx_n_s_trace_id;
+  PyObject *__pyx_n_s_traceback;
+  PyObject *__pyx_n_s_tracing_enabled;
+  PyObject *__pyx_n_s_trailing_metadata;
+  PyObject *__pyx_n_s_transient_failure;
+  PyObject *__pyx_n_s_true;
+  PyObject *__pyx_n_s_try_to_connect;
+  PyObject *__pyx_n_s_type;
+  PyObject *__pyx_n_s_typing;
+  PyObject *__pyx_n_s_uds;
+  PyObject *__pyx_n_s_unary_handler;
+  PyObject *__pyx_n_s_unary_stream;
+  PyObject *__pyx_n_s_unary_unary;
+  PyObject *__pyx_n_s_unauthenticated;
+  PyObject *__pyx_n_s_unavailable;
+  PyObject *__pyx_n_s_unimplemented;
+  PyObject *__pyx_n_s_uninstall_context;
+  PyObject *__pyx_n_s_unknown;
+  PyObject *__pyx_n_s_unused_future;
+  PyObject *__pyx_n_s_unused_task;
+  PyObject *__pyx_n_s_update;
+  PyObject *__pyx_n_s_upper;
+  PyObject *__pyx_n_s_use_setstate;
+  PyObject *__pyx_n_s_used_mask;
+  PyObject *__pyx_n_s_user_tag;
+  PyObject *__pyx_n_s_utf8;
+  PyObject *__pyx_kp_s_utf_8;
+  PyObject *__pyx_n_s_value;
+  PyObject *__pyx_n_s_values;
+  PyObject *__pyx_n_s_wait;
+  PyObject *__pyx_n_s_wait_for;
+  PyObject *__pyx_n_s_wait_for_ready;
+  PyObject *__pyx_n_s_wait_for_ready_explicitly_set;
+  PyObject *__pyx_n_s_wait_for_termination;
+  PyObject *__pyx_n_s_wait_time;
+  PyObject *__pyx_n_s_warning;
+  PyObject *__pyx_n_s_warnings;
+  PyObject *__pyx_n_s_watch_connectivity_state;
+  PyObject *__pyx_n_s_wrap;
+  PyObject *__pyx_n_s_wrapper;
+  PyObject *__pyx_n_s_write;
+  PyObject *__pyx_n_s_write_flag;
+  PyObject *__pyx_n_s_xds;
+  PyObject *__pyx_n_s_xds_server_credentials;
+  PyObject *__pyx_n_s_yes;
+  PyObject *__pyx_n_s_yield_to_queue;
+  PyObject *__pyx_float_1_0;
+  PyObject *__pyx_int_0;
+  PyObject *__pyx_int_1;
+  PyObject *__pyx_int_5;
+  PyObject *__pyx_int_118587260;
+  PyObject *__pyx_int_171381981;
+  PyObject *__pyx_int_171651213;
+  PyObject *__pyx_int_222419149;
+  PyObject *__pyx_int_228825662;
+  PyObject *__pyx_int_238750788;
+  grpc_status_code __pyx_k__9;
+  PyObject *__pyx_k__76;
+  PyObject *__pyx_k__80;
+  PyObject *__pyx_tuple_;
+  PyObject *__pyx_tuple__4;
+  PyObject *__pyx_tuple__8;
+  PyObject *__pyx_slice__37;
+  PyObject *__pyx_tuple__10;
+  PyObject *__pyx_tuple__11;
+  PyObject *__pyx_tuple__12;
+  PyObject *__pyx_tuple__14;
+  PyObject *__pyx_tuple__17;
+  PyObject *__pyx_tuple__19;
+  PyObject *__pyx_tuple__21;
+  PyObject *__pyx_tuple__23;
+  PyObject *__pyx_tuple__24;
+  PyObject *__pyx_tuple__25;
+  PyObject *__pyx_tuple__26;
+  PyObject *__pyx_tuple__27;
+  PyObject *__pyx_tuple__28;
+  PyObject *__pyx_tuple__29;
+  PyObject *__pyx_tuple__30;
+  PyObject *__pyx_tuple__31;
+  PyObject *__pyx_tuple__32;
+  PyObject *__pyx_tuple__33;
+  PyObject *__pyx_tuple__34;
+  PyObject *__pyx_tuple__35;
+  PyObject *__pyx_tuple__36;
+  PyObject *__pyx_tuple__39;
+  PyObject *__pyx_tuple__40;
+  PyObject *__pyx_tuple__46;
+  PyObject *__pyx_tuple__48;
+  PyObject *__pyx_tuple__50;
+  PyObject *__pyx_tuple__79;
+  PyObject *__pyx_tuple__83;
+  PyObject *__pyx_tuple__93;
+  PyObject *__pyx_tuple__98;
+  PyObject *__pyx_codeobj__2;
+  PyObject *__pyx_codeobj__3;
+  PyObject *__pyx_codeobj__5;
+  PyObject *__pyx_codeobj__6;
+  PyObject *__pyx_tuple__105;
+  PyObject *__pyx_tuple__106;
+  PyObject *__pyx_tuple__108;
+  PyObject *__pyx_tuple__110;
+  PyObject *__pyx_tuple__116;
+  PyObject *__pyx_tuple__118;
+  PyObject *__pyx_tuple__121;
+  PyObject *__pyx_tuple__123;
+  PyObject *__pyx_tuple__125;
+  PyObject *__pyx_tuple__127;
+  PyObject *__pyx_tuple__138;
+  PyObject *__pyx_tuple__144;
+  PyObject *__pyx_tuple__148;
+  PyObject *__pyx_tuple__150;
+  PyObject *__pyx_tuple__152;
+  PyObject *__pyx_tuple__153;
+  PyObject *__pyx_tuple__156;
+  PyObject *__pyx_tuple__158;
+  PyObject *__pyx_tuple__162;
+  PyObject *__pyx_tuple__166;
+  PyObject *__pyx_tuple__168;
+  PyObject *__pyx_tuple__170;
+  PyObject *__pyx_tuple__172;
+  PyObject *__pyx_tuple__174;
+  PyObject *__pyx_tuple__176;
+  PyObject *__pyx_tuple__178;
+  PyObject *__pyx_tuple__180;
+  PyObject *__pyx_tuple__182;
+  PyObject *__pyx_tuple__184;
+  PyObject *__pyx_tuple__186;
+  PyObject *__pyx_tuple__194;
+  PyObject *__pyx_tuple__209;
+  PyObject *__pyx_tuple__211;
+  PyObject *__pyx_tuple__213;
+  PyObject *__pyx_tuple__217;
+  PyObject *__pyx_tuple__222;
+  PyObject *__pyx_tuple__224;
+  PyObject *__pyx_tuple__226;
+  PyObject *__pyx_tuple__230;
+  PyObject *__pyx_tuple__232;
+  PyObject *__pyx_tuple__236;
+  PyObject *__pyx_tuple__238;
+  PyObject *__pyx_tuple__241;
+  PyObject *__pyx_tuple__254;
+  PyObject *__pyx_tuple__255;
+  PyObject *__pyx_tuple__293;
+  PyObject *__pyx_tuple__296;
+  PyObject *__pyx_tuple__301;
+  PyObject *__pyx_tuple__304;
+  PyObject *__pyx_tuple__306;
+  PyObject *__pyx_tuple__308;
+  PyObject *__pyx_tuple__310;
+  PyObject *__pyx_tuple__312;
+  PyObject *__pyx_tuple__314;
+  PyObject *__pyx_tuple__316;
+  PyObject *__pyx_tuple__317;
+  PyObject *__pyx_tuple__319;
+  PyObject *__pyx_tuple__335;
+  PyObject *__pyx_tuple__342;
+  PyObject *__pyx_tuple__346;
+  PyObject *__pyx_tuple__349;
+  PyObject *__pyx_tuple__353;
+  PyObject *__pyx_tuple__356;
+  PyObject *__pyx_tuple__358;
+  PyObject *__pyx_tuple__360;
+  PyObject *__pyx_tuple__362;
+  PyObject *__pyx_tuple__364;
+  PyObject *__pyx_tuple__366;
+  PyObject *__pyx_tuple__368;
+  PyObject *__pyx_tuple__370;
+  PyObject *__pyx_tuple__371;
+  PyObject *__pyx_tuple__372;
+  PyObject *__pyx_tuple__374;
+  PyObject *__pyx_tuple__375;
+  PyObject *__pyx_tuple__379;
+  PyObject *__pyx_tuple__385;
+  PyObject *__pyx_tuple__388;
+  PyObject *__pyx_tuple__389;
+  PyObject *__pyx_tuple__393;
+  PyObject *__pyx_tuple__395;
+  PyObject *__pyx_tuple__396;
+  PyObject *__pyx_tuple__403;
+  PyObject *__pyx_tuple__405;
+  PyObject *__pyx_tuple__406;
+  PyObject *__pyx_tuple__409;
+  PyObject *__pyx_tuple__417;
+  PyObject *__pyx_tuple__424;
+  PyObject *__pyx_tuple__427;
+  PyObject *__pyx_tuple__435;
+  PyObject *__pyx_tuple__436;
+  PyObject *__pyx_tuple__437;
+  PyObject *__pyx_tuple__438;
+  PyObject *__pyx_tuple__439;
+  PyObject *__pyx_tuple__440;
+  PyObject *__pyx_tuple__441;
+  PyObject *__pyx_tuple__444;
+  PyObject *__pyx_tuple__448;
+  PyObject *__pyx_tuple__450;
+  PyObject *__pyx_tuple__453;
+  PyObject *__pyx_tuple__457;
+  PyObject *__pyx_tuple__460;
+  PyObject *__pyx_tuple__462;
+  PyObject *__pyx_tuple__463;
+  PyObject *__pyx_tuple__464;
+  PyObject *__pyx_tuple__465;
+  PyObject *__pyx_tuple__466;
+  PyObject *__pyx_tuple__467;
+  PyObject *__pyx_tuple__468;
+  PyObject *__pyx_tuple__472;
+  PyObject *__pyx_tuple__476;
+  PyObject *__pyx_tuple__484;
+  PyObject *__pyx_tuple__485;
+  PyObject *__pyx_tuple__486;
+  PyObject *__pyx_tuple__487;
+  PyObject *__pyx_tuple__491;
+  PyObject *__pyx_tuple__494;
+  PyObject *__pyx_tuple__497;
+  PyObject *__pyx_tuple__500;
+  PyObject *__pyx_tuple__502;
+  PyObject *__pyx_tuple__504;
+  PyObject *__pyx_tuple__506;
+  PyObject *__pyx_tuple__509;
+  PyObject *__pyx_tuple__515;
+  PyObject *__pyx_tuple__517;
+  PyObject *__pyx_tuple__533;
+  PyObject *__pyx_tuple__534;
+  PyObject *__pyx_tuple__536;
+  PyObject *__pyx_tuple__537;
+  PyObject *__pyx_tuple__538;
+  PyObject *__pyx_tuple__539;
+  PyObject *__pyx_tuple__542;
+  PyObject *__pyx_tuple__543;
+  PyObject *__pyx_tuple__544;
+  PyObject *__pyx_tuple__545;
+  PyObject *__pyx_tuple__546;
+  PyObject *__pyx_tuple__548;
+  PyObject *__pyx_tuple__550;
+  PyObject *__pyx_tuple__554;
+  PyObject *__pyx_tuple__556;
+  PyObject *__pyx_tuple__558;
+  PyObject *__pyx_tuple__560;
+  PyObject *__pyx_tuple__561;
+  PyObject *__pyx_tuple__562;
+  PyObject *__pyx_tuple__564;
+  PyObject *__pyx_tuple__565;
+  PyObject *__pyx_tuple__566;
+  PyObject *__pyx_tuple__570;
+  PyObject *__pyx_codeobj__13;
+  PyObject *__pyx_codeobj__15;
+  PyObject *__pyx_codeobj__16;
+  PyObject *__pyx_codeobj__18;
+  PyObject *__pyx_codeobj__20;
+  PyObject *__pyx_codeobj__22;
+  PyObject *__pyx_codeobj__41;
+  PyObject *__pyx_codeobj__42;
+  PyObject *__pyx_codeobj__43;
+  PyObject *__pyx_codeobj__44;
+  PyObject *__pyx_codeobj__45;
+  PyObject *__pyx_codeobj__47;
+  PyObject *__pyx_codeobj__51;
+  PyObject *__pyx_codeobj__52;
+  PyObject *__pyx_codeobj__53;
+  PyObject *__pyx_codeobj__54;
+  PyObject *__pyx_codeobj__55;
+  PyObject *__pyx_codeobj__56;
+  PyObject *__pyx_codeobj__59;
+  PyObject *__pyx_codeobj__60;
+  PyObject *__pyx_codeobj__61;
+  PyObject *__pyx_codeobj__62;
+  PyObject *__pyx_codeobj__63;
+  PyObject *__pyx_codeobj__64;
+  PyObject *__pyx_codeobj__65;
+  PyObject *__pyx_codeobj__66;
+  PyObject *__pyx_codeobj__67;
+  PyObject *__pyx_codeobj__68;
+  PyObject *__pyx_codeobj__72;
+  PyObject *__pyx_codeobj__73;
+  PyObject *__pyx_codeobj__74;
+  PyObject *__pyx_codeobj__75;
+  PyObject *__pyx_codeobj__77;
+  PyObject *__pyx_codeobj__78;
+  PyObject *__pyx_codeobj__81;
+  PyObject *__pyx_codeobj__82;
+  PyObject *__pyx_codeobj__84;
+  PyObject *__pyx_codeobj__85;
+  PyObject *__pyx_codeobj__86;
+  PyObject *__pyx_codeobj__87;
+  PyObject *__pyx_codeobj__88;
+  PyObject *__pyx_codeobj__89;
+  PyObject *__pyx_codeobj__90;
+  PyObject *__pyx_codeobj__91;
+  PyObject *__pyx_codeobj__92;
+  PyObject *__pyx_codeobj__94;
+  PyObject *__pyx_codeobj__95;
+  PyObject *__pyx_codeobj__96;
+  PyObject *__pyx_codeobj__97;
+  PyObject *__pyx_codeobj__99;
+  PyObject *__pyx_codeobj__100;
+  PyObject *__pyx_codeobj__101;
+  PyObject *__pyx_codeobj__102;
+  PyObject *__pyx_codeobj__103;
+  PyObject *__pyx_codeobj__104;
+  PyObject *__pyx_codeobj__109;
+  PyObject *__pyx_codeobj__111;
+  PyObject *__pyx_codeobj__112;
+  PyObject *__pyx_codeobj__113;
+  PyObject *__pyx_codeobj__114;
+  PyObject *__pyx_codeobj__115;
+  PyObject *__pyx_codeobj__117;
+  PyObject *__pyx_codeobj__119;
+  PyObject *__pyx_codeobj__120;
+  PyObject *__pyx_codeobj__122;
+  PyObject *__pyx_codeobj__124;
+  PyObject *__pyx_codeobj__126;
+  PyObject *__pyx_codeobj__128;
+  PyObject *__pyx_codeobj__129;
+  PyObject *__pyx_codeobj__130;
+  PyObject *__pyx_codeobj__131;
+  PyObject *__pyx_codeobj__132;
+  PyObject *__pyx_codeobj__133;
+  PyObject *__pyx_codeobj__134;
+  PyObject *__pyx_codeobj__135;
+  PyObject *__pyx_codeobj__136;
+  PyObject *__pyx_codeobj__137;
+  PyObject *__pyx_codeobj__139;
+  PyObject *__pyx_codeobj__140;
+  PyObject *__pyx_codeobj__141;
+  PyObject *__pyx_codeobj__142;
+  PyObject *__pyx_codeobj__143;
+  PyObject *__pyx_codeobj__145;
+  PyObject *__pyx_codeobj__146;
+  PyObject *__pyx_codeobj__147;
+  PyObject *__pyx_codeobj__149;
+  PyObject *__pyx_codeobj__151;
+  PyObject *__pyx_codeobj__154;
+  PyObject *__pyx_codeobj__155;
+  PyObject *__pyx_codeobj__157;
+  PyObject *__pyx_codeobj__159;
+  PyObject *__pyx_codeobj__160;
+  PyObject *__pyx_codeobj__161;
+  PyObject *__pyx_codeobj__163;
+  PyObject *__pyx_codeobj__164;
+  PyObject *__pyx_codeobj__165;
+  PyObject *__pyx_codeobj__167;
+  PyObject *__pyx_codeobj__169;
+  PyObject *__pyx_codeobj__171;
+  PyObject *__pyx_codeobj__173;
+  PyObject *__pyx_codeobj__175;
+  PyObject *__pyx_codeobj__177;
+  PyObject *__pyx_codeobj__179;
+  PyObject *__pyx_codeobj__181;
+  PyObject *__pyx_codeobj__183;
+  PyObject *__pyx_codeobj__185;
+  PyObject *__pyx_codeobj__187;
+  PyObject *__pyx_codeobj__188;
+  PyObject *__pyx_codeobj__189;
+  PyObject *__pyx_codeobj__190;
+  PyObject *__pyx_codeobj__191;
+  PyObject *__pyx_codeobj__192;
+  PyObject *__pyx_codeobj__193;
+  PyObject *__pyx_codeobj__195;
+  PyObject *__pyx_codeobj__196;
+  PyObject *__pyx_codeobj__197;
+  PyObject *__pyx_codeobj__198;
+  PyObject *__pyx_codeobj__199;
+  PyObject *__pyx_codeobj__200;
+  PyObject *__pyx_codeobj__201;
+  PyObject *__pyx_codeobj__202;
+  PyObject *__pyx_codeobj__203;
+  PyObject *__pyx_codeobj__204;
+  PyObject *__pyx_codeobj__205;
+  PyObject *__pyx_codeobj__206;
+  PyObject *__pyx_codeobj__207;
+  PyObject *__pyx_codeobj__208;
+  PyObject *__pyx_codeobj__210;
+  PyObject *__pyx_codeobj__212;
+  PyObject *__pyx_codeobj__214;
+  PyObject *__pyx_codeobj__215;
+  PyObject *__pyx_codeobj__216;
+  PyObject *__pyx_codeobj__218;
+  PyObject *__pyx_codeobj__219;
+  PyObject *__pyx_codeobj__220;
+  PyObject *__pyx_codeobj__221;
+  PyObject *__pyx_codeobj__223;
+  PyObject *__pyx_codeobj__225;
+  PyObject *__pyx_codeobj__227;
+  PyObject *__pyx_codeobj__228;
+  PyObject *__pyx_codeobj__229;
+  PyObject *__pyx_codeobj__231;
+  PyObject *__pyx_codeobj__233;
+  PyObject *__pyx_codeobj__234;
+  PyObject *__pyx_codeobj__235;
+  PyObject *__pyx_codeobj__237;
+  PyObject *__pyx_codeobj__239;
+  PyObject *__pyx_codeobj__240;
+  PyObject *__pyx_codeobj__242;
+  PyObject *__pyx_codeobj__243;
+  PyObject *__pyx_codeobj__244;
+  PyObject *__pyx_codeobj__245;
+  PyObject *__pyx_codeobj__246;
+  PyObject *__pyx_codeobj__247;
+  PyObject *__pyx_codeobj__248;
+  PyObject *__pyx_codeobj__249;
+  PyObject *__pyx_codeobj__250;
+  PyObject *__pyx_codeobj__251;
+  PyObject *__pyx_codeobj__252;
+  PyObject *__pyx_codeobj__253;
+  PyObject *__pyx_codeobj__256;
+  PyObject *__pyx_codeobj__257;
+  PyObject *__pyx_codeobj__258;
+  PyObject *__pyx_codeobj__259;
+  PyObject *__pyx_codeobj__260;
+  PyObject *__pyx_codeobj__261;
+  PyObject *__pyx_codeobj__262;
+  PyObject *__pyx_codeobj__263;
+  PyObject *__pyx_codeobj__264;
+  PyObject *__pyx_codeobj__265;
+  PyObject *__pyx_codeobj__266;
+  PyObject *__pyx_codeobj__267;
+  PyObject *__pyx_codeobj__268;
+  PyObject *__pyx_codeobj__269;
+  PyObject *__pyx_codeobj__270;
+  PyObject *__pyx_codeobj__271;
+  PyObject *__pyx_codeobj__272;
+  PyObject *__pyx_codeobj__273;
+  PyObject *__pyx_codeobj__274;
+  PyObject *__pyx_codeobj__275;
+  PyObject *__pyx_codeobj__276;
+  PyObject *__pyx_codeobj__277;
+  PyObject *__pyx_codeobj__278;
+  PyObject *__pyx_codeobj__279;
+  PyObject *__pyx_codeobj__280;
+  PyObject *__pyx_codeobj__281;
+  PyObject *__pyx_codeobj__282;
+  PyObject *__pyx_codeobj__283;
+  PyObject *__pyx_codeobj__284;
+  PyObject *__pyx_codeobj__285;
+  PyObject *__pyx_codeobj__286;
+  PyObject *__pyx_codeobj__287;
+  PyObject *__pyx_codeobj__288;
+  PyObject *__pyx_codeobj__289;
+  PyObject *__pyx_codeobj__290;
+  PyObject *__pyx_codeobj__291;
+  PyObject *__pyx_codeobj__292;
+  PyObject *__pyx_codeobj__294;
+  PyObject *__pyx_codeobj__295;
+  PyObject *__pyx_codeobj__297;
+  PyObject *__pyx_codeobj__298;
+  PyObject *__pyx_codeobj__299;
+  PyObject *__pyx_codeobj__300;
+  PyObject *__pyx_codeobj__302;
+  PyObject *__pyx_codeobj__303;
+  PyObject *__pyx_codeobj__305;
+  PyObject *__pyx_codeobj__307;
+  PyObject *__pyx_codeobj__309;
+  PyObject *__pyx_codeobj__311;
+  PyObject *__pyx_codeobj__313;
+  PyObject *__pyx_codeobj__315;
+  PyObject *__pyx_codeobj__318;
+  PyObject *__pyx_codeobj__320;
+  PyObject *__pyx_codeobj__321;
+  PyObject *__pyx_codeobj__322;
+  PyObject *__pyx_codeobj__323;
+  PyObject *__pyx_codeobj__324;
+  PyObject *__pyx_codeobj__325;
+  PyObject *__pyx_codeobj__326;
+  PyObject *__pyx_codeobj__327;
+  PyObject *__pyx_codeobj__328;
+  PyObject *__pyx_codeobj__329;
+  PyObject *__pyx_codeobj__330;
+  PyObject *__pyx_codeobj__331;
+  PyObject *__pyx_codeobj__332;
+  PyObject *__pyx_codeobj__333;
+  PyObject *__pyx_codeobj__334;
+  PyObject *__pyx_codeobj__336;
+  PyObject *__pyx_codeobj__337;
+  PyObject *__pyx_codeobj__338;
+  PyObject *__pyx_codeobj__339;
+  PyObject *__pyx_codeobj__340;
+  PyObject *__pyx_codeobj__341;
+  PyObject *__pyx_codeobj__343;
+  PyObject *__pyx_codeobj__344;
+  PyObject *__pyx_codeobj__345;
+  PyObject *__pyx_codeobj__347;
+  PyObject *__pyx_codeobj__348;
+  PyObject *__pyx_codeobj__350;
+  PyObject *__pyx_codeobj__351;
+  PyObject *__pyx_codeobj__352;
+  PyObject *__pyx_codeobj__354;
+  PyObject *__pyx_codeobj__355;
+  PyObject *__pyx_codeobj__357;
+  PyObject *__pyx_codeobj__359;
+  PyObject *__pyx_codeobj__361;
+  PyObject *__pyx_codeobj__363;
+  PyObject *__pyx_codeobj__365;
+  PyObject *__pyx_codeobj__367;
+  PyObject *__pyx_codeobj__369;
+  PyObject *__pyx_codeobj__373;
+  PyObject *__pyx_codeobj__376;
+  PyObject *__pyx_codeobj__377;
+  PyObject *__pyx_codeobj__378;
+  PyObject *__pyx_codeobj__380;
+  PyObject *__pyx_codeobj__381;
+  PyObject *__pyx_codeobj__382;
+  PyObject *__pyx_codeobj__383;
+  PyObject *__pyx_codeobj__384;
+  PyObject *__pyx_codeobj__386;
+  PyObject *__pyx_codeobj__387;
+  PyObject *__pyx_codeobj__390;
+  PyObject *__pyx_codeobj__391;
+  PyObject *__pyx_codeobj__392;
+  PyObject *__pyx_codeobj__394;
+  PyObject *__pyx_codeobj__397;
+  PyObject *__pyx_codeobj__398;
+  PyObject *__pyx_codeobj__399;
+  PyObject *__pyx_codeobj__400;
+  PyObject *__pyx_codeobj__401;
+  PyObject *__pyx_codeobj__402;
+  PyObject *__pyx_codeobj__404;
+  PyObject *__pyx_codeobj__407;
+  PyObject *__pyx_codeobj__408;
+  PyObject *__pyx_codeobj__410;
+  PyObject *__pyx_codeobj__411;
+  PyObject *__pyx_codeobj__412;
+  PyObject *__pyx_codeobj__413;
+  PyObject *__pyx_codeobj__414;
+  PyObject *__pyx_codeobj__415;
+  PyObject *__pyx_codeobj__416;
+  PyObject *__pyx_codeobj__418;
+  PyObject *__pyx_codeobj__419;
+  PyObject *__pyx_codeobj__420;
+  PyObject *__pyx_codeobj__421;
+  PyObject *__pyx_codeobj__422;
+  PyObject *__pyx_codeobj__423;
+  PyObject *__pyx_codeobj__425;
+  PyObject *__pyx_codeobj__426;
+  PyObject *__pyx_codeobj__428;
+  PyObject *__pyx_codeobj__429;
+  PyObject *__pyx_codeobj__430;
+  PyObject *__pyx_codeobj__431;
+  PyObject *__pyx_codeobj__432;
+  PyObject *__pyx_codeobj__433;
+  PyObject *__pyx_codeobj__434;
+  PyObject *__pyx_codeobj__442;
+  PyObject *__pyx_codeobj__443;
+  PyObject *__pyx_codeobj__445;
+  PyObject *__pyx_codeobj__446;
+  PyObject *__pyx_codeobj__447;
+  PyObject *__pyx_codeobj__449;
+  PyObject *__pyx_codeobj__451;
+  PyObject *__pyx_codeobj__452;
+  PyObject *__pyx_codeobj__454;
+  PyObject *__pyx_codeobj__455;
+  PyObject *__pyx_codeobj__456;
+  PyObject *__pyx_codeobj__458;
+  PyObject *__pyx_codeobj__459;
+  PyObject *__pyx_codeobj__461;
+  PyObject *__pyx_codeobj__469;
+  PyObject *__pyx_codeobj__470;
+  PyObject *__pyx_codeobj__471;
+  PyObject *__pyx_codeobj__473;
+  PyObject *__pyx_codeobj__474;
+  PyObject *__pyx_codeobj__475;
+  PyObject *__pyx_codeobj__477;
+  PyObject *__pyx_codeobj__478;
+  PyObject *__pyx_codeobj__479;
+  PyObject *__pyx_codeobj__480;
+  PyObject *__pyx_codeobj__481;
+  PyObject *__pyx_codeobj__482;
+  PyObject *__pyx_codeobj__483;
+  PyObject *__pyx_codeobj__488;
+  PyObject *__pyx_codeobj__489;
+  PyObject *__pyx_codeobj__490;
+  PyObject *__pyx_codeobj__492;
+  PyObject *__pyx_codeobj__493;
+  PyObject *__pyx_codeobj__495;
+  PyObject *__pyx_codeobj__496;
+  PyObject *__pyx_codeobj__498;
+  PyObject *__pyx_codeobj__499;
+  PyObject *__pyx_codeobj__501;
+  PyObject *__pyx_codeobj__503;
+  PyObject *__pyx_codeobj__505;
+  PyObject *__pyx_codeobj__507;
+  PyObject *__pyx_codeobj__508;
+  PyObject *__pyx_codeobj__510;
+  PyObject *__pyx_codeobj__511;
+  PyObject *__pyx_codeobj__512;
+  PyObject *__pyx_codeobj__513;
+  PyObject *__pyx_codeobj__514;
+  PyObject *__pyx_codeobj__516;
+  PyObject *__pyx_codeobj__518;
+  PyObject *__pyx_codeobj__519;
+  PyObject *__pyx_codeobj__520;
+  PyObject *__pyx_codeobj__521;
+  PyObject *__pyx_codeobj__522;
+  PyObject *__pyx_codeobj__523;
+  PyObject *__pyx_codeobj__524;
+  PyObject *__pyx_codeobj__525;
+  PyObject *__pyx_codeobj__526;
+  PyObject *__pyx_codeobj__527;
+  PyObject *__pyx_codeobj__528;
+  PyObject *__pyx_codeobj__529;
+  PyObject *__pyx_codeobj__530;
+  PyObject *__pyx_codeobj__531;
+  PyObject *__pyx_codeobj__532;
+  PyObject *__pyx_codeobj__535;
+  PyObject *__pyx_codeobj__540;
+  PyObject *__pyx_codeobj__541;
+  PyObject *__pyx_codeobj__547;
+  PyObject *__pyx_codeobj__549;
+  PyObject *__pyx_codeobj__551;
+  PyObject *__pyx_codeobj__552;
+  PyObject *__pyx_codeobj__553;
+  PyObject *__pyx_codeobj__555;
+  PyObject *__pyx_codeobj__557;
+  PyObject *__pyx_codeobj__559;
+  PyObject *__pyx_codeobj__563;
+  PyObject *__pyx_codeobj__567;
+  PyObject *__pyx_codeobj__568;
+  PyObject *__pyx_codeobj__569;
+  PyObject *__pyx_codeobj__571;
+  PyObject *__pyx_codeobj__572;
+  PyObject *__pyx_codeobj__573;
+  PyObject *__pyx_codeobj__574;
+  PyObject *__pyx_codeobj__575;
+} __pyx_mstate;
+
+#if CYTHON_USE_MODULE_STATE
+#ifdef __cplusplus
+namespace {
+  extern struct PyModuleDef __pyx_moduledef;
+} /* anonymous namespace */
+#else
+static struct PyModuleDef __pyx_moduledef;
+#endif
+
+#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o))
+
+#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef)))
+
+#define __pyx_m (PyState_FindModule(&__pyx_moduledef))
+#else
+static __pyx_mstate __pyx_mstate_global_static =
+#ifdef __cplusplus
+    {};
+#else
+    {0};
+#endif
+static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static;
+#endif
+/* #### Code section: module_state_clear ### */
+#if CYTHON_USE_MODULE_STATE
+static int __pyx_m_clear(PyObject *m) {
+  __pyx_mstate *clear_module_state = __pyx_mstate(m);
+  if (!clear_module_state) return 0;
+  Py_CLEAR(clear_module_state->__pyx_d);
+  Py_CLEAR(clear_module_state->__pyx_b);
+  Py_CLEAR(clear_module_state->__pyx_cython_runtime);
+  Py_CLEAR(clear_module_state->__pyx_empty_tuple);
+  Py_CLEAR(clear_module_state->__pyx_empty_bytes);
+  Py_CLEAR(clear_module_state->__pyx_empty_unicode);
+  #ifdef __Pyx_CyFunction_USED
+  Py_CLEAR(clear_module_state->__pyx_CyFunctionType);
+  #endif
+  #ifdef __Pyx_FusedFunction_USED
+  Py_CLEAR(clear_module_state->__pyx_FusedFunctionType);
+  #endif
+  Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4bool_bool);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_7complex_complex);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__ChannelArg);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__ChannelArg);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__ChannelArgs);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__ChannelArgs);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_Call);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_Call);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__CallState);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__CallState);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__ChannelState);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__ChannelState);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_IntegratedCall);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_IntegratedCall);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_SegregatedCall);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_SegregatedCall);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_Channel);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_Channel);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CallHandle);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CallHandle);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CompositeCallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_SSLChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CompositeChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_XDSChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ServerCertificateConfig);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ServerCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ServerCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_LocalChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ALTSChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__LatentEventArg);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__LatentEventArg);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_BaseEvent);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_BaseEvent);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ConnectivityEvent);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_RequestCallEvent);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_RequestCallEvent);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_BatchOperationEvent);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ServerShutdownEvent);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_Operation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_Operation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_SendMessageOperation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_SendMessageOperation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ReceiveMessageOperation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CallDetails);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CallDetails);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_SslPemKeyCertPair);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CompressionOptions);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CompressionOptions);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_Server);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_Server);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__Tag);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__Tag);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__ConnectivityTag);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__ConnectivityTag);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__RequestCallTag);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__RequestCallTag);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__BatchOperationTag);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__BatchOperationTag);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__ServerShutdownTag);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_BaseCompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__BoundEventLoop);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__BoundEventLoop);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_PollerCompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_AioRpcStatus);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_AioRpcStatus);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__AioState);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__AioState);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CallbackFailureHandler);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CallbackWrapper);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CallbackWrapper);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_GrpcCallWrapper);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__AioCall);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__AioCall);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_AioChannel);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_AioChannel);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__HandlerCallDetails);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__HandlerCallDetails);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_RPCState);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_RPCState);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__ServicerContext);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__SyncServicerContext);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__MessageReceiver);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__MessageReceiver);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_AioServer);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_AioServer);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc__GrpcArgWrapper);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_InsecureChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc_CensusContext);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc_CensusContext);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init__);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext__);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown);
+  Py_CLEAR(clear_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination);
+  Py_CLEAR(clear_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination);
+  Py_CLEAR(clear_module_state->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg);
+  Py_CLEAR(clear_module_state->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg);
+  Py_CLEAR(clear_module_state->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_);
+  Py_CLEAR(clear_module_state->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_);
+  Py_CLEAR(clear_module_state->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args);
+  Py_CLEAR(clear_module_state->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args);
+  Py_CLEAR(clear_module_state->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_);
+  Py_CLEAR(clear_module_state->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_0);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_1);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ALTSChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ALTSChannelCredentials___reduce);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ALTSChannelCredentials___setstat);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AWAIT_THREADS_TIMEOUT_SECONDS);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AbortError);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Abort_already_called);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Abort_error_has_been_replaced);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Abort_error_unexpectedly_suppres);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Aborting_method_s_due_to_server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ActiveThreadCount);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ActiveThreadCount___init);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ActiveThreadCount_await_zero_th);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ActiveThreadCount_decrement);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ActiveThreadCount_increment);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall__handle_status_once_rec);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall__repr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_add_done_callback);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_cancel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_cancelled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_done);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_initiate_stream_stream);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_initiate_unary_stream);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_is_locally_cancelled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_is_ok);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_receive_serialized_mess);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_send_receive_close);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_send_serialized_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_set_internal_error);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_status);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_stream_unary);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_time_remaining);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioCall_unary_unary);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel_check_connectivity_st);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel_close);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel_closed);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel_closing);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioChannel_watch_connectivity_st);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioRpcStatus);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioRpcStatus___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioRpcStatus___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioRpcStatus_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioRpcStatus_debug_error_string);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioRpcStatus_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioRpcStatus_trailing_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer__request_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer__server_main_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer__serving_task_crash_ha);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer__start_shutting_down);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer_add_generic_rpc_handle);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer_add_insecure_port);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer_add_secure_port);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer_is_running);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer_shutdown);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer_start);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioServer_wait_for_termination);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioState);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioState___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AioState___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AsyncIOEngine);
+  Py_CLEAR(clear_module_state->__pyx_n_s_AttributeError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BaseCompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BaseCompletionQueue___reduce_cyt);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BaseCompletionQueue___setstate_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BaseError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BaseEvent);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BatchOperationEvent);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BatchOperationEvent___reduce_cyt);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BatchOperationEvent___setstate_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BatchOperationTag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BatchOperationTag___reduce_cyth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BatchOperationTag___setstate_cy);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Binary_metadata_key_s_expected_b);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BoundEventLoop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BoundEventLoop___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BoundEventLoop___setstate_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_BoundEventLoop_close);
+  Py_CLEAR(clear_module_state->__pyx_n_s_COMPRESSION_METADATA_STRING_MAP);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CUSTOM_IO_MANAGER);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CYGRPC_STATUS_CODE_TO_STATUS_COD);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallCredentials___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallCredentials___setstate_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallDetails);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallDetails___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallDetails___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallHandle);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallHandle___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallHandle___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallState);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallState___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallState___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call__custom_op_on_c_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call__start_batch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call_cancel);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Call_credentials_are_only_valid);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Call_credentials_may_not_be_NULL);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call_peer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call_set_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call_start_client_batch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Call_start_server_batch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallbackFailureHandler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallbackFailureHandler___reduce);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallbackFailureHandler___setstat);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallbackWrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallbackWrapper___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CallbackWrapper___setstate_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CancelledError);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_invoke_RPC_on_closed_chan);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_invoke_RPC_s);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Cannot_monitor_channel_state_s);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CensusContext);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CensusContext___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CensusContext___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelArg);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelArgKey);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelArg___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelArg___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelArgs);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelArgs___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelArgs___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelCredentials___reduce_cyth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelCredentials___setstate_cy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelState);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelState___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ChannelState___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_check_connectivity_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_close);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_close_on_fork);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_get_registered_call_hand);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_integrated_call);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Channel_is_closed);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_next_call_event);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_segregated_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_target);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Channel_watch_connectivity_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompletionQueue___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompletionQueue___setstate_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompletionQueue__internal_poll);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompletionQueue_clear);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompletionQueue_poll);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompletionQueue_shutdown);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompletionType);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompositeCallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompositeCallCredentials___reduc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompositeCallCredentials___setst);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompositeChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompositeChannelCredentials___re);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompositeChannelCredentials___se);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionAlgorithm);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionLevel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionOptions);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionOptions___reduce_cyth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionOptions___setstate_cy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionOptions_disable_algor);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionOptions_enable_algori);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionOptions_is_algorithm);
+  Py_CLEAR(clear_module_state->__pyx_n_s_CompressionOptions_to_channel_ar);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Compression_setting_must_be_spec);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ComputeEngineChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ComputeEngineChannelCredentials_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ComputeEngineChannelCredentials_3);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConcurrentRpcLimiter);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConcurrentRpcLimiter___reduce_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConcurrentRpcLimiter___setstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConcurrentRpcLimiter__decrease);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConcurrentRpcLimiter_check_befo);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConcurrentRpcLimiter_decrease_o);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Concurrent_RPC_limit_exceeded);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Condition);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConnectivityEvent);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConnectivityEvent___reduce_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConnectivityEvent___setstate_cyt);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConnectivityState);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConnectivityTag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConnectivityTag___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ConnectivityTag___setstate_cyth);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Core_should_not_return_GRPC_QUEU);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Credentials_couldn_t_have_been_s);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Dedicated_exception_class_for_wa);
+  Py_CLEAR(clear_module_state->__pyx_n_s_DeprecationWarning);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EMPTY_FLAGS);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EMPTY_MASK);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EOF);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EOF_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EOF___bool);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EOF___len);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EOF___repr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EOF___str);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EOF__repr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_EX_USAGE);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Enum);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Error_fetching_certificate_confi);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Error_fetching_certificate_confi_2);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Error_in_callback_for_method_s);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Error_in_grpc_server_request_cal);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ExecuteBatchError);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_ExecuteBatchError_raised_in_core);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Exiting_child_due_to_raised_exce);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Expected_bytes_str_or_unicode_no);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Expected_int_bytes_or_behavior_g);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Expected_str_not);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Expecting_non_ok_status_code);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_grpc_call_start_batch_wit);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_s_s);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_sending_error_status_from);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_get_server_sockets_ple);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_get_servers_please_ens);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_get_the_channel_please);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_get_the_server_please);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_get_the_socket_please);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_get_the_subchannel_ple);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_get_top_channels_pleas);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_receive_any_message_fr);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_shutdown_gRPC_Core_aft);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Failed_to_shutdown_gRPC_Python_t);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ForkManagedThread);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ForkManagedThread___init);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ForkManagedThread___init___local);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ForkManagedThread_join);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ForkManagedThread_setDaemon);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ForkManagedThread_start);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ForkState);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ForkState___init);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_ASYNCIO_ENGINE);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_COMPRESSION_CHANNEL_DEFAULT);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_COMPRESSION_REQUEST_ALGORIT);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_PROPAGATE_CANCELLATION);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_PROPAGATE_CENSUS_STATS_CONT);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_PROPAGATE_CENSUS_TRACING_CO);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_PROPAGATE_DEADLINE);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GRPC_PROPAGATE_DEFAULTS);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Group);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GrpcArgWrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GrpcArgWrapper___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GrpcArgWrapper___setstate_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_GrpcCallWrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_HandlerCallDetails);
+  Py_CLEAR(clear_module_state->__pyx_n_s_HandlerCallDetails___reduce_cyt);
+  Py_CLEAR(clear_module_state->__pyx_n_s_HandlerCallDetails___setstate_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_IMMUTABLE_EMPTY_METADATA);
+  Py_CLEAR(clear_module_state->__pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ImportError);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_InitialMetadataFlags);
+  Py_CLEAR(clear_module_state->__pyx_n_s_InsecureChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_InsecureChannelCredentials___red);
+  Py_CLEAR(clear_module_state->__pyx_n_s_InsecureChannelCredentials___set);
+  Py_CLEAR(clear_module_state->__pyx_n_s_IntegratedCall);
+  Py_CLEAR(clear_module_state->__pyx_n_s_IntegratedCall___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_IntegratedCall___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_IntegratedCall_cancel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_IntegratedCall_operate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_InternalError);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Internal_error_from_Core);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Internal_gRPC_call_error_d);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Invalid_encoding_on_s);
+  Py_CLEAR(clear_module_state->__pyx_kp_u_Invalid_trailing_metadata_type_e);
+  Py_CLEAR(clear_module_state->__pyx_n_s_KeyError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_KeyboardInterrupt);
+  Py_CLEAR(clear_module_state->__pyx_n_s_LOGGER);
+  Py_CLEAR(clear_module_state->__pyx_n_s_LatentEventArg);
+  Py_CLEAR(clear_module_state->__pyx_n_s_LocalChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_LocalChannelCredentials___reduce);
+  Py_CLEAR(clear_module_state->__pyx_n_s_LocalChannelCredentials___setsta);
+  Py_CLEAR(clear_module_state->__pyx_n_s_LocalConnectionType);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Locally_aborted);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Lock);
+  Py_CLEAR(clear_module_state->__pyx_n_s_MessageReceiver);
+  Py_CLEAR(clear_module_state->__pyx_n_s_MessageReceiver___anext);
+  Py_CLEAR(clear_module_state->__pyx_n_s_MessageReceiver___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_MessageReceiver___setstate_cyth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_MessageReceiver__async_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_MetadataPluginCallCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_MetadataPluginCallCredentials_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_MetadataPluginCallCredentials_3);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Metadatum);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Method_not_found);
+  Py_CLEAR(clear_module_state->__pyx_n_s_NON_OK_CALL_REPRESENTATION);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_No_custom_hooks_are_implemented);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Non_thread_safe_operation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_None);
+  Py_CLEAR(clear_module_state->__pyx_n_s_NotImplementedError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_OK_CALL_REPRESENTATION);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Operation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_OperationType);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Operation___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Operation___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Optional);
+  Py_CLEAR(clear_module_state->__pyx_n_s_POLLER);
+  Py_CLEAR(clear_module_state->__pyx_n_s_PickleError);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Please_report_to_https_github_co);
+  Py_CLEAR(clear_module_state->__pyx_n_s_PollerCompletionQueue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_PollerCompletionQueue___reduce_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_PollerCompletionQueue___setstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_PollerCompletionQueue__handle_ev);
+  Py_CLEAR(clear_module_state->__pyx_n_s_PollerCompletionQueue__poll_wrap);
+  Py_CLEAR(clear_module_state->__pyx_n_s_PollerCompletionQueue_bind_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_PropagationConstants);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_3);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_voi);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Queue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RLock);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RPCState);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RPCState___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RPCState___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_RPC_already_finished);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_RPC_cancelled_for_servicer_metho);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_RPC_cancelled_for_unknown_reason);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Raised_if_the_server_is_stopped);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Raised_upon_unexpected_errors_in);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Raised_when_calling_abort_in_ser);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Raised_when_execute_batch_return);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Raised_when_the_usage_of_API_by);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveCloseOnServerOperation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveCloseOnServerOperation_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveCloseOnServerOperation_3);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveCloseOnServerOperation_ca);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveCloseOnServerOperation_ty);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveInitialMetadataOperation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveInitialMetadataOperation_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveInitialMetadataOperation_3);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveInitialMetadataOperation_4);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveInitialMetadataOperation_5);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveMessageOperation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveMessageOperation___reduce);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveMessageOperation___setsta);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveMessageOperation_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveMessageOperation_type);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveStatusOnClientOperation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_3);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_d);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_e);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_t);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_t_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RequestCallError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RequestCallEvent);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RequestCallEvent___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RequestCallEvent___setstate_cyth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RequestCallTag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RequestCallTag___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RequestCallTag___setstate_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_RuntimeError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SERVICES_TO_EXCLUDE);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SSLChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SSLChannelCredentials___reduce_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SSLChannelCredentials___setstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SSLSessionCacheLRU);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SSLSessionCacheLRU___reduce_cyth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SSLSessionCacheLRU___setstate_cy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SegregatedCall);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SegregatedCall___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SegregatedCall___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SegregatedCall_cancel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SegregatedCall_next_event);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SegregatedCall_operate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendCloseFromClientOperation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendCloseFromClientOperation___r);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendCloseFromClientOperation___s);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendCloseFromClientOperation_typ);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendInitialMetadataOperation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendInitialMetadataOperation___r);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendInitialMetadataOperation___s);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendInitialMetadataOperation_typ);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendMessageOperation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendMessageOperation___reduce_cy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendMessageOperation___setstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendMessageOperation_type);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendStatusFromServerOperation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendStatusFromServerOperation_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendStatusFromServerOperation_3);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SendStatusFromServerOperation_ty);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Send_initial_metadata_failed_alr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerCertificateConfig);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerCertificateConfig___reduce);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerCertificateConfig___setsta);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerCertificateConfiguration);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerCredentials___reduce_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerCredentials___setstate_cyt);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerShutdownEvent);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerShutdownEvent___reduce_cyt);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerShutdownEvent___setstate_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerShutdownTag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerShutdownTag___reduce_cyth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerShutdownTag___setstate_cy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServerStoppedError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server_add_http2_port);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Server_already_stopped);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server_cancel_all_calls);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server_destroy);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Server_not_in_ready_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server_register_completion_queue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server_request_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server_shutdown);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Server_shutdown_failed_no_comple);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Server_start);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext___setstate_cyth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_abort);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_abort_with_stat);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_add_done_callba);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_auth_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_cancelled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_disable_next_me);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_done);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_invocation_meta);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_peer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_peer_identities);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_peer_identity_k);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_read);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_send_initial_me);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_set_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_set_compression);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_set_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_set_trailing_me);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_time_remaining);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_trailing_metada);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ServicerContext_write);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SslPemKeyCertPair);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SslPemKeyCertPair___reduce_cytho);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SslPemKeyCertPair___setstate_cyt);
+  Py_CLEAR(clear_module_state->__pyx_n_s_StatusCode);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext___reduce_cy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext___setstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_abort);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_add_callbac);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_auth_contex);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_disable_nex);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_invocation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_peer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_peer_identi);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_peer_identi_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_send_initia);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_set_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_set_compres);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_set_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_set_trailin);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SyncServicerContext_time_remain);
+  Py_CLEAR(clear_module_state->__pyx_n_s_SystemExit);
+  Py_CLEAR(clear_module_state->__pyx_n_s_TRUE);
+  Py_CLEAR(clear_module_state->__pyx_n_s_TRUE_VALUES);
+  Py_CLEAR(clear_module_state->__pyx_n_s_TYPE_METADATA_STRING);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Tag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Tag___reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Tag___setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_The_base_class_for_exceptions_ge);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Thread);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Timed_out);
+  Py_CLEAR(clear_module_state->__pyx_n_s_TimeoutError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_True);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Tuple_Tuple_str_Union_str_bytes);
+  Py_CLEAR(clear_module_state->__pyx_n_s_TypeError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_UNKNOWN_CANCELLATION_DETAILS);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Unexpected_s_raised_by_servicer);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Unexpected_s_s);
+  Py_CLEAR(clear_module_state->__pyx_n_s_UnicodeDecodeError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Unknown);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Unsupported_engine_type_s);
+  Py_CLEAR(clear_module_state->__pyx_n_s_UsageError);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_Using_s_as_I_O_engine);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ValueError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_WatchConnectivityFailed);
+  Py_CLEAR(clear_module_state->__pyx_n_s_WriteFlag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_XDSChannelCredentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_XDSChannelCredentials___reduce_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_XDSChannelCredentials___setstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_YES);
+  Py_CLEAR(clear_module_state->__pyx_n_s_Yes);
+  Py_CLEAR(clear_module_state->__pyx_n_s__107);
+  Py_CLEAR(clear_module_state->__pyx_n_s__38);
+  Py_CLEAR(clear_module_state->__pyx_kp_u__49);
+  Py_CLEAR(clear_module_state->__pyx_n_s__57);
+  Py_CLEAR(clear_module_state->__pyx_kp_u__58);
+  Py_CLEAR(clear_module_state->__pyx_kp_u__69);
+  Py_CLEAR(clear_module_state->__pyx_kp_b__7);
+  Py_CLEAR(clear_module_state->__pyx_kp_s__7);
+  Py_CLEAR(clear_module_state->__pyx_kp_u__70);
+  Py_CLEAR(clear_module_state->__pyx_kp_u__71);
+  Py_CLEAR(clear_module_state->__pyx_n_s_abort);
+  Py_CLEAR(clear_module_state->__pyx_n_s_abort_with_status);
+  Py_CLEAR(clear_module_state->__pyx_n_s_aborted);
+  Py_CLEAR(clear_module_state->__pyx_n_s_active_thread_count);
+  Py_CLEAR(clear_module_state->__pyx_n_s_actual_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add_callback);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add_callback_handler_locals_han);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add_done_callback);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add_generic_rpc_handlers);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add_http2_port);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add_insecure_port);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add_reader);
+  Py_CLEAR(clear_module_state->__pyx_n_s_add_secure_port);
+  Py_CLEAR(clear_module_state->__pyx_n_s_address);
+  Py_CLEAR(clear_module_state->__pyx_n_s_address_c_string);
+  Py_CLEAR(clear_module_state->__pyx_n_s_aenter);
+  Py_CLEAR(clear_module_state->__pyx_n_s_aexit);
+  Py_CLEAR(clear_module_state->__pyx_n_s_after_in_child);
+  Py_CLEAR(clear_module_state->__pyx_n_s_after_in_parent);
+  Py_CLEAR(clear_module_state->__pyx_n_s_agen);
+  Py_CLEAR(clear_module_state->__pyx_n_s_aiter);
+  Py_CLEAR(clear_module_state->__pyx_n_s_algorithm);
+  Py_CLEAR(clear_module_state->__pyx_n_s_already_accepted);
+  Py_CLEAR(clear_module_state->__pyx_n_s_already_exists);
+  Py_CLEAR(clear_module_state->__pyx_n_s_already_finished);
+  Py_CLEAR(clear_module_state->__pyx_n_s_already_invoked);
+  Py_CLEAR(clear_module_state->__pyx_n_s_anext);
+  Py_CLEAR(clear_module_state->__pyx_n_s_append);
+  Py_CLEAR(clear_module_state->__pyx_n_s_apply);
+  Py_CLEAR(clear_module_state->__pyx_n_s_args);
+  Py_CLEAR(clear_module_state->__pyx_n_s_arguments);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ascii);
+  Py_CLEAR(clear_module_state->__pyx_n_s_async_callback_func);
+  Py_CLEAR(clear_module_state->__pyx_n_s_async_generator_to_generator);
+  Py_CLEAR(clear_module_state->__pyx_n_s_async_message_receiver);
+  Py_CLEAR(clear_module_state->__pyx_n_s_async_response_generator);
+  Py_CLEAR(clear_module_state->__pyx_n_s_asyncio);
+  Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines);
+  Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_tasks);
+  Py_CLEAR(clear_module_state->__pyx_n_s_atexit);
+  Py_CLEAR(clear_module_state->__pyx_n_s_auth_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_await);
+  Py_CLEAR(clear_module_state->__pyx_n_s_await_zero_threads);
+  Py_CLEAR(clear_module_state->__pyx_n_s_backup_queue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_batch_error);
+  Py_CLEAR(clear_module_state->__pyx_n_s_batch_operation_tag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_batch_operations);
+  Py_CLEAR(clear_module_state->__pyx_n_s_before);
+  Py_CLEAR(clear_module_state->__pyx_kp_b_bin);
+  Py_CLEAR(clear_module_state->__pyx_n_s_bind_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_block_if_fork_in_progress);
+  Py_CLEAR(clear_module_state->__pyx_n_s_bool);
+  Py_CLEAR(clear_module_state->__pyx_n_s_buffer_hint);
+  Py_CLEAR(clear_module_state->__pyx_n_s_build_census_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_bytes_ctx);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_call_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_cert_config);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_deadline);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_error_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_event);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_key);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_options);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_peer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_pem_root_certs);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_returned_str);
+  Py_CLEAR(clear_module_state->__pyx_n_s_c_target);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_credentialses);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_creds);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_error);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_handle);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_queue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_soon_threadsafe);
+  Py_CLEAR(clear_module_state->__pyx_n_s_call_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_callback);
+  Py_CLEAR(clear_module_state->__pyx_n_s_callback_func);
+  Py_CLEAR(clear_module_state->__pyx_n_s_callback_wrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cancel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cancel_all_calls);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cancelled);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_cannot_register_completion_queue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_capacity);
+  Py_CLEAR(clear_module_state->__pyx_n_s_capsule);
+  Py_CLEAR(clear_module_state->__pyx_n_s_capsule_ptr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_catch_warnings);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cb);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cb_func);
+  Py_CLEAR(clear_module_state->__pyx_n_s_census_ctx);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cert_config);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cert_config_fetcher);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_cert_config_fetcher_must_be_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_certificate_chain);
+  Py_CLEAR(clear_module_state->__pyx_n_s_certificate_configuration);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cfunc_to_py);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channel_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channel_credentials_alts);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channel_credentials_compute_engi);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channel_credentials_insecure);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channel_credentials_local);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channel_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channel_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channels);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channelz_get_channel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channelz_get_server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channelz_get_server_sockets);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channelz_get_servers);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channelz_get_socket);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channelz_get_subchannel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_channelz_get_top_channels);
+  Py_CLEAR(clear_module_state->__pyx_n_s_check_before_request_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_check_connectivity_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_class);
+  Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem);
+  Py_CLEAR(clear_module_state->__pyx_n_s_clear);
+  Py_CLEAR(clear_module_state->__pyx_n_s_clear_server_call_tracer_factory);
+  Py_CLEAR(clear_module_state->__pyx_n_s_client_config_in_slice);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback);
+  Py_CLEAR(clear_module_state->__pyx_n_s_close);
+  Py_CLEAR(clear_module_state->__pyx_n_s_close_on_fork);
+  Py_CLEAR(clear_module_state->__pyx_n_s_close_on_fork_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_closed);
+  Py_CLEAR(clear_module_state->__pyx_n_s_closing);
+  Py_CLEAR(clear_module_state->__pyx_n_s_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_codecs);
+  Py_CLEAR(clear_module_state->__pyx_n_s_collections);
+  Py_CLEAR(clear_module_state->__pyx_n_s_common);
+  Py_CLEAR(clear_module_state->__pyx_n_s_completion_type);
+  Py_CLEAR(clear_module_state->__pyx_n_s_compression);
+  Py_CLEAR(clear_module_state->__pyx_n_s_compression_algorithm_name);
+  Py_CLEAR(clear_module_state->__pyx_n_s_concurrency_exceeded);
+  Py_CLEAR(clear_module_state->__pyx_n_s_condition);
+  Py_CLEAR(clear_module_state->__pyx_n_s_connecting);
+  Py_CLEAR(clear_module_state->__pyx_n_s_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_context_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_contextvars);
+  Py_CLEAR(clear_module_state->__pyx_n_s_contextvars_supported);
+  Py_CLEAR(clear_module_state->__pyx_n_s_continuation);
+  Py_CLEAR(clear_module_state->__pyx_n_s_copy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_copy_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_core_function_name);
+  Py_CLEAR(clear_module_state->__pyx_n_s_coro);
+  Py_CLEAR(clear_module_state->__pyx_n_s_create_client_call_tracer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_create_future);
+  Py_CLEAR(clear_module_state->__pyx_n_s_create_server_call_tracer_factor);
+  Py_CLEAR(clear_module_state->__pyx_n_s_create_task);
+  Py_CLEAR(clear_module_state->__pyx_n_s_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_credentials_2);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_credentials_roots_pem);
+  Py_CLEAR(clear_module_state->__pyx_n_s_creds);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ctx);
+  Py_CLEAR(clear_module_state->__pyx_n_s_custom_io_manager);
+  Py_CLEAR(clear_module_state->__pyx_n_s_custom_op_on_c_call);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_cygrpc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cython_call_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_cython_cygrpc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_daemon);
+  Py_CLEAR(clear_module_state->__pyx_n_s_daemonic);
+  Py_CLEAR(clear_module_state->__pyx_n_s_data);
+  Py_CLEAR(clear_module_state->__pyx_n_s_data_loss);
+  Py_CLEAR(clear_module_state->__pyx_n_s_deadline);
+  Py_CLEAR(clear_module_state->__pyx_n_s_deadline_exceeded);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_dealloc___called_on_running_se);
+  Py_CLEAR(clear_module_state->__pyx_n_s_debug);
+  Py_CLEAR(clear_module_state->__pyx_n_s_debug_error_string);
+  Py_CLEAR(clear_module_state->__pyx_n_s_decode);
+  Py_CLEAR(clear_module_state->__pyx_n_s_decrease_active_rpcs_count);
+  Py_CLEAR(clear_module_state->__pyx_n_s_decrease_once_finished);
+  Py_CLEAR(clear_module_state->__pyx_n_s_decrement);
+  Py_CLEAR(clear_module_state->__pyx_n_s_default_authority);
+  Py_CLEAR(clear_module_state->__pyx_n_s_default_vtable);
+  Py_CLEAR(clear_module_state->__pyx_n_s_deflate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_delete_call_tracer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_destroy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_details_bytes);
+  Py_CLEAR(clear_module_state->__pyx_n_s_dict);
+  Py_CLEAR(clear_module_state->__pyx_n_s_dict_2);
+  Py_CLEAR(clear_module_state->__pyx_kp_u_disable);
+  Py_CLEAR(clear_module_state->__pyx_n_s_disable_algorithm);
+  Py_CLEAR(clear_module_state->__pyx_n_s_disable_next_message_compression);
+  Py_CLEAR(clear_module_state->__pyx_n_s_discard);
+  Py_CLEAR(clear_module_state->__pyx_n_s_doc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_done);
+  Py_CLEAR(clear_module_state->__pyx_n_s_dump_xds_configs);
+  Py_CLEAR(clear_module_state->__pyx_n_s_e);
+  Py_CLEAR(clear_module_state->__pyx_kp_u_enable);
+  Py_CLEAR(clear_module_state->__pyx_n_s_enable_algorithm);
+  Py_CLEAR(clear_module_state->__pyx_n_s_enable_census);
+  Py_CLEAR(clear_module_state->__pyx_n_s_encode);
+  Py_CLEAR(clear_module_state->__pyx_n_s_end_time);
+  Py_CLEAR(clear_module_state->__pyx_n_s_endswith);
+  Py_CLEAR(clear_module_state->__pyx_n_s_enter);
+  Py_CLEAR(clear_module_state->__pyx_n_s_enter_user_request_generator);
+  Py_CLEAR(clear_module_state->__pyx_n_s_enum);
+  Py_CLEAR(clear_module_state->__pyx_n_s_enumerate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_environ);
+  Py_CLEAR(clear_module_state->__pyx_n_s_errno);
+  Py_CLEAR(clear_module_state->__pyx_n_s_error);
+  Py_CLEAR(clear_module_state->__pyx_n_s_error_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_error_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_error_str);
+  Py_CLEAR(clear_module_state->__pyx_n_s_error_string);
+  Py_CLEAR(clear_module_state->__pyx_n_s_event);
+  Py_CLEAR(clear_module_state->__pyx_n_s_exc_info);
+  Py_CLEAR(clear_module_state->__pyx_n_s_exception);
+  Py_CLEAR(clear_module_state->__pyx_n_s_exception_type);
+  Py_CLEAR(clear_module_state->__pyx_n_s_execute_batch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_exit);
+  Py_CLEAR(clear_module_state->__pyx_n_s_exit_2);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_expected_certificate_to_be_bytes);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_expected_pem_key_cert_pairs_to_b);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_expected_registered_completion_q);
+  Py_CLEAR(clear_module_state->__pyx_n_s_failed_precondition);
+  Py_CLEAR(clear_module_state->__pyx_n_s_failure_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fallback_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fileno);
+  Py_CLEAR(clear_module_state->__pyx_n_s_find_method_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_find_method_handler_locals_quer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_finish_handler_with_stream_resp);
+  Py_CLEAR(clear_module_state->__pyx_n_s_finish_handler_with_unary_respo);
+  Py_CLEAR(clear_module_state->__pyx_n_s_finish_ops);
+  Py_CLEAR(clear_module_state->__pyx_n_s_flags);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fn);
+  Py_CLEAR(clear_module_state->__pyx_n_s_force_client_auth);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_epoch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_handler_failed);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_handler_registered);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_handler_registered_lock);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_handlers_and_grpc_init);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_in_progress);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_in_progress_condition);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_register_channel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_fork_unregister_channel);
+  Py_CLEAR(clear_module_state->__pyx_n_s_format);
+  Py_CLEAR(clear_module_state->__pyx_n_s_format_exception);
+  Py_CLEAR(clear_module_state->__pyx_n_s_functools);
+  Py_CLEAR(clear_module_state->__pyx_n_s_future);
+  Py_CLEAR(clear_module_state->__pyx_n_s_g_gevent_activated);
+  Py_CLEAR(clear_module_state->__pyx_n_s_g_gevent_pool);
+  Py_CLEAR(clear_module_state->__pyx_n_s_g_gevent_threadpool);
+  Py_CLEAR(clear_module_state->__pyx_n_s_g_interrupt_check_period_ms);
+  Py_CLEAR(clear_module_state->__pyx_kp_u_gc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_gen);
+  Py_CLEAR(clear_module_state->__pyx_n_s_generator_to_async_generator);
+  Py_CLEAR(clear_module_state->__pyx_n_s_generator_to_async_generator_loc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_generic_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_generic_handlers);
+  Py_CLEAR(clear_module_state->__pyx_n_s_generic_rpc_handlers);
+  Py_CLEAR(clear_module_state->__pyx_n_s_genexpr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get);
+  Py_CLEAR(clear_module_state->__pyx_n_s_getLogger);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_data);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_deadline_from_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_event_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_event_loop_policy);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_fork_epoch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_hub);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_metadata_locals_callback);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_plugin);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_registered_call_handle);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_running_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_get_working_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_getstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_gevent);
+  Py_CLEAR(clear_module_state->__pyx_n_s_gevent_decrement_channel_count);
+  Py_CLEAR(clear_module_state->__pyx_n_s_gevent_hub);
+  Py_CLEAR(clear_module_state->__pyx_n_s_gevent_increment_channel_count);
+  Py_CLEAR(clear_module_state->__pyx_n_s_gevent_pool);
+  Py_CLEAR(clear_module_state->__pyx_n_s_grace);
+  Py_CLEAR(clear_module_state->__pyx_n_s_grpc);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_grpc_aio_EOF);
+  Py_CLEAR(clear_module_state->__pyx_n_s_grpc_call_error_string);
+  Py_CLEAR(clear_module_state->__pyx_n_s_grpc_call_wrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_grpc_completion_queue_shutdown);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap);
+  Py_CLEAR(clear_module_state->__pyx_n_s_grpc_server_request_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_grpc_server_shutdown_and_notify);
+  Py_CLEAR(clear_module_state->__pyx_n_s_grpc_shutdown_wrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_gzip);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_callback_wrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_callbacks);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_cancellation_from_core);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_events);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_exceptions);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_rpc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_status_once_received);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_stream_stream_rpc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_stream_unary_rpc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_unary_stream_rpc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handle_unary_unary_rpc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_handler_call_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_hex_codec);
+  Py_CLEAR(clear_module_state->__pyx_n_s_high);
+  Py_CLEAR(clear_module_state->__pyx_n_s_host);
+  Py_CLEAR(clear_module_state->__pyx_n_s_http2_initial_sequence_number);
+  Py_CLEAR(clear_module_state->__pyx_n_s_hub);
+  Py_CLEAR(clear_module_state->__pyx_n_s_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_identities);
+  Py_CLEAR(clear_module_state->__pyx_n_s_identity);
+  Py_CLEAR(clear_module_state->__pyx_n_s_identity_key);
+  Py_CLEAR(clear_module_state->__pyx_n_s_idle);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_if_error_code_is_specified_so_mu);
+  Py_CLEAR(clear_module_state->__pyx_n_s_import);
+  Py_CLEAR(clear_module_state->__pyx_n_s_inbound_ops);
+  Py_CLEAR(clear_module_state->__pyx_n_s_increment);
+  Py_CLEAR(clear_module_state->__pyx_n_s_init);
+  Py_CLEAR(clear_module_state->__pyx_n_s_init_grpc_aio);
+  Py_CLEAR(clear_module_state->__pyx_n_s_init_grpc_gevent);
+  Py_CLEAR(clear_module_state->__pyx_n_s_init_subclass);
+  Py_CLEAR(clear_module_state->__pyx_n_s_initial_cert_config);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_initial_cert_config_must_be_a_gr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_initial_metadata_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_initializing);
+  Py_CLEAR(clear_module_state->__pyx_n_s_initiate_stream_stream);
+  Py_CLEAR(clear_module_state->__pyx_n_s_initiate_unary_stream);
+  Py_CLEAR(clear_module_state->__pyx_n_s_insecure_server_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_inspect);
+  Py_CLEAR(clear_module_state->__pyx_n_s_install_context_from_request_cal);
+  Py_CLEAR(clear_module_state->__pyx_n_s_install_context_from_request_cal_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_int);
+  Py_CLEAR(clear_module_state->__pyx_n_s_integrated_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_integrated_call_locals_on_succe);
+  Py_CLEAR(clear_module_state->__pyx_n_s_intercept_service);
+  Py_CLEAR(clear_module_state->__pyx_n_s_interceptor);
+  Py_CLEAR(clear_module_state->__pyx_n_s_interceptors);
+  Py_CLEAR(clear_module_state->__pyx_n_s_internal);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_internal_error_user_data_must_be);
+  Py_CLEAR(clear_module_state->__pyx_n_s_internal_poll);
+  Py_CLEAR(clear_module_state->__pyx_n_s_invalid_argument);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_invalid_call_object_cannot_be_us);
+  Py_CLEAR(clear_module_state->__pyx_n_s_invalid_flags);
+  Py_CLEAR(clear_module_state->__pyx_n_s_invalid_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_invocation_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_algorithm_enabled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_async_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_fork_support_enabled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_locally_cancelled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_ok);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_running);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_sampled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_is_valid);
+  Py_CLEAR(clear_module_state->__pyx_n_s_isasyncgenfunction);
+  Py_CLEAR(clear_module_state->__pyx_n_s_isawaitable);
+  Py_CLEAR(clear_module_state->__pyx_n_s_iscoroutinefunction);
+  Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_item);
+  Py_CLEAR(clear_module_state->__pyx_n_s_iter);
+  Py_CLEAR(clear_module_state->__pyx_n_s_join);
+  Py_CLEAR(clear_module_state->__pyx_n_s_key);
+  Py_CLEAR(clear_module_state->__pyx_n_s_keys);
+  Py_CLEAR(clear_module_state->__pyx_n_s_last_observed_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_latent_event_arg);
+  Py_CLEAR(clear_module_state->__pyx_n_s_len);
+  Py_CLEAR(clear_module_state->__pyx_n_s_lk);
+  Py_CLEAR(clear_module_state->__pyx_n_s_local_connect_type);
+  Py_CLEAR(clear_module_state->__pyx_n_s_local_tcp);
+  Py_CLEAR(clear_module_state->__pyx_n_s_logging);
+  Py_CLEAR(clear_module_state->__pyx_n_s_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_low);
+  Py_CLEAR(clear_module_state->__pyx_n_s_lower);
+  Py_CLEAR(clear_module_state->__pyx_n_s_main);
+  Py_CLEAR(clear_module_state->__pyx_n_s_managed_target);
+  Py_CLEAR(clear_module_state->__pyx_n_s_max_concurrent_streams);
+  Py_CLEAR(clear_module_state->__pyx_n_s_max_receive_message_length);
+  Py_CLEAR(clear_module_state->__pyx_n_s_max_results);
+  Py_CLEAR(clear_module_state->__pyx_n_s_max_send_message_length);
+  Py_CLEAR(clear_module_state->__pyx_n_s_maximum_concurrent_rpcs);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_maximum_concurrent_rpcs_should_b);
+  Py_CLEAR(clear_module_state->__pyx_n_s_maxsize);
+  Py_CLEAR(clear_module_state->__pyx_n_s_maybe_save_server_trace_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_medium);
+  Py_CLEAR(clear_module_state->__pyx_n_s_members);
+  Py_CLEAR(clear_module_state->__pyx_n_s_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_metaclass);
+  Py_CLEAR(clear_module_state->__pyx_n_s_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_metadata_locals_genexpr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_metadata_plugin);
+  Py_CLEAR(clear_module_state->__pyx_n_s_metadata_sent_observer);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_metadata_was_invalid_s);
+  Py_CLEAR(clear_module_state->__pyx_n_s_method);
+  Py_CLEAR(clear_module_state->__pyx_n_s_method_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_module);
+  Py_CLEAR(clear_module_state->__pyx_n_s_mro_entries);
+  Py_CLEAR(clear_module_state->__pyx_n_s_name);
+  Py_CLEAR(clear_module_state->__pyx_n_s_name_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_namedtuple);
+  Py_CLEAR(clear_module_state->__pyx_n_s_new);
+  Py_CLEAR(clear_module_state->__pyx_n_s_new_event_loop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_next_call_event);
+  Py_CLEAR(clear_module_state->__pyx_n_s_next_call_event_locals_on_succes);
+  Py_CLEAR(clear_module_state->__pyx_n_s_next_event);
+  Py_CLEAR(clear_module_state->__pyx_n_s_next_event_locals_on_failure);
+  Py_CLEAR(clear_module_state->__pyx_n_s_next_event_locals_on_success);
+  Py_CLEAR(clear_module_state->__pyx_n_s_no_compress);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non);
+  Py_CLEAR(clear_module_state->__pyx_n_s_none);
+  Py_CLEAR(clear_module_state->__pyx_n_s_not_found);
+  Py_CLEAR(clear_module_state->__pyx_n_s_not_invoked);
+  Py_CLEAR(clear_module_state->__pyx_n_s_not_on_client);
+  Py_CLEAR(clear_module_state->__pyx_n_s_not_on_server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_notify_all);
+  Py_CLEAR(clear_module_state->__pyx_n_s_num_active_threads);
+  Py_CLEAR(clear_module_state->__pyx_n_s_object);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_object_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_observability);
+  Py_CLEAR(clear_module_state->__pyx_n_s_observability_enabled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_observability_plugin);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_of_RPC_that_terminated_with_sta);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_of_RPC_that_terminated_with_sta_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ok);
+  Py_CLEAR(clear_module_state->__pyx_n_s_on_failure);
+  Py_CLEAR(clear_module_state->__pyx_n_s_on_success);
+  Py_CLEAR(clear_module_state->__pyx_n_s_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_operate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_operation_complete);
+  Py_CLEAR(clear_module_state->__pyx_n_s_operations);
+  Py_CLEAR(clear_module_state->__pyx_n_s_operationses_and_tags);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ops);
+  Py_CLEAR(clear_module_state->__pyx_n_s_options);
+  Py_CLEAR(clear_module_state->__pyx_n_s_os);
+  Py_CLEAR(clear_module_state->__pyx_n_s_out_of_range);
+  Py_CLEAR(clear_module_state->__pyx_n_s_outbound_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_outbound_ops);
+  Py_CLEAR(clear_module_state->__pyx_n_s_partial);
+  Py_CLEAR(clear_module_state->__pyx_n_s_peer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_peer_identities);
+  Py_CLEAR(clear_module_state->__pyx_n_s_peer_identity_key);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pem_key_cert_pairs);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pem_root_certificates);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pem_root_certs);
+  Py_CLEAR(clear_module_state->__pyx_n_s_permission_denied);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pickle);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pkgutil);
+  Py_CLEAR(clear_module_state->__pyx_n_s_plugin);
+  Py_CLEAR(clear_module_state->__pyx_n_s_poll);
+  Py_CLEAR(clear_module_state->__pyx_n_s_poll_wrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_poller);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pool);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pop);
+  Py_CLEAR(clear_module_state->__pyx_n_s_postfork_state_to_reset);
+  Py_CLEAR(clear_module_state->__pyx_n_s_postfork_states_to_reset);
+  Py_CLEAR(clear_module_state->__pyx_n_s_prepare);
+  Py_CLEAR(clear_module_state->__pyx_n_s_primary_user_agent_string);
+  Py_CLEAR(clear_module_state->__pyx_n_s_print_exc);
+  Py_CLEAR(clear_module_state->__pyx_n_s_private_key);
+  Py_CLEAR(clear_module_state->__pyx_n_s_properties);
+  Py_CLEAR(clear_module_state->__pyx_n_s_property);
+  Py_CLEAR(clear_module_state->__pyx_n_s_put);
+  Py_CLEAR(clear_module_state->__pyx_n_s_py_auth_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_python_call_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_capi);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_AioServer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_CensusContext);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_ChannelCredential);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_InsecureChannelCr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle__Tag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable);
+  Py_CLEAR(clear_module_state->__pyx_n_s_qualname);
+  Py_CLEAR(clear_module_state->__pyx_n_s_query_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_query_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_query_handlers);
+  Py_CLEAR(clear_module_state->__pyx_n_s_queue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_queue_deadline);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_queue_must_be_live);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_queue_must_be_shutting_down_to_b);
+  Py_CLEAR(clear_module_state->__pyx_n_s_queue_shutdown);
+  Py_CLEAR(clear_module_state->__pyx_n_s_queue_timeout);
+  Py_CLEAR(clear_module_state->__pyx_n_s_raise_if_not_valid_trailing_meta);
+  Py_CLEAR(clear_module_state->__pyx_n_s_range);
+  Py_CLEAR(clear_module_state->__pyx_n_s_raw_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_read);
+  Py_CLEAR(clear_module_state->__pyx_n_s_read_socket);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ready);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_close_on_server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_initial_metadata_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_initial_metadata_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_message_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_message_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_serialized_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_status_on_client);
+  Py_CLEAR(clear_module_state->__pyx_n_s_receive_status_on_client_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_received_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_recv);
+  Py_CLEAR(clear_module_state->__pyx_n_s_reduce);
+  Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex);
+  Py_CLEAR(clear_module_state->__pyx_n_s_register);
+  Py_CLEAR(clear_module_state->__pyx_n_s_register_at_fork);
+  Py_CLEAR(clear_module_state->__pyx_n_s_register_completion_queue);
+  Py_CLEAR(clear_module_state->__pyx_n_s_registered_call_handle);
+  Py_CLEAR(clear_module_state->__pyx_n_s_remove_reader);
+  Py_CLEAR(clear_module_state->__pyx_n_s_repr);
+  Py_CLEAR(clear_module_state->__pyx_n_s_repr_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request_call_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request_call_tag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request_deserializer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request_iterator);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request_raw);
+  Py_CLEAR(clear_module_state->__pyx_n_s_request_streaming);
+  Py_CLEAR(clear_module_state->__pyx_n_s_reset_grpc_config_vars);
+  Py_CLEAR(clear_module_state->__pyx_n_s_reset_postfork_child);
+  Py_CLEAR(clear_module_state->__pyx_n_s_resource_exhausted);
+  Py_CLEAR(clear_module_state->__pyx_n_s_response);
+  Py_CLEAR(clear_module_state->__pyx_n_s_response_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_response_raw);
+  Py_CLEAR(clear_module_state->__pyx_n_s_response_serializer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_response_streaming);
+  Py_CLEAR(clear_module_state->__pyx_n_s_result);
+  Py_CLEAR(clear_module_state->__pyx_n_s_retain_self);
+  Py_CLEAR(clear_module_state->__pyx_n_s_return);
+  Py_CLEAR(clear_module_state->__pyx_n_s_return_from_user_request_generat);
+  Py_CLEAR(clear_module_state->__pyx_n_s_rpc_coro);
+  Py_CLEAR(clear_module_state->__pyx_n_s_rpc_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_rpc_task);
+  Py_CLEAR(clear_module_state->__pyx_n_s_run);
+  Py_CLEAR(clear_module_state->__pyx_n_s_run_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_run_coroutine_threadsafe);
+  Py_CLEAR(clear_module_state->__pyx_n_s_run_in_executor);
+  Py_CLEAR(clear_module_state->__pyx_n_s_run_interceptor);
+  Py_CLEAR(clear_module_state->__pyx_n_s_run_spawn_greenlets);
+  Py_CLEAR(clear_module_state->__pyx_n_s_run_with_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_run_with_context_locals__run);
+  Py_CLEAR(clear_module_state->__pyx_n_s_runtime_error);
+  Py_CLEAR(clear_module_state->__pyx_n_s_save_trace_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_schedule_coro_threadsafe);
+  Py_CLEAR(clear_module_state->__pyx_n_s_schedule_rpc_coro);
+  Py_CLEAR(clear_module_state->__pyx_n_s_secondary_user_agent_string);
+  Py_CLEAR(clear_module_state->__pyx_n_s_segregated_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_segregated_call_locals_on_succe);
+  Py_CLEAR(clear_module_state->__pyx_n_s_self);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_self__cq_cannot_be_converted_to);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_self_arg_cannot_be_converted_to);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_self_c_argument_cannot_be_conver);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_self_c_credentials_cannot_be_con);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_self_c_op_cannot_be_converted_to);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_close_from_client);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_close_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_error_status_from_server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_initial_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_initial_metadata_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_initial_metadata_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_message_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_message_op);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_receive_close);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_serialized_message);
+  Py_CLEAR(clear_module_state->__pyx_n_s_send_status_from_server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_call_tracer);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_certificate_config_ssl);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_credentials_alts);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_credentials_local);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_credentials_ssl);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_credentials_ssl_dynamic_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_main_loop);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_server_must_be_started_and_not_s);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_queue);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_server_queue_must_be_a_registere);
+  Py_CLEAR(clear_module_state->__pyx_n_s_server_started);
+  Py_CLEAR(clear_module_state->__pyx_n_s_service);
+  Py_CLEAR(clear_module_state->__pyx_n_s_service_accounts);
+  Py_CLEAR(clear_module_state->__pyx_n_s_servicer_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_serving_task_crash_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_setDaemon);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_async_callback_func);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_census_context_on_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_compression);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_details);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_exception);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_instrumentation_context_on_c);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_internal_error);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_name);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_result);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_server_call_tracer_factory);
+  Py_CLEAR(clear_module_state->__pyx_n_s_set_trailing_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_setblocking);
+  Py_CLEAR(clear_module_state->__pyx_n_s_setstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython);
+  Py_CLEAR(clear_module_state->__pyx_n_s_shield);
+  Py_CLEAR(clear_module_state->__pyx_n_s_shutdown);
+  Py_CLEAR(clear_module_state->__pyx_n_s_shutdown_await_next_greenlet);
+  Py_CLEAR(clear_module_state->__pyx_n_s_shutdown_cq);
+  Py_CLEAR(clear_module_state->__pyx_n_s_shutdown_grpc_aio);
+  Py_CLEAR(clear_module_state->__pyx_n_s_shutting_down_server);
+  Py_CLEAR(clear_module_state->__pyx_n_s_simplefilter);
+  Py_CLEAR(clear_module_state->__pyx_n_s_sleep);
+  Py_CLEAR(clear_module_state->__pyx_n_s_socket);
+  Py_CLEAR(clear_module_state->__pyx_n_s_socket_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_socketpair);
+  Py_CLEAR(clear_module_state->__pyx_n_s_span_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_spawn);
+  Py_CLEAR(clear_module_state->__pyx_n_s_spawn_callback_async);
+  Py_CLEAR(clear_module_state->__pyx_n_s_spawn_callback_in_thread);
+  Py_CLEAR(clear_module_state->__pyx_n_s_spawn_greenlets);
+  Py_CLEAR(clear_module_state->__pyx_n_s_spec);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_10);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_11);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_12);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_13);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_14);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_15);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_16);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_17);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_18);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_19);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_2);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_20);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_21);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_22);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_23);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_3);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_4);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_5);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_6);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_7);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_8);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_9);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ssl_session_cache);
+  Py_CLEAR(clear_module_state->__pyx_n_s_ssl_target_name_override);
+  Py_CLEAR(clear_module_state->__pyx_n_s_start);
+  Py_CLEAR(clear_module_state->__pyx_n_s_start_batch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_start_channel_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_start_client_batch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_start_server_batch);
+  Py_CLEAR(clear_module_state->__pyx_n_s_start_server_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_start_shutting_down);
+  Py_CLEAR(clear_module_state->__pyx_n_s_start_socket_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_started_tag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_started_tags);
+  Py_CLEAR(clear_module_state->__pyx_n_s_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_status);
+  Py_CLEAR(clear_module_state->__pyx_n_s_status_code);
+  Py_CLEAR(clear_module_state->__pyx_n_s_status_task);
+  Py_CLEAR(clear_module_state->__pyx_n_s_stored_ctx);
+  Py_CLEAR(clear_module_state->__pyx_n_s_str);
+  Py_CLEAR(clear_module_state->__pyx_n_s_str_2);
+  Py_CLEAR(clear_module_state->__pyx_n_s_stream_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_stream_stream);
+  Py_CLEAR(clear_module_state->__pyx_n_s_stream_unary);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource);
+  Py_CLEAR(clear_module_state->__pyx_n_s_subchannel_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_success);
+  Py_CLEAR(clear_module_state->__pyx_n_s_super);
+  Py_CLEAR(clear_module_state->__pyx_n_s_sync_servicer_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_sys);
+  Py_CLEAR(clear_module_state->__pyx_n_s_t);
+  Py_CLEAR(clear_module_state->__pyx_n_s_tag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_target);
+  Py_CLEAR(clear_module_state->__pyx_n_s_task);
+  Py_CLEAR(clear_module_state->__pyx_n_s_test);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_the_server_has_already_started);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_the_server_hasn_t_started_yet);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_the_server_must_be_shutting_down);
+  Py_CLEAR(clear_module_state->__pyx_n_s_thread);
+  Py_CLEAR(clear_module_state->__pyx_n_s_thread_pool);
+  Py_CLEAR(clear_module_state->__pyx_n_s_threading);
+  Py_CLEAR(clear_module_state->__pyx_n_s_threadpool);
+  Py_CLEAR(clear_module_state->__pyx_n_s_throw);
+  Py_CLEAR(clear_module_state->__pyx_n_s_time);
+  Py_CLEAR(clear_module_state->__pyx_n_s_time_remaining);
+  Py_CLEAR(clear_module_state->__pyx_n_s_timeout);
+  Py_CLEAR(clear_module_state->__pyx_n_s_timeout_secs);
+  Py_CLEAR(clear_module_state->__pyx_n_s_to_call);
+  Py_CLEAR(clear_module_state->__pyx_n_s_to_channel_arg);
+  Py_CLEAR(clear_module_state->__pyx_n_s_too_many_operations);
+  Py_CLEAR(clear_module_state->__pyx_n_s_trace_id);
+  Py_CLEAR(clear_module_state->__pyx_n_s_traceback);
+  Py_CLEAR(clear_module_state->__pyx_n_s_tracing_enabled);
+  Py_CLEAR(clear_module_state->__pyx_n_s_trailing_metadata);
+  Py_CLEAR(clear_module_state->__pyx_n_s_transient_failure);
+  Py_CLEAR(clear_module_state->__pyx_n_s_true);
+  Py_CLEAR(clear_module_state->__pyx_n_s_try_to_connect);
+  Py_CLEAR(clear_module_state->__pyx_n_s_type);
+  Py_CLEAR(clear_module_state->__pyx_n_s_typing);
+  Py_CLEAR(clear_module_state->__pyx_n_s_uds);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unary_handler);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unary_stream);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unary_unary);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unauthenticated);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unavailable);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unimplemented);
+  Py_CLEAR(clear_module_state->__pyx_n_s_uninstall_context);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unknown);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unused_future);
+  Py_CLEAR(clear_module_state->__pyx_n_s_unused_task);
+  Py_CLEAR(clear_module_state->__pyx_n_s_update);
+  Py_CLEAR(clear_module_state->__pyx_n_s_upper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_use_setstate);
+  Py_CLEAR(clear_module_state->__pyx_n_s_used_mask);
+  Py_CLEAR(clear_module_state->__pyx_n_s_user_tag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_utf8);
+  Py_CLEAR(clear_module_state->__pyx_kp_s_utf_8);
+  Py_CLEAR(clear_module_state->__pyx_n_s_value);
+  Py_CLEAR(clear_module_state->__pyx_n_s_values);
+  Py_CLEAR(clear_module_state->__pyx_n_s_wait);
+  Py_CLEAR(clear_module_state->__pyx_n_s_wait_for);
+  Py_CLEAR(clear_module_state->__pyx_n_s_wait_for_ready);
+  Py_CLEAR(clear_module_state->__pyx_n_s_wait_for_ready_explicitly_set);
+  Py_CLEAR(clear_module_state->__pyx_n_s_wait_for_termination);
+  Py_CLEAR(clear_module_state->__pyx_n_s_wait_time);
+  Py_CLEAR(clear_module_state->__pyx_n_s_warning);
+  Py_CLEAR(clear_module_state->__pyx_n_s_warnings);
+  Py_CLEAR(clear_module_state->__pyx_n_s_watch_connectivity_state);
+  Py_CLEAR(clear_module_state->__pyx_n_s_wrap);
+  Py_CLEAR(clear_module_state->__pyx_n_s_wrapper);
+  Py_CLEAR(clear_module_state->__pyx_n_s_write);
+  Py_CLEAR(clear_module_state->__pyx_n_s_write_flag);
+  Py_CLEAR(clear_module_state->__pyx_n_s_xds);
+  Py_CLEAR(clear_module_state->__pyx_n_s_xds_server_credentials);
+  Py_CLEAR(clear_module_state->__pyx_n_s_yes);
+  Py_CLEAR(clear_module_state->__pyx_n_s_yield_to_queue);
+  Py_CLEAR(clear_module_state->__pyx_float_1_0);
+  Py_CLEAR(clear_module_state->__pyx_int_0);
+  Py_CLEAR(clear_module_state->__pyx_int_1);
+  Py_CLEAR(clear_module_state->__pyx_int_5);
+  Py_CLEAR(clear_module_state->__pyx_int_118587260);
+  Py_CLEAR(clear_module_state->__pyx_int_171381981);
+  Py_CLEAR(clear_module_state->__pyx_int_171651213);
+  Py_CLEAR(clear_module_state->__pyx_int_222419149);
+  Py_CLEAR(clear_module_state->__pyx_int_228825662);
+  Py_CLEAR(clear_module_state->__pyx_int_238750788);
+  Py_CLEAR(clear_module_state->__pyx_k__76);
+  Py_CLEAR(clear_module_state->__pyx_k__80);
+  Py_CLEAR(clear_module_state->__pyx_tuple_);
+  Py_CLEAR(clear_module_state->__pyx_tuple__4);
+  Py_CLEAR(clear_module_state->__pyx_tuple__8);
+  Py_CLEAR(clear_module_state->__pyx_slice__37);
+  Py_CLEAR(clear_module_state->__pyx_tuple__10);
+  Py_CLEAR(clear_module_state->__pyx_tuple__11);
+  Py_CLEAR(clear_module_state->__pyx_tuple__12);
+  Py_CLEAR(clear_module_state->__pyx_tuple__14);
+  Py_CLEAR(clear_module_state->__pyx_tuple__17);
+  Py_CLEAR(clear_module_state->__pyx_tuple__19);
+  Py_CLEAR(clear_module_state->__pyx_tuple__21);
+  Py_CLEAR(clear_module_state->__pyx_tuple__23);
+  Py_CLEAR(clear_module_state->__pyx_tuple__24);
+  Py_CLEAR(clear_module_state->__pyx_tuple__25);
+  Py_CLEAR(clear_module_state->__pyx_tuple__26);
+  Py_CLEAR(clear_module_state->__pyx_tuple__27);
+  Py_CLEAR(clear_module_state->__pyx_tuple__28);
+  Py_CLEAR(clear_module_state->__pyx_tuple__29);
+  Py_CLEAR(clear_module_state->__pyx_tuple__30);
+  Py_CLEAR(clear_module_state->__pyx_tuple__31);
+  Py_CLEAR(clear_module_state->__pyx_tuple__32);
+  Py_CLEAR(clear_module_state->__pyx_tuple__33);
+  Py_CLEAR(clear_module_state->__pyx_tuple__34);
+  Py_CLEAR(clear_module_state->__pyx_tuple__35);
+  Py_CLEAR(clear_module_state->__pyx_tuple__36);
+  Py_CLEAR(clear_module_state->__pyx_tuple__39);
+  Py_CLEAR(clear_module_state->__pyx_tuple__40);
+  Py_CLEAR(clear_module_state->__pyx_tuple__46);
+  Py_CLEAR(clear_module_state->__pyx_tuple__48);
+  Py_CLEAR(clear_module_state->__pyx_tuple__50);
+  Py_CLEAR(clear_module_state->__pyx_tuple__79);
+  Py_CLEAR(clear_module_state->__pyx_tuple__83);
+  Py_CLEAR(clear_module_state->__pyx_tuple__93);
+  Py_CLEAR(clear_module_state->__pyx_tuple__98);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__2);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__3);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__5);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__6);
+  Py_CLEAR(clear_module_state->__pyx_tuple__105);
+  Py_CLEAR(clear_module_state->__pyx_tuple__106);
+  Py_CLEAR(clear_module_state->__pyx_tuple__108);
+  Py_CLEAR(clear_module_state->__pyx_tuple__110);
+  Py_CLEAR(clear_module_state->__pyx_tuple__116);
+  Py_CLEAR(clear_module_state->__pyx_tuple__118);
+  Py_CLEAR(clear_module_state->__pyx_tuple__121);
+  Py_CLEAR(clear_module_state->__pyx_tuple__123);
+  Py_CLEAR(clear_module_state->__pyx_tuple__125);
+  Py_CLEAR(clear_module_state->__pyx_tuple__127);
+  Py_CLEAR(clear_module_state->__pyx_tuple__138);
+  Py_CLEAR(clear_module_state->__pyx_tuple__144);
+  Py_CLEAR(clear_module_state->__pyx_tuple__148);
+  Py_CLEAR(clear_module_state->__pyx_tuple__150);
+  Py_CLEAR(clear_module_state->__pyx_tuple__152);
+  Py_CLEAR(clear_module_state->__pyx_tuple__153);
+  Py_CLEAR(clear_module_state->__pyx_tuple__156);
+  Py_CLEAR(clear_module_state->__pyx_tuple__158);
+  Py_CLEAR(clear_module_state->__pyx_tuple__162);
+  Py_CLEAR(clear_module_state->__pyx_tuple__166);
+  Py_CLEAR(clear_module_state->__pyx_tuple__168);
+  Py_CLEAR(clear_module_state->__pyx_tuple__170);
+  Py_CLEAR(clear_module_state->__pyx_tuple__172);
+  Py_CLEAR(clear_module_state->__pyx_tuple__174);
+  Py_CLEAR(clear_module_state->__pyx_tuple__176);
+  Py_CLEAR(clear_module_state->__pyx_tuple__178);
+  Py_CLEAR(clear_module_state->__pyx_tuple__180);
+  Py_CLEAR(clear_module_state->__pyx_tuple__182);
+  Py_CLEAR(clear_module_state->__pyx_tuple__184);
+  Py_CLEAR(clear_module_state->__pyx_tuple__186);
+  Py_CLEAR(clear_module_state->__pyx_tuple__194);
+  Py_CLEAR(clear_module_state->__pyx_tuple__209);
+  Py_CLEAR(clear_module_state->__pyx_tuple__211);
+  Py_CLEAR(clear_module_state->__pyx_tuple__213);
+  Py_CLEAR(clear_module_state->__pyx_tuple__217);
+  Py_CLEAR(clear_module_state->__pyx_tuple__222);
+  Py_CLEAR(clear_module_state->__pyx_tuple__224);
+  Py_CLEAR(clear_module_state->__pyx_tuple__226);
+  Py_CLEAR(clear_module_state->__pyx_tuple__230);
+  Py_CLEAR(clear_module_state->__pyx_tuple__232);
+  Py_CLEAR(clear_module_state->__pyx_tuple__236);
+  Py_CLEAR(clear_module_state->__pyx_tuple__238);
+  Py_CLEAR(clear_module_state->__pyx_tuple__241);
+  Py_CLEAR(clear_module_state->__pyx_tuple__254);
+  Py_CLEAR(clear_module_state->__pyx_tuple__255);
+  Py_CLEAR(clear_module_state->__pyx_tuple__293);
+  Py_CLEAR(clear_module_state->__pyx_tuple__296);
+  Py_CLEAR(clear_module_state->__pyx_tuple__301);
+  Py_CLEAR(clear_module_state->__pyx_tuple__304);
+  Py_CLEAR(clear_module_state->__pyx_tuple__306);
+  Py_CLEAR(clear_module_state->__pyx_tuple__308);
+  Py_CLEAR(clear_module_state->__pyx_tuple__310);
+  Py_CLEAR(clear_module_state->__pyx_tuple__312);
+  Py_CLEAR(clear_module_state->__pyx_tuple__314);
+  Py_CLEAR(clear_module_state->__pyx_tuple__316);
+  Py_CLEAR(clear_module_state->__pyx_tuple__317);
+  Py_CLEAR(clear_module_state->__pyx_tuple__319);
+  Py_CLEAR(clear_module_state->__pyx_tuple__335);
+  Py_CLEAR(clear_module_state->__pyx_tuple__342);
+  Py_CLEAR(clear_module_state->__pyx_tuple__346);
+  Py_CLEAR(clear_module_state->__pyx_tuple__349);
+  Py_CLEAR(clear_module_state->__pyx_tuple__353);
+  Py_CLEAR(clear_module_state->__pyx_tuple__356);
+  Py_CLEAR(clear_module_state->__pyx_tuple__358);
+  Py_CLEAR(clear_module_state->__pyx_tuple__360);
+  Py_CLEAR(clear_module_state->__pyx_tuple__362);
+  Py_CLEAR(clear_module_state->__pyx_tuple__364);
+  Py_CLEAR(clear_module_state->__pyx_tuple__366);
+  Py_CLEAR(clear_module_state->__pyx_tuple__368);
+  Py_CLEAR(clear_module_state->__pyx_tuple__370);
+  Py_CLEAR(clear_module_state->__pyx_tuple__371);
+  Py_CLEAR(clear_module_state->__pyx_tuple__372);
+  Py_CLEAR(clear_module_state->__pyx_tuple__374);
+  Py_CLEAR(clear_module_state->__pyx_tuple__375);
+  Py_CLEAR(clear_module_state->__pyx_tuple__379);
+  Py_CLEAR(clear_module_state->__pyx_tuple__385);
+  Py_CLEAR(clear_module_state->__pyx_tuple__388);
+  Py_CLEAR(clear_module_state->__pyx_tuple__389);
+  Py_CLEAR(clear_module_state->__pyx_tuple__393);
+  Py_CLEAR(clear_module_state->__pyx_tuple__395);
+  Py_CLEAR(clear_module_state->__pyx_tuple__396);
+  Py_CLEAR(clear_module_state->__pyx_tuple__403);
+  Py_CLEAR(clear_module_state->__pyx_tuple__405);
+  Py_CLEAR(clear_module_state->__pyx_tuple__406);
+  Py_CLEAR(clear_module_state->__pyx_tuple__409);
+  Py_CLEAR(clear_module_state->__pyx_tuple__417);
+  Py_CLEAR(clear_module_state->__pyx_tuple__424);
+  Py_CLEAR(clear_module_state->__pyx_tuple__427);
+  Py_CLEAR(clear_module_state->__pyx_tuple__435);
+  Py_CLEAR(clear_module_state->__pyx_tuple__436);
+  Py_CLEAR(clear_module_state->__pyx_tuple__437);
+  Py_CLEAR(clear_module_state->__pyx_tuple__438);
+  Py_CLEAR(clear_module_state->__pyx_tuple__439);
+  Py_CLEAR(clear_module_state->__pyx_tuple__440);
+  Py_CLEAR(clear_module_state->__pyx_tuple__441);
+  Py_CLEAR(clear_module_state->__pyx_tuple__444);
+  Py_CLEAR(clear_module_state->__pyx_tuple__448);
+  Py_CLEAR(clear_module_state->__pyx_tuple__450);
+  Py_CLEAR(clear_module_state->__pyx_tuple__453);
+  Py_CLEAR(clear_module_state->__pyx_tuple__457);
+  Py_CLEAR(clear_module_state->__pyx_tuple__460);
+  Py_CLEAR(clear_module_state->__pyx_tuple__462);
+  Py_CLEAR(clear_module_state->__pyx_tuple__463);
+  Py_CLEAR(clear_module_state->__pyx_tuple__464);
+  Py_CLEAR(clear_module_state->__pyx_tuple__465);
+  Py_CLEAR(clear_module_state->__pyx_tuple__466);
+  Py_CLEAR(clear_module_state->__pyx_tuple__467);
+  Py_CLEAR(clear_module_state->__pyx_tuple__468);
+  Py_CLEAR(clear_module_state->__pyx_tuple__472);
+  Py_CLEAR(clear_module_state->__pyx_tuple__476);
+  Py_CLEAR(clear_module_state->__pyx_tuple__484);
+  Py_CLEAR(clear_module_state->__pyx_tuple__485);
+  Py_CLEAR(clear_module_state->__pyx_tuple__486);
+  Py_CLEAR(clear_module_state->__pyx_tuple__487);
+  Py_CLEAR(clear_module_state->__pyx_tuple__491);
+  Py_CLEAR(clear_module_state->__pyx_tuple__494);
+  Py_CLEAR(clear_module_state->__pyx_tuple__497);
+  Py_CLEAR(clear_module_state->__pyx_tuple__500);
+  Py_CLEAR(clear_module_state->__pyx_tuple__502);
+  Py_CLEAR(clear_module_state->__pyx_tuple__504);
+  Py_CLEAR(clear_module_state->__pyx_tuple__506);
+  Py_CLEAR(clear_module_state->__pyx_tuple__509);
+  Py_CLEAR(clear_module_state->__pyx_tuple__515);
+  Py_CLEAR(clear_module_state->__pyx_tuple__517);
+  Py_CLEAR(clear_module_state->__pyx_tuple__533);
+  Py_CLEAR(clear_module_state->__pyx_tuple__534);
+  Py_CLEAR(clear_module_state->__pyx_tuple__536);
+  Py_CLEAR(clear_module_state->__pyx_tuple__537);
+  Py_CLEAR(clear_module_state->__pyx_tuple__538);
+  Py_CLEAR(clear_module_state->__pyx_tuple__539);
+  Py_CLEAR(clear_module_state->__pyx_tuple__542);
+  Py_CLEAR(clear_module_state->__pyx_tuple__543);
+  Py_CLEAR(clear_module_state->__pyx_tuple__544);
+  Py_CLEAR(clear_module_state->__pyx_tuple__545);
+  Py_CLEAR(clear_module_state->__pyx_tuple__546);
+  Py_CLEAR(clear_module_state->__pyx_tuple__548);
+  Py_CLEAR(clear_module_state->__pyx_tuple__550);
+  Py_CLEAR(clear_module_state->__pyx_tuple__554);
+  Py_CLEAR(clear_module_state->__pyx_tuple__556);
+  Py_CLEAR(clear_module_state->__pyx_tuple__558);
+  Py_CLEAR(clear_module_state->__pyx_tuple__560);
+  Py_CLEAR(clear_module_state->__pyx_tuple__561);
+  Py_CLEAR(clear_module_state->__pyx_tuple__562);
+  Py_CLEAR(clear_module_state->__pyx_tuple__564);
+  Py_CLEAR(clear_module_state->__pyx_tuple__565);
+  Py_CLEAR(clear_module_state->__pyx_tuple__566);
+  Py_CLEAR(clear_module_state->__pyx_tuple__570);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__13);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__15);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__16);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__18);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__20);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__22);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__41);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__42);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__43);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__44);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__45);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__47);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__51);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__52);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__53);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__54);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__55);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__56);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__59);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__60);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__61);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__62);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__63);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__64);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__65);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__66);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__67);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__68);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__72);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__73);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__74);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__75);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__77);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__78);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__81);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__82);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__84);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__85);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__86);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__87);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__88);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__89);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__90);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__91);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__92);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__94);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__95);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__96);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__97);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__99);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__100);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__101);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__102);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__103);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__104);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__109);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__111);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__112);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__113);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__114);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__115);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__117);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__119);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__120);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__122);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__124);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__126);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__128);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__129);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__130);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__131);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__132);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__133);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__134);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__135);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__136);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__137);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__139);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__140);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__141);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__142);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__143);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__145);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__146);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__147);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__149);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__151);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__154);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__155);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__157);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__159);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__160);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__161);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__163);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__164);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__165);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__167);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__169);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__171);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__173);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__175);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__177);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__179);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__181);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__183);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__185);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__187);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__188);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__189);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__190);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__191);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__192);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__193);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__195);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__196);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__197);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__198);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__199);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__200);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__201);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__202);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__203);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__204);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__205);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__206);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__207);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__208);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__210);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__212);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__214);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__215);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__216);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__218);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__219);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__220);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__221);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__223);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__225);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__227);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__228);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__229);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__231);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__233);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__234);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__235);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__237);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__239);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__240);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__242);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__243);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__244);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__245);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__246);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__247);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__248);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__249);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__250);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__251);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__252);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__253);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__256);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__257);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__258);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__259);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__260);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__261);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__262);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__263);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__264);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__265);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__266);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__267);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__268);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__269);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__270);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__271);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__272);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__273);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__274);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__275);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__276);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__277);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__278);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__279);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__280);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__281);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__282);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__283);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__284);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__285);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__286);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__287);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__288);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__289);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__290);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__291);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__292);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__294);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__295);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__297);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__298);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__299);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__300);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__302);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__303);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__305);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__307);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__309);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__311);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__313);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__315);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__318);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__320);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__321);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__322);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__323);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__324);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__325);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__326);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__327);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__328);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__329);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__330);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__331);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__332);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__333);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__334);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__336);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__337);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__338);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__339);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__340);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__341);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__343);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__344);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__345);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__347);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__348);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__350);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__351);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__352);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__354);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__355);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__357);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__359);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__361);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__363);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__365);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__367);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__369);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__373);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__376);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__377);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__378);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__380);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__381);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__382);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__383);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__384);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__386);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__387);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__390);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__391);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__392);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__394);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__397);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__398);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__399);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__400);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__401);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__402);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__404);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__407);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__408);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__410);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__411);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__412);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__413);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__414);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__415);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__416);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__418);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__419);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__420);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__421);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__422);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__423);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__425);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__426);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__428);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__429);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__430);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__431);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__432);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__433);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__434);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__442);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__443);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__445);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__446);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__447);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__449);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__451);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__452);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__454);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__455);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__456);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__458);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__459);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__461);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__469);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__470);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__471);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__473);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__474);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__475);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__477);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__478);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__479);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__480);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__481);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__482);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__483);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__488);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__489);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__490);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__492);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__493);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__495);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__496);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__498);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__499);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__501);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__503);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__505);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__507);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__508);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__510);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__511);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__512);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__513);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__514);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__516);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__518);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__519);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__520);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__521);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__522);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__523);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__524);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__525);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__526);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__527);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__528);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__529);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__530);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__531);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__532);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__535);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__540);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__541);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__547);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__549);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__551);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__552);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__553);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__555);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__557);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__559);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__563);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__567);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__568);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__569);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__571);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__572);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__573);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__574);
+  Py_CLEAR(clear_module_state->__pyx_codeobj__575);
+  return 0;
+}
+#endif
+/* #### Code section: module_state_traverse ### */
+#if CYTHON_USE_MODULE_STATE
+static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) {
+  __pyx_mstate *traverse_module_state = __pyx_mstate(m);
+  if (!traverse_module_state) return 0;
+  Py_VISIT(traverse_module_state->__pyx_d);
+  Py_VISIT(traverse_module_state->__pyx_b);
+  Py_VISIT(traverse_module_state->__pyx_cython_runtime);
+  Py_VISIT(traverse_module_state->__pyx_empty_tuple);
+  Py_VISIT(traverse_module_state->__pyx_empty_bytes);
+  Py_VISIT(traverse_module_state->__pyx_empty_unicode);
+  #ifdef __Pyx_CyFunction_USED
+  Py_VISIT(traverse_module_state->__pyx_CyFunctionType);
+  #endif
+  #ifdef __Pyx_FusedFunction_USED
+  Py_VISIT(traverse_module_state->__pyx_FusedFunctionType);
+  #endif
+  Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4bool_bool);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_7complex_complex);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__ChannelArg);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__ChannelArg);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__ChannelArgs);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__ChannelArgs);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_Call);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_Call);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__CallState);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__CallState);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__ChannelState);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__ChannelState);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_IntegratedCall);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_IntegratedCall);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_SegregatedCall);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_SegregatedCall);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_Channel);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_Channel);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CallHandle);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CallHandle);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CompositeCallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_SSLChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CompositeChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_XDSChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ServerCertificateConfig);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ServerCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ServerCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_LocalChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ALTSChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__LatentEventArg);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__LatentEventArg);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_BaseEvent);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_BaseEvent);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ConnectivityEvent);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_RequestCallEvent);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_RequestCallEvent);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_BatchOperationEvent);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ServerShutdownEvent);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_Operation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_Operation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_SendMessageOperation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_SendMessageOperation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ReceiveMessageOperation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CallDetails);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CallDetails);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_SslPemKeyCertPair);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CompressionOptions);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CompressionOptions);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_Server);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_Server);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__Tag);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__Tag);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__ConnectivityTag);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__ConnectivityTag);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__RequestCallTag);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__RequestCallTag);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__BatchOperationTag);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__BatchOperationTag);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__ServerShutdownTag);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_BaseCompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__BoundEventLoop);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__BoundEventLoop);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_PollerCompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_AioRpcStatus);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_AioRpcStatus);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__AioState);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__AioState);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CallbackFailureHandler);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CallbackWrapper);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CallbackWrapper);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_GrpcCallWrapper);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__AioCall);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__AioCall);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_AioChannel);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_AioChannel);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__HandlerCallDetails);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__HandlerCallDetails);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_RPCState);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_RPCState);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__ServicerContext);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__SyncServicerContext);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__MessageReceiver);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__MessageReceiver);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_AioServer);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_AioServer);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc__GrpcArgWrapper);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_InsecureChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc_CensusContext);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc_CensusContext);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init__);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext__);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown);
+  Py_VISIT(traverse_module_state->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination);
+  Py_VISIT(traverse_module_state->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination);
+  Py_VISIT(traverse_module_state->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg);
+  Py_VISIT(traverse_module_state->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg);
+  Py_VISIT(traverse_module_state->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_);
+  Py_VISIT(traverse_module_state->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_);
+  Py_VISIT(traverse_module_state->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args);
+  Py_VISIT(traverse_module_state->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args);
+  Py_VISIT(traverse_module_state->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_);
+  Py_VISIT(traverse_module_state->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_0);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_1);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ALTSChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ALTSChannelCredentials___reduce);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ALTSChannelCredentials___setstat);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AWAIT_THREADS_TIMEOUT_SECONDS);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AbortError);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Abort_already_called);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Abort_error_has_been_replaced);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Abort_error_unexpectedly_suppres);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Aborting_method_s_due_to_server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ActiveThreadCount);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ActiveThreadCount___init);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ActiveThreadCount_await_zero_th);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ActiveThreadCount_decrement);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ActiveThreadCount_increment);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall__handle_status_once_rec);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall__repr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_add_done_callback);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_cancel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_cancelled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_done);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_initiate_stream_stream);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_initiate_unary_stream);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_is_locally_cancelled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_is_ok);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_receive_serialized_mess);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_send_receive_close);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_send_serialized_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_set_internal_error);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_status);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_stream_unary);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_time_remaining);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioCall_unary_unary);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel_check_connectivity_st);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel_close);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel_closed);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel_closing);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioChannel_watch_connectivity_st);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioRpcStatus);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioRpcStatus___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioRpcStatus___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioRpcStatus_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioRpcStatus_debug_error_string);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioRpcStatus_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioRpcStatus_trailing_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer__request_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer__server_main_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer__serving_task_crash_ha);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer__start_shutting_down);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer_add_generic_rpc_handle);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer_add_insecure_port);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer_add_secure_port);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer_is_running);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer_shutdown);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer_start);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioServer_wait_for_termination);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioState);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioState___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AioState___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AsyncIOEngine);
+  Py_VISIT(traverse_module_state->__pyx_n_s_AttributeError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BaseCompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BaseCompletionQueue___reduce_cyt);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BaseCompletionQueue___setstate_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BaseError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BaseEvent);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BatchOperationEvent);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BatchOperationEvent___reduce_cyt);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BatchOperationEvent___setstate_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BatchOperationTag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BatchOperationTag___reduce_cyth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BatchOperationTag___setstate_cy);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Binary_metadata_key_s_expected_b);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BoundEventLoop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BoundEventLoop___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BoundEventLoop___setstate_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_BoundEventLoop_close);
+  Py_VISIT(traverse_module_state->__pyx_n_s_COMPRESSION_METADATA_STRING_MAP);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CUSTOM_IO_MANAGER);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CYGRPC_STATUS_CODE_TO_STATUS_COD);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallCredentials___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallCredentials___setstate_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallDetails);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallDetails___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallDetails___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallHandle);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallHandle___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallHandle___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallState);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallState___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallState___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call__custom_op_on_c_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call__start_batch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call_cancel);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Call_credentials_are_only_valid);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Call_credentials_may_not_be_NULL);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call_peer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call_set_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call_start_client_batch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Call_start_server_batch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallbackFailureHandler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallbackFailureHandler___reduce);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallbackFailureHandler___setstat);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallbackWrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallbackWrapper___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CallbackWrapper___setstate_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CancelledError);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_invoke_RPC_on_closed_chan);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_invoke_RPC_s);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Cannot_monitor_channel_state_s);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CensusContext);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CensusContext___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CensusContext___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelArg);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelArgKey);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelArg___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelArg___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelArgs);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelArgs___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelArgs___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelCredentials___reduce_cyth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelCredentials___setstate_cy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelState);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelState___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ChannelState___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_check_connectivity_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_close);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_close_on_fork);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_get_registered_call_hand);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_integrated_call);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Channel_is_closed);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_next_call_event);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_segregated_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_target);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Channel_watch_connectivity_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompletionQueue___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompletionQueue___setstate_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompletionQueue__internal_poll);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompletionQueue_clear);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompletionQueue_poll);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompletionQueue_shutdown);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompletionType);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompositeCallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompositeCallCredentials___reduc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompositeCallCredentials___setst);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompositeChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompositeChannelCredentials___re);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompositeChannelCredentials___se);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionAlgorithm);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionLevel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionOptions);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionOptions___reduce_cyth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionOptions___setstate_cy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionOptions_disable_algor);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionOptions_enable_algori);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionOptions_is_algorithm);
+  Py_VISIT(traverse_module_state->__pyx_n_s_CompressionOptions_to_channel_ar);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Compression_setting_must_be_spec);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ComputeEngineChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ComputeEngineChannelCredentials_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ComputeEngineChannelCredentials_3);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConcurrentRpcLimiter);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConcurrentRpcLimiter___reduce_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConcurrentRpcLimiter___setstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConcurrentRpcLimiter__decrease);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConcurrentRpcLimiter_check_befo);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConcurrentRpcLimiter_decrease_o);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Concurrent_RPC_limit_exceeded);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Condition);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConnectivityEvent);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConnectivityEvent___reduce_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConnectivityEvent___setstate_cyt);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConnectivityState);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConnectivityTag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConnectivityTag___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ConnectivityTag___setstate_cyth);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Core_should_not_return_GRPC_QUEU);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Credentials_couldn_t_have_been_s);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Dedicated_exception_class_for_wa);
+  Py_VISIT(traverse_module_state->__pyx_n_s_DeprecationWarning);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EMPTY_FLAGS);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EMPTY_MASK);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EOF);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EOF_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EOF___bool);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EOF___len);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EOF___repr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EOF___str);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EOF__repr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_EX_USAGE);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Enum);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Error_fetching_certificate_confi);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Error_fetching_certificate_confi_2);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Error_in_callback_for_method_s);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Error_in_grpc_server_request_cal);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ExecuteBatchError);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_ExecuteBatchError_raised_in_core);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Exiting_child_due_to_raised_exce);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Expected_bytes_str_or_unicode_no);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Expected_int_bytes_or_behavior_g);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Expected_str_not);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Expecting_non_ok_status_code);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_grpc_call_start_batch_wit);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_s_s);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_sending_error_status_from);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_get_server_sockets_ple);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_get_servers_please_ens);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_get_the_channel_please);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_get_the_server_please);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_get_the_socket_please);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_get_the_subchannel_ple);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_get_top_channels_pleas);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_receive_any_message_fr);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_shutdown_gRPC_Core_aft);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Failed_to_shutdown_gRPC_Python_t);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ForkManagedThread);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ForkManagedThread___init);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ForkManagedThread___init___local);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ForkManagedThread_join);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ForkManagedThread_setDaemon);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ForkManagedThread_start);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ForkState);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ForkState___init);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_ASYNCIO_ENGINE);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_COMPRESSION_CHANNEL_DEFAULT);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_COMPRESSION_REQUEST_ALGORIT);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_PROPAGATE_CANCELLATION);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_PROPAGATE_CENSUS_STATS_CONT);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_PROPAGATE_CENSUS_TRACING_CO);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_PROPAGATE_DEADLINE);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GRPC_PROPAGATE_DEFAULTS);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Group);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GrpcArgWrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GrpcArgWrapper___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GrpcArgWrapper___setstate_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_GrpcCallWrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_HandlerCallDetails);
+  Py_VISIT(traverse_module_state->__pyx_n_s_HandlerCallDetails___reduce_cyt);
+  Py_VISIT(traverse_module_state->__pyx_n_s_HandlerCallDetails___setstate_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_IMMUTABLE_EMPTY_METADATA);
+  Py_VISIT(traverse_module_state->__pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ImportError);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_InitialMetadataFlags);
+  Py_VISIT(traverse_module_state->__pyx_n_s_InsecureChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_InsecureChannelCredentials___red);
+  Py_VISIT(traverse_module_state->__pyx_n_s_InsecureChannelCredentials___set);
+  Py_VISIT(traverse_module_state->__pyx_n_s_IntegratedCall);
+  Py_VISIT(traverse_module_state->__pyx_n_s_IntegratedCall___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_IntegratedCall___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_IntegratedCall_cancel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_IntegratedCall_operate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_InternalError);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Internal_error_from_Core);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Internal_gRPC_call_error_d);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Invalid_encoding_on_s);
+  Py_VISIT(traverse_module_state->__pyx_kp_u_Invalid_trailing_metadata_type_e);
+  Py_VISIT(traverse_module_state->__pyx_n_s_KeyError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_KeyboardInterrupt);
+  Py_VISIT(traverse_module_state->__pyx_n_s_LOGGER);
+  Py_VISIT(traverse_module_state->__pyx_n_s_LatentEventArg);
+  Py_VISIT(traverse_module_state->__pyx_n_s_LocalChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_LocalChannelCredentials___reduce);
+  Py_VISIT(traverse_module_state->__pyx_n_s_LocalChannelCredentials___setsta);
+  Py_VISIT(traverse_module_state->__pyx_n_s_LocalConnectionType);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Locally_aborted);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Lock);
+  Py_VISIT(traverse_module_state->__pyx_n_s_MessageReceiver);
+  Py_VISIT(traverse_module_state->__pyx_n_s_MessageReceiver___anext);
+  Py_VISIT(traverse_module_state->__pyx_n_s_MessageReceiver___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_MessageReceiver___setstate_cyth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_MessageReceiver__async_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_MetadataPluginCallCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_MetadataPluginCallCredentials_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_MetadataPluginCallCredentials_3);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Metadatum);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Method_not_found);
+  Py_VISIT(traverse_module_state->__pyx_n_s_NON_OK_CALL_REPRESENTATION);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_No_custom_hooks_are_implemented);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Non_thread_safe_operation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_None);
+  Py_VISIT(traverse_module_state->__pyx_n_s_NotImplementedError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_OK_CALL_REPRESENTATION);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Operation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_OperationType);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Operation___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Operation___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Optional);
+  Py_VISIT(traverse_module_state->__pyx_n_s_POLLER);
+  Py_VISIT(traverse_module_state->__pyx_n_s_PickleError);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Please_report_to_https_github_co);
+  Py_VISIT(traverse_module_state->__pyx_n_s_PollerCompletionQueue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_PollerCompletionQueue___reduce_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_PollerCompletionQueue___setstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_PollerCompletionQueue__handle_ev);
+  Py_VISIT(traverse_module_state->__pyx_n_s_PollerCompletionQueue__poll_wrap);
+  Py_VISIT(traverse_module_state->__pyx_n_s_PollerCompletionQueue_bind_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_PropagationConstants);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_3);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_voi);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Queue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RLock);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RPCState);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RPCState___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RPCState___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_RPC_already_finished);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_RPC_cancelled_for_servicer_metho);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_RPC_cancelled_for_unknown_reason);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Raised_if_the_server_is_stopped);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Raised_upon_unexpected_errors_in);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Raised_when_calling_abort_in_ser);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Raised_when_execute_batch_return);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Raised_when_the_usage_of_API_by);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveCloseOnServerOperation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveCloseOnServerOperation_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveCloseOnServerOperation_3);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveCloseOnServerOperation_ca);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveCloseOnServerOperation_ty);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveInitialMetadataOperation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveInitialMetadataOperation_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveInitialMetadataOperation_3);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveInitialMetadataOperation_4);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveInitialMetadataOperation_5);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveMessageOperation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveMessageOperation___reduce);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveMessageOperation___setsta);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveMessageOperation_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveMessageOperation_type);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveStatusOnClientOperation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_3);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_d);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_e);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_t);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ReceiveStatusOnClientOperation_t_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RequestCallError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RequestCallEvent);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RequestCallEvent___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RequestCallEvent___setstate_cyth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RequestCallTag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RequestCallTag___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RequestCallTag___setstate_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_RuntimeError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SERVICES_TO_EXCLUDE);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SSLChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SSLChannelCredentials___reduce_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SSLChannelCredentials___setstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SSLSessionCacheLRU);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SSLSessionCacheLRU___reduce_cyth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SSLSessionCacheLRU___setstate_cy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SegregatedCall);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SegregatedCall___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SegregatedCall___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SegregatedCall_cancel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SegregatedCall_next_event);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SegregatedCall_operate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendCloseFromClientOperation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendCloseFromClientOperation___r);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendCloseFromClientOperation___s);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendCloseFromClientOperation_typ);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendInitialMetadataOperation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendInitialMetadataOperation___r);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendInitialMetadataOperation___s);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendInitialMetadataOperation_typ);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendMessageOperation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendMessageOperation___reduce_cy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendMessageOperation___setstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendMessageOperation_type);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendStatusFromServerOperation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendStatusFromServerOperation_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendStatusFromServerOperation_3);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SendStatusFromServerOperation_ty);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Send_initial_metadata_failed_alr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerCertificateConfig);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerCertificateConfig___reduce);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerCertificateConfig___setsta);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerCertificateConfiguration);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerCredentials___reduce_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerCredentials___setstate_cyt);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerShutdownEvent);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerShutdownEvent___reduce_cyt);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerShutdownEvent___setstate_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerShutdownTag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerShutdownTag___reduce_cyth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerShutdownTag___setstate_cy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServerStoppedError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server_add_http2_port);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Server_already_stopped);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server_cancel_all_calls);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server_destroy);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Server_not_in_ready_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server_register_completion_queue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server_request_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server_shutdown);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Server_shutdown_failed_no_comple);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Server_start);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext___setstate_cyth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_abort);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_abort_with_stat);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_add_done_callba);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_auth_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_cancelled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_disable_next_me);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_done);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_invocation_meta);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_peer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_peer_identities);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_peer_identity_k);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_read);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_send_initial_me);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_set_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_set_compression);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_set_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_set_trailing_me);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_time_remaining);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_trailing_metada);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ServicerContext_write);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SslPemKeyCertPair);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SslPemKeyCertPair___reduce_cytho);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SslPemKeyCertPair___setstate_cyt);
+  Py_VISIT(traverse_module_state->__pyx_n_s_StatusCode);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext___reduce_cy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext___setstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_abort);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_add_callbac);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_auth_contex);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_disable_nex);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_invocation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_peer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_peer_identi);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_peer_identi_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_send_initia);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_set_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_set_compres);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_set_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_set_trailin);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SyncServicerContext_time_remain);
+  Py_VISIT(traverse_module_state->__pyx_n_s_SystemExit);
+  Py_VISIT(traverse_module_state->__pyx_n_s_TRUE);
+  Py_VISIT(traverse_module_state->__pyx_n_s_TRUE_VALUES);
+  Py_VISIT(traverse_module_state->__pyx_n_s_TYPE_METADATA_STRING);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Tag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Tag___reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Tag___setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_The_base_class_for_exceptions_ge);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Thread);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Timed_out);
+  Py_VISIT(traverse_module_state->__pyx_n_s_TimeoutError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_True);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Tuple_Tuple_str_Union_str_bytes);
+  Py_VISIT(traverse_module_state->__pyx_n_s_TypeError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_UNKNOWN_CANCELLATION_DETAILS);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Unexpected_s_raised_by_servicer);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Unexpected_s_s);
+  Py_VISIT(traverse_module_state->__pyx_n_s_UnicodeDecodeError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Unknown);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Unsupported_engine_type_s);
+  Py_VISIT(traverse_module_state->__pyx_n_s_UsageError);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_Using_s_as_I_O_engine);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ValueError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_WatchConnectivityFailed);
+  Py_VISIT(traverse_module_state->__pyx_n_s_WriteFlag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_XDSChannelCredentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_XDSChannelCredentials___reduce_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_XDSChannelCredentials___setstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_YES);
+  Py_VISIT(traverse_module_state->__pyx_n_s_Yes);
+  Py_VISIT(traverse_module_state->__pyx_n_s__107);
+  Py_VISIT(traverse_module_state->__pyx_n_s__38);
+  Py_VISIT(traverse_module_state->__pyx_kp_u__49);
+  Py_VISIT(traverse_module_state->__pyx_n_s__57);
+  Py_VISIT(traverse_module_state->__pyx_kp_u__58);
+  Py_VISIT(traverse_module_state->__pyx_kp_u__69);
+  Py_VISIT(traverse_module_state->__pyx_kp_b__7);
+  Py_VISIT(traverse_module_state->__pyx_kp_s__7);
+  Py_VISIT(traverse_module_state->__pyx_kp_u__70);
+  Py_VISIT(traverse_module_state->__pyx_kp_u__71);
+  Py_VISIT(traverse_module_state->__pyx_n_s_abort);
+  Py_VISIT(traverse_module_state->__pyx_n_s_abort_with_status);
+  Py_VISIT(traverse_module_state->__pyx_n_s_aborted);
+  Py_VISIT(traverse_module_state->__pyx_n_s_active_thread_count);
+  Py_VISIT(traverse_module_state->__pyx_n_s_actual_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add_callback);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add_callback_handler_locals_han);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add_done_callback);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add_generic_rpc_handlers);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add_http2_port);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add_insecure_port);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add_reader);
+  Py_VISIT(traverse_module_state->__pyx_n_s_add_secure_port);
+  Py_VISIT(traverse_module_state->__pyx_n_s_address);
+  Py_VISIT(traverse_module_state->__pyx_n_s_address_c_string);
+  Py_VISIT(traverse_module_state->__pyx_n_s_aenter);
+  Py_VISIT(traverse_module_state->__pyx_n_s_aexit);
+  Py_VISIT(traverse_module_state->__pyx_n_s_after_in_child);
+  Py_VISIT(traverse_module_state->__pyx_n_s_after_in_parent);
+  Py_VISIT(traverse_module_state->__pyx_n_s_agen);
+  Py_VISIT(traverse_module_state->__pyx_n_s_aiter);
+  Py_VISIT(traverse_module_state->__pyx_n_s_algorithm);
+  Py_VISIT(traverse_module_state->__pyx_n_s_already_accepted);
+  Py_VISIT(traverse_module_state->__pyx_n_s_already_exists);
+  Py_VISIT(traverse_module_state->__pyx_n_s_already_finished);
+  Py_VISIT(traverse_module_state->__pyx_n_s_already_invoked);
+  Py_VISIT(traverse_module_state->__pyx_n_s_anext);
+  Py_VISIT(traverse_module_state->__pyx_n_s_append);
+  Py_VISIT(traverse_module_state->__pyx_n_s_apply);
+  Py_VISIT(traverse_module_state->__pyx_n_s_args);
+  Py_VISIT(traverse_module_state->__pyx_n_s_arguments);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ascii);
+  Py_VISIT(traverse_module_state->__pyx_n_s_async_callback_func);
+  Py_VISIT(traverse_module_state->__pyx_n_s_async_generator_to_generator);
+  Py_VISIT(traverse_module_state->__pyx_n_s_async_message_receiver);
+  Py_VISIT(traverse_module_state->__pyx_n_s_async_response_generator);
+  Py_VISIT(traverse_module_state->__pyx_n_s_asyncio);
+  Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines);
+  Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_tasks);
+  Py_VISIT(traverse_module_state->__pyx_n_s_atexit);
+  Py_VISIT(traverse_module_state->__pyx_n_s_auth_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_await);
+  Py_VISIT(traverse_module_state->__pyx_n_s_await_zero_threads);
+  Py_VISIT(traverse_module_state->__pyx_n_s_backup_queue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_batch_error);
+  Py_VISIT(traverse_module_state->__pyx_n_s_batch_operation_tag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_batch_operations);
+  Py_VISIT(traverse_module_state->__pyx_n_s_before);
+  Py_VISIT(traverse_module_state->__pyx_kp_b_bin);
+  Py_VISIT(traverse_module_state->__pyx_n_s_bind_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_block_if_fork_in_progress);
+  Py_VISIT(traverse_module_state->__pyx_n_s_bool);
+  Py_VISIT(traverse_module_state->__pyx_n_s_buffer_hint);
+  Py_VISIT(traverse_module_state->__pyx_n_s_build_census_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_bytes_ctx);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_call_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_cert_config);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_deadline);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_error_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_event);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_key);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_options);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_peer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_pem_root_certs);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_returned_str);
+  Py_VISIT(traverse_module_state->__pyx_n_s_c_target);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_credentialses);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_creds);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_error);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_handle);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_queue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_soon_threadsafe);
+  Py_VISIT(traverse_module_state->__pyx_n_s_call_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_callback);
+  Py_VISIT(traverse_module_state->__pyx_n_s_callback_func);
+  Py_VISIT(traverse_module_state->__pyx_n_s_callback_wrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cancel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cancel_all_calls);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cancelled);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_cannot_register_completion_queue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_capacity);
+  Py_VISIT(traverse_module_state->__pyx_n_s_capsule);
+  Py_VISIT(traverse_module_state->__pyx_n_s_capsule_ptr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_catch_warnings);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cb);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cb_func);
+  Py_VISIT(traverse_module_state->__pyx_n_s_census_ctx);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cert_config);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cert_config_fetcher);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_cert_config_fetcher_must_be_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_certificate_chain);
+  Py_VISIT(traverse_module_state->__pyx_n_s_certificate_configuration);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cfunc_to_py);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channel_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channel_credentials_alts);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channel_credentials_compute_engi);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channel_credentials_insecure);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channel_credentials_local);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channel_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channel_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channels);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channelz_get_channel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channelz_get_server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channelz_get_server_sockets);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channelz_get_servers);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channelz_get_socket);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channelz_get_subchannel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_channelz_get_top_channels);
+  Py_VISIT(traverse_module_state->__pyx_n_s_check_before_request_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_check_connectivity_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_class);
+  Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem);
+  Py_VISIT(traverse_module_state->__pyx_n_s_clear);
+  Py_VISIT(traverse_module_state->__pyx_n_s_clear_server_call_tracer_factory);
+  Py_VISIT(traverse_module_state->__pyx_n_s_client_config_in_slice);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback);
+  Py_VISIT(traverse_module_state->__pyx_n_s_close);
+  Py_VISIT(traverse_module_state->__pyx_n_s_close_on_fork);
+  Py_VISIT(traverse_module_state->__pyx_n_s_close_on_fork_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_closed);
+  Py_VISIT(traverse_module_state->__pyx_n_s_closing);
+  Py_VISIT(traverse_module_state->__pyx_n_s_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_codecs);
+  Py_VISIT(traverse_module_state->__pyx_n_s_collections);
+  Py_VISIT(traverse_module_state->__pyx_n_s_common);
+  Py_VISIT(traverse_module_state->__pyx_n_s_completion_type);
+  Py_VISIT(traverse_module_state->__pyx_n_s_compression);
+  Py_VISIT(traverse_module_state->__pyx_n_s_compression_algorithm_name);
+  Py_VISIT(traverse_module_state->__pyx_n_s_concurrency_exceeded);
+  Py_VISIT(traverse_module_state->__pyx_n_s_condition);
+  Py_VISIT(traverse_module_state->__pyx_n_s_connecting);
+  Py_VISIT(traverse_module_state->__pyx_n_s_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_context_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_contextvars);
+  Py_VISIT(traverse_module_state->__pyx_n_s_contextvars_supported);
+  Py_VISIT(traverse_module_state->__pyx_n_s_continuation);
+  Py_VISIT(traverse_module_state->__pyx_n_s_copy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_copy_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_core_function_name);
+  Py_VISIT(traverse_module_state->__pyx_n_s_coro);
+  Py_VISIT(traverse_module_state->__pyx_n_s_create_client_call_tracer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_create_future);
+  Py_VISIT(traverse_module_state->__pyx_n_s_create_server_call_tracer_factor);
+  Py_VISIT(traverse_module_state->__pyx_n_s_create_task);
+  Py_VISIT(traverse_module_state->__pyx_n_s_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_credentials_2);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_credentials_roots_pem);
+  Py_VISIT(traverse_module_state->__pyx_n_s_creds);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ctx);
+  Py_VISIT(traverse_module_state->__pyx_n_s_custom_io_manager);
+  Py_VISIT(traverse_module_state->__pyx_n_s_custom_op_on_c_call);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_cygrpc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cython_call_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_cython_cygrpc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_daemon);
+  Py_VISIT(traverse_module_state->__pyx_n_s_daemonic);
+  Py_VISIT(traverse_module_state->__pyx_n_s_data);
+  Py_VISIT(traverse_module_state->__pyx_n_s_data_loss);
+  Py_VISIT(traverse_module_state->__pyx_n_s_deadline);
+  Py_VISIT(traverse_module_state->__pyx_n_s_deadline_exceeded);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_dealloc___called_on_running_se);
+  Py_VISIT(traverse_module_state->__pyx_n_s_debug);
+  Py_VISIT(traverse_module_state->__pyx_n_s_debug_error_string);
+  Py_VISIT(traverse_module_state->__pyx_n_s_decode);
+  Py_VISIT(traverse_module_state->__pyx_n_s_decrease_active_rpcs_count);
+  Py_VISIT(traverse_module_state->__pyx_n_s_decrease_once_finished);
+  Py_VISIT(traverse_module_state->__pyx_n_s_decrement);
+  Py_VISIT(traverse_module_state->__pyx_n_s_default_authority);
+  Py_VISIT(traverse_module_state->__pyx_n_s_default_vtable);
+  Py_VISIT(traverse_module_state->__pyx_n_s_deflate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_delete_call_tracer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_destroy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_details_bytes);
+  Py_VISIT(traverse_module_state->__pyx_n_s_dict);
+  Py_VISIT(traverse_module_state->__pyx_n_s_dict_2);
+  Py_VISIT(traverse_module_state->__pyx_kp_u_disable);
+  Py_VISIT(traverse_module_state->__pyx_n_s_disable_algorithm);
+  Py_VISIT(traverse_module_state->__pyx_n_s_disable_next_message_compression);
+  Py_VISIT(traverse_module_state->__pyx_n_s_discard);
+  Py_VISIT(traverse_module_state->__pyx_n_s_doc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_done);
+  Py_VISIT(traverse_module_state->__pyx_n_s_dump_xds_configs);
+  Py_VISIT(traverse_module_state->__pyx_n_s_e);
+  Py_VISIT(traverse_module_state->__pyx_kp_u_enable);
+  Py_VISIT(traverse_module_state->__pyx_n_s_enable_algorithm);
+  Py_VISIT(traverse_module_state->__pyx_n_s_enable_census);
+  Py_VISIT(traverse_module_state->__pyx_n_s_encode);
+  Py_VISIT(traverse_module_state->__pyx_n_s_end_time);
+  Py_VISIT(traverse_module_state->__pyx_n_s_endswith);
+  Py_VISIT(traverse_module_state->__pyx_n_s_enter);
+  Py_VISIT(traverse_module_state->__pyx_n_s_enter_user_request_generator);
+  Py_VISIT(traverse_module_state->__pyx_n_s_enum);
+  Py_VISIT(traverse_module_state->__pyx_n_s_enumerate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_environ);
+  Py_VISIT(traverse_module_state->__pyx_n_s_errno);
+  Py_VISIT(traverse_module_state->__pyx_n_s_error);
+  Py_VISIT(traverse_module_state->__pyx_n_s_error_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_error_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_error_str);
+  Py_VISIT(traverse_module_state->__pyx_n_s_error_string);
+  Py_VISIT(traverse_module_state->__pyx_n_s_event);
+  Py_VISIT(traverse_module_state->__pyx_n_s_exc_info);
+  Py_VISIT(traverse_module_state->__pyx_n_s_exception);
+  Py_VISIT(traverse_module_state->__pyx_n_s_exception_type);
+  Py_VISIT(traverse_module_state->__pyx_n_s_execute_batch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_exit);
+  Py_VISIT(traverse_module_state->__pyx_n_s_exit_2);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_expected_certificate_to_be_bytes);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_expected_pem_key_cert_pairs_to_b);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_expected_registered_completion_q);
+  Py_VISIT(traverse_module_state->__pyx_n_s_failed_precondition);
+  Py_VISIT(traverse_module_state->__pyx_n_s_failure_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fallback_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fileno);
+  Py_VISIT(traverse_module_state->__pyx_n_s_find_method_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_find_method_handler_locals_quer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_finish_handler_with_stream_resp);
+  Py_VISIT(traverse_module_state->__pyx_n_s_finish_handler_with_unary_respo);
+  Py_VISIT(traverse_module_state->__pyx_n_s_finish_ops);
+  Py_VISIT(traverse_module_state->__pyx_n_s_flags);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fn);
+  Py_VISIT(traverse_module_state->__pyx_n_s_force_client_auth);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_epoch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_handler_failed);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_handler_registered);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_handler_registered_lock);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_handlers_and_grpc_init);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_in_progress);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_in_progress_condition);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_register_channel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_fork_unregister_channel);
+  Py_VISIT(traverse_module_state->__pyx_n_s_format);
+  Py_VISIT(traverse_module_state->__pyx_n_s_format_exception);
+  Py_VISIT(traverse_module_state->__pyx_n_s_functools);
+  Py_VISIT(traverse_module_state->__pyx_n_s_future);
+  Py_VISIT(traverse_module_state->__pyx_n_s_g_gevent_activated);
+  Py_VISIT(traverse_module_state->__pyx_n_s_g_gevent_pool);
+  Py_VISIT(traverse_module_state->__pyx_n_s_g_gevent_threadpool);
+  Py_VISIT(traverse_module_state->__pyx_n_s_g_interrupt_check_period_ms);
+  Py_VISIT(traverse_module_state->__pyx_kp_u_gc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_gen);
+  Py_VISIT(traverse_module_state->__pyx_n_s_generator_to_async_generator);
+  Py_VISIT(traverse_module_state->__pyx_n_s_generator_to_async_generator_loc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_generic_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_generic_handlers);
+  Py_VISIT(traverse_module_state->__pyx_n_s_generic_rpc_handlers);
+  Py_VISIT(traverse_module_state->__pyx_n_s_genexpr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get);
+  Py_VISIT(traverse_module_state->__pyx_n_s_getLogger);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_data);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_deadline_from_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_event_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_event_loop_policy);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_fork_epoch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_hub);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_metadata_locals_callback);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_plugin);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_registered_call_handle);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_running_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_get_working_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_getstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_gevent);
+  Py_VISIT(traverse_module_state->__pyx_n_s_gevent_decrement_channel_count);
+  Py_VISIT(traverse_module_state->__pyx_n_s_gevent_hub);
+  Py_VISIT(traverse_module_state->__pyx_n_s_gevent_increment_channel_count);
+  Py_VISIT(traverse_module_state->__pyx_n_s_gevent_pool);
+  Py_VISIT(traverse_module_state->__pyx_n_s_grace);
+  Py_VISIT(traverse_module_state->__pyx_n_s_grpc);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_grpc_aio_EOF);
+  Py_VISIT(traverse_module_state->__pyx_n_s_grpc_call_error_string);
+  Py_VISIT(traverse_module_state->__pyx_n_s_grpc_call_wrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_grpc_completion_queue_shutdown);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap);
+  Py_VISIT(traverse_module_state->__pyx_n_s_grpc_server_request_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_grpc_server_shutdown_and_notify);
+  Py_VISIT(traverse_module_state->__pyx_n_s_grpc_shutdown_wrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_gzip);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_callback_wrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_callbacks);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_cancellation_from_core);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_events);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_exceptions);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_rpc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_status_once_received);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_stream_stream_rpc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_stream_unary_rpc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_unary_stream_rpc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handle_unary_unary_rpc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_handler_call_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_hex_codec);
+  Py_VISIT(traverse_module_state->__pyx_n_s_high);
+  Py_VISIT(traverse_module_state->__pyx_n_s_host);
+  Py_VISIT(traverse_module_state->__pyx_n_s_http2_initial_sequence_number);
+  Py_VISIT(traverse_module_state->__pyx_n_s_hub);
+  Py_VISIT(traverse_module_state->__pyx_n_s_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_identities);
+  Py_VISIT(traverse_module_state->__pyx_n_s_identity);
+  Py_VISIT(traverse_module_state->__pyx_n_s_identity_key);
+  Py_VISIT(traverse_module_state->__pyx_n_s_idle);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_if_error_code_is_specified_so_mu);
+  Py_VISIT(traverse_module_state->__pyx_n_s_import);
+  Py_VISIT(traverse_module_state->__pyx_n_s_inbound_ops);
+  Py_VISIT(traverse_module_state->__pyx_n_s_increment);
+  Py_VISIT(traverse_module_state->__pyx_n_s_init);
+  Py_VISIT(traverse_module_state->__pyx_n_s_init_grpc_aio);
+  Py_VISIT(traverse_module_state->__pyx_n_s_init_grpc_gevent);
+  Py_VISIT(traverse_module_state->__pyx_n_s_init_subclass);
+  Py_VISIT(traverse_module_state->__pyx_n_s_initial_cert_config);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_initial_cert_config_must_be_a_gr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_initial_metadata_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_initializing);
+  Py_VISIT(traverse_module_state->__pyx_n_s_initiate_stream_stream);
+  Py_VISIT(traverse_module_state->__pyx_n_s_initiate_unary_stream);
+  Py_VISIT(traverse_module_state->__pyx_n_s_insecure_server_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_inspect);
+  Py_VISIT(traverse_module_state->__pyx_n_s_install_context_from_request_cal);
+  Py_VISIT(traverse_module_state->__pyx_n_s_install_context_from_request_cal_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_int);
+  Py_VISIT(traverse_module_state->__pyx_n_s_integrated_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_integrated_call_locals_on_succe);
+  Py_VISIT(traverse_module_state->__pyx_n_s_intercept_service);
+  Py_VISIT(traverse_module_state->__pyx_n_s_interceptor);
+  Py_VISIT(traverse_module_state->__pyx_n_s_interceptors);
+  Py_VISIT(traverse_module_state->__pyx_n_s_internal);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_internal_error_user_data_must_be);
+  Py_VISIT(traverse_module_state->__pyx_n_s_internal_poll);
+  Py_VISIT(traverse_module_state->__pyx_n_s_invalid_argument);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_invalid_call_object_cannot_be_us);
+  Py_VISIT(traverse_module_state->__pyx_n_s_invalid_flags);
+  Py_VISIT(traverse_module_state->__pyx_n_s_invalid_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_invocation_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_algorithm_enabled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_async_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_fork_support_enabled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_locally_cancelled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_ok);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_running);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_sampled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_is_valid);
+  Py_VISIT(traverse_module_state->__pyx_n_s_isasyncgenfunction);
+  Py_VISIT(traverse_module_state->__pyx_n_s_isawaitable);
+  Py_VISIT(traverse_module_state->__pyx_n_s_iscoroutinefunction);
+  Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_item);
+  Py_VISIT(traverse_module_state->__pyx_n_s_iter);
+  Py_VISIT(traverse_module_state->__pyx_n_s_join);
+  Py_VISIT(traverse_module_state->__pyx_n_s_key);
+  Py_VISIT(traverse_module_state->__pyx_n_s_keys);
+  Py_VISIT(traverse_module_state->__pyx_n_s_last_observed_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_latent_event_arg);
+  Py_VISIT(traverse_module_state->__pyx_n_s_len);
+  Py_VISIT(traverse_module_state->__pyx_n_s_lk);
+  Py_VISIT(traverse_module_state->__pyx_n_s_local_connect_type);
+  Py_VISIT(traverse_module_state->__pyx_n_s_local_tcp);
+  Py_VISIT(traverse_module_state->__pyx_n_s_logging);
+  Py_VISIT(traverse_module_state->__pyx_n_s_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_low);
+  Py_VISIT(traverse_module_state->__pyx_n_s_lower);
+  Py_VISIT(traverse_module_state->__pyx_n_s_main);
+  Py_VISIT(traverse_module_state->__pyx_n_s_managed_target);
+  Py_VISIT(traverse_module_state->__pyx_n_s_max_concurrent_streams);
+  Py_VISIT(traverse_module_state->__pyx_n_s_max_receive_message_length);
+  Py_VISIT(traverse_module_state->__pyx_n_s_max_results);
+  Py_VISIT(traverse_module_state->__pyx_n_s_max_send_message_length);
+  Py_VISIT(traverse_module_state->__pyx_n_s_maximum_concurrent_rpcs);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_maximum_concurrent_rpcs_should_b);
+  Py_VISIT(traverse_module_state->__pyx_n_s_maxsize);
+  Py_VISIT(traverse_module_state->__pyx_n_s_maybe_save_server_trace_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_medium);
+  Py_VISIT(traverse_module_state->__pyx_n_s_members);
+  Py_VISIT(traverse_module_state->__pyx_n_s_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_metaclass);
+  Py_VISIT(traverse_module_state->__pyx_n_s_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_metadata_locals_genexpr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_metadata_plugin);
+  Py_VISIT(traverse_module_state->__pyx_n_s_metadata_sent_observer);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_metadata_was_invalid_s);
+  Py_VISIT(traverse_module_state->__pyx_n_s_method);
+  Py_VISIT(traverse_module_state->__pyx_n_s_method_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_module);
+  Py_VISIT(traverse_module_state->__pyx_n_s_mro_entries);
+  Py_VISIT(traverse_module_state->__pyx_n_s_name);
+  Py_VISIT(traverse_module_state->__pyx_n_s_name_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_namedtuple);
+  Py_VISIT(traverse_module_state->__pyx_n_s_new);
+  Py_VISIT(traverse_module_state->__pyx_n_s_new_event_loop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_next_call_event);
+  Py_VISIT(traverse_module_state->__pyx_n_s_next_call_event_locals_on_succes);
+  Py_VISIT(traverse_module_state->__pyx_n_s_next_event);
+  Py_VISIT(traverse_module_state->__pyx_n_s_next_event_locals_on_failure);
+  Py_VISIT(traverse_module_state->__pyx_n_s_next_event_locals_on_success);
+  Py_VISIT(traverse_module_state->__pyx_n_s_no_compress);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non);
+  Py_VISIT(traverse_module_state->__pyx_n_s_none);
+  Py_VISIT(traverse_module_state->__pyx_n_s_not_found);
+  Py_VISIT(traverse_module_state->__pyx_n_s_not_invoked);
+  Py_VISIT(traverse_module_state->__pyx_n_s_not_on_client);
+  Py_VISIT(traverse_module_state->__pyx_n_s_not_on_server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_notify_all);
+  Py_VISIT(traverse_module_state->__pyx_n_s_num_active_threads);
+  Py_VISIT(traverse_module_state->__pyx_n_s_object);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_object_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_observability);
+  Py_VISIT(traverse_module_state->__pyx_n_s_observability_enabled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_observability_plugin);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_of_RPC_that_terminated_with_sta);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_of_RPC_that_terminated_with_sta_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ok);
+  Py_VISIT(traverse_module_state->__pyx_n_s_on_failure);
+  Py_VISIT(traverse_module_state->__pyx_n_s_on_success);
+  Py_VISIT(traverse_module_state->__pyx_n_s_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_operate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_operation_complete);
+  Py_VISIT(traverse_module_state->__pyx_n_s_operations);
+  Py_VISIT(traverse_module_state->__pyx_n_s_operationses_and_tags);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ops);
+  Py_VISIT(traverse_module_state->__pyx_n_s_options);
+  Py_VISIT(traverse_module_state->__pyx_n_s_os);
+  Py_VISIT(traverse_module_state->__pyx_n_s_out_of_range);
+  Py_VISIT(traverse_module_state->__pyx_n_s_outbound_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_outbound_ops);
+  Py_VISIT(traverse_module_state->__pyx_n_s_partial);
+  Py_VISIT(traverse_module_state->__pyx_n_s_peer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_peer_identities);
+  Py_VISIT(traverse_module_state->__pyx_n_s_peer_identity_key);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pem_key_cert_pairs);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pem_root_certificates);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pem_root_certs);
+  Py_VISIT(traverse_module_state->__pyx_n_s_permission_denied);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pickle);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pkgutil);
+  Py_VISIT(traverse_module_state->__pyx_n_s_plugin);
+  Py_VISIT(traverse_module_state->__pyx_n_s_poll);
+  Py_VISIT(traverse_module_state->__pyx_n_s_poll_wrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_poller);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pool);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pop);
+  Py_VISIT(traverse_module_state->__pyx_n_s_postfork_state_to_reset);
+  Py_VISIT(traverse_module_state->__pyx_n_s_postfork_states_to_reset);
+  Py_VISIT(traverse_module_state->__pyx_n_s_prepare);
+  Py_VISIT(traverse_module_state->__pyx_n_s_primary_user_agent_string);
+  Py_VISIT(traverse_module_state->__pyx_n_s_print_exc);
+  Py_VISIT(traverse_module_state->__pyx_n_s_private_key);
+  Py_VISIT(traverse_module_state->__pyx_n_s_properties);
+  Py_VISIT(traverse_module_state->__pyx_n_s_property);
+  Py_VISIT(traverse_module_state->__pyx_n_s_put);
+  Py_VISIT(traverse_module_state->__pyx_n_s_py_auth_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_python_call_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_capi);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_AioServer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_CensusContext);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_ChannelCredential);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_InsecureChannelCr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle__Tag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable);
+  Py_VISIT(traverse_module_state->__pyx_n_s_qualname);
+  Py_VISIT(traverse_module_state->__pyx_n_s_query_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_query_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_query_handlers);
+  Py_VISIT(traverse_module_state->__pyx_n_s_queue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_queue_deadline);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_queue_must_be_live);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_queue_must_be_shutting_down_to_b);
+  Py_VISIT(traverse_module_state->__pyx_n_s_queue_shutdown);
+  Py_VISIT(traverse_module_state->__pyx_n_s_queue_timeout);
+  Py_VISIT(traverse_module_state->__pyx_n_s_raise_if_not_valid_trailing_meta);
+  Py_VISIT(traverse_module_state->__pyx_n_s_range);
+  Py_VISIT(traverse_module_state->__pyx_n_s_raw_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_read);
+  Py_VISIT(traverse_module_state->__pyx_n_s_read_socket);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ready);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_close_on_server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_initial_metadata_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_initial_metadata_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_message_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_message_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_serialized_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_status_on_client);
+  Py_VISIT(traverse_module_state->__pyx_n_s_receive_status_on_client_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_received_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_recv);
+  Py_VISIT(traverse_module_state->__pyx_n_s_reduce);
+  Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex);
+  Py_VISIT(traverse_module_state->__pyx_n_s_register);
+  Py_VISIT(traverse_module_state->__pyx_n_s_register_at_fork);
+  Py_VISIT(traverse_module_state->__pyx_n_s_register_completion_queue);
+  Py_VISIT(traverse_module_state->__pyx_n_s_registered_call_handle);
+  Py_VISIT(traverse_module_state->__pyx_n_s_remove_reader);
+  Py_VISIT(traverse_module_state->__pyx_n_s_repr);
+  Py_VISIT(traverse_module_state->__pyx_n_s_repr_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request_call_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request_call_tag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request_deserializer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request_iterator);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request_raw);
+  Py_VISIT(traverse_module_state->__pyx_n_s_request_streaming);
+  Py_VISIT(traverse_module_state->__pyx_n_s_reset_grpc_config_vars);
+  Py_VISIT(traverse_module_state->__pyx_n_s_reset_postfork_child);
+  Py_VISIT(traverse_module_state->__pyx_n_s_resource_exhausted);
+  Py_VISIT(traverse_module_state->__pyx_n_s_response);
+  Py_VISIT(traverse_module_state->__pyx_n_s_response_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_response_raw);
+  Py_VISIT(traverse_module_state->__pyx_n_s_response_serializer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_response_streaming);
+  Py_VISIT(traverse_module_state->__pyx_n_s_result);
+  Py_VISIT(traverse_module_state->__pyx_n_s_retain_self);
+  Py_VISIT(traverse_module_state->__pyx_n_s_return);
+  Py_VISIT(traverse_module_state->__pyx_n_s_return_from_user_request_generat);
+  Py_VISIT(traverse_module_state->__pyx_n_s_rpc_coro);
+  Py_VISIT(traverse_module_state->__pyx_n_s_rpc_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_rpc_task);
+  Py_VISIT(traverse_module_state->__pyx_n_s_run);
+  Py_VISIT(traverse_module_state->__pyx_n_s_run_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_run_coroutine_threadsafe);
+  Py_VISIT(traverse_module_state->__pyx_n_s_run_in_executor);
+  Py_VISIT(traverse_module_state->__pyx_n_s_run_interceptor);
+  Py_VISIT(traverse_module_state->__pyx_n_s_run_spawn_greenlets);
+  Py_VISIT(traverse_module_state->__pyx_n_s_run_with_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_run_with_context_locals__run);
+  Py_VISIT(traverse_module_state->__pyx_n_s_runtime_error);
+  Py_VISIT(traverse_module_state->__pyx_n_s_save_trace_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_schedule_coro_threadsafe);
+  Py_VISIT(traverse_module_state->__pyx_n_s_schedule_rpc_coro);
+  Py_VISIT(traverse_module_state->__pyx_n_s_secondary_user_agent_string);
+  Py_VISIT(traverse_module_state->__pyx_n_s_segregated_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_segregated_call_locals_on_succe);
+  Py_VISIT(traverse_module_state->__pyx_n_s_self);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_self__cq_cannot_be_converted_to);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_self_arg_cannot_be_converted_to);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_self_c_argument_cannot_be_conver);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_self_c_credentials_cannot_be_con);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_self_c_op_cannot_be_converted_to);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_close_from_client);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_close_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_error_status_from_server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_initial_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_initial_metadata_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_initial_metadata_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_message_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_message_op);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_receive_close);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_serialized_message);
+  Py_VISIT(traverse_module_state->__pyx_n_s_send_status_from_server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_call_tracer);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_certificate_config_ssl);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_credentials_alts);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_credentials_local);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_credentials_ssl);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_credentials_ssl_dynamic_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_main_loop);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_server_must_be_started_and_not_s);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_queue);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_server_queue_must_be_a_registere);
+  Py_VISIT(traverse_module_state->__pyx_n_s_server_started);
+  Py_VISIT(traverse_module_state->__pyx_n_s_service);
+  Py_VISIT(traverse_module_state->__pyx_n_s_service_accounts);
+  Py_VISIT(traverse_module_state->__pyx_n_s_servicer_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_serving_task_crash_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_setDaemon);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_async_callback_func);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_census_context_on_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_compression);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_details);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_exception);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_instrumentation_context_on_c);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_internal_error);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_name);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_result);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_server_call_tracer_factory);
+  Py_VISIT(traverse_module_state->__pyx_n_s_set_trailing_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_setblocking);
+  Py_VISIT(traverse_module_state->__pyx_n_s_setstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython);
+  Py_VISIT(traverse_module_state->__pyx_n_s_shield);
+  Py_VISIT(traverse_module_state->__pyx_n_s_shutdown);
+  Py_VISIT(traverse_module_state->__pyx_n_s_shutdown_await_next_greenlet);
+  Py_VISIT(traverse_module_state->__pyx_n_s_shutdown_cq);
+  Py_VISIT(traverse_module_state->__pyx_n_s_shutdown_grpc_aio);
+  Py_VISIT(traverse_module_state->__pyx_n_s_shutting_down_server);
+  Py_VISIT(traverse_module_state->__pyx_n_s_simplefilter);
+  Py_VISIT(traverse_module_state->__pyx_n_s_sleep);
+  Py_VISIT(traverse_module_state->__pyx_n_s_socket);
+  Py_VISIT(traverse_module_state->__pyx_n_s_socket_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_socketpair);
+  Py_VISIT(traverse_module_state->__pyx_n_s_span_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_spawn);
+  Py_VISIT(traverse_module_state->__pyx_n_s_spawn_callback_async);
+  Py_VISIT(traverse_module_state->__pyx_n_s_spawn_callback_in_thread);
+  Py_VISIT(traverse_module_state->__pyx_n_s_spawn_greenlets);
+  Py_VISIT(traverse_module_state->__pyx_n_s_spec);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_10);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_11);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_12);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_13);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_14);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_15);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_16);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_17);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_18);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_19);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_2);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_20);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_21);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_22);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_23);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_3);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_4);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_5);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_6);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_7);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_8);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_src_python_grpcio_grpc__cython_9);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ssl_session_cache);
+  Py_VISIT(traverse_module_state->__pyx_n_s_ssl_target_name_override);
+  Py_VISIT(traverse_module_state->__pyx_n_s_start);
+  Py_VISIT(traverse_module_state->__pyx_n_s_start_batch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_start_channel_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_start_client_batch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_start_server_batch);
+  Py_VISIT(traverse_module_state->__pyx_n_s_start_server_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_start_shutting_down);
+  Py_VISIT(traverse_module_state->__pyx_n_s_start_socket_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_started_tag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_started_tags);
+  Py_VISIT(traverse_module_state->__pyx_n_s_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_status);
+  Py_VISIT(traverse_module_state->__pyx_n_s_status_code);
+  Py_VISIT(traverse_module_state->__pyx_n_s_status_task);
+  Py_VISIT(traverse_module_state->__pyx_n_s_stored_ctx);
+  Py_VISIT(traverse_module_state->__pyx_n_s_str);
+  Py_VISIT(traverse_module_state->__pyx_n_s_str_2);
+  Py_VISIT(traverse_module_state->__pyx_n_s_stream_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_stream_stream);
+  Py_VISIT(traverse_module_state->__pyx_n_s_stream_unary);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource);
+  Py_VISIT(traverse_module_state->__pyx_n_s_subchannel_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_success);
+  Py_VISIT(traverse_module_state->__pyx_n_s_super);
+  Py_VISIT(traverse_module_state->__pyx_n_s_sync_servicer_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_sys);
+  Py_VISIT(traverse_module_state->__pyx_n_s_t);
+  Py_VISIT(traverse_module_state->__pyx_n_s_tag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_target);
+  Py_VISIT(traverse_module_state->__pyx_n_s_task);
+  Py_VISIT(traverse_module_state->__pyx_n_s_test);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_the_server_has_already_started);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_the_server_hasn_t_started_yet);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_the_server_must_be_shutting_down);
+  Py_VISIT(traverse_module_state->__pyx_n_s_thread);
+  Py_VISIT(traverse_module_state->__pyx_n_s_thread_pool);
+  Py_VISIT(traverse_module_state->__pyx_n_s_threading);
+  Py_VISIT(traverse_module_state->__pyx_n_s_threadpool);
+  Py_VISIT(traverse_module_state->__pyx_n_s_throw);
+  Py_VISIT(traverse_module_state->__pyx_n_s_time);
+  Py_VISIT(traverse_module_state->__pyx_n_s_time_remaining);
+  Py_VISIT(traverse_module_state->__pyx_n_s_timeout);
+  Py_VISIT(traverse_module_state->__pyx_n_s_timeout_secs);
+  Py_VISIT(traverse_module_state->__pyx_n_s_to_call);
+  Py_VISIT(traverse_module_state->__pyx_n_s_to_channel_arg);
+  Py_VISIT(traverse_module_state->__pyx_n_s_too_many_operations);
+  Py_VISIT(traverse_module_state->__pyx_n_s_trace_id);
+  Py_VISIT(traverse_module_state->__pyx_n_s_traceback);
+  Py_VISIT(traverse_module_state->__pyx_n_s_tracing_enabled);
+  Py_VISIT(traverse_module_state->__pyx_n_s_trailing_metadata);
+  Py_VISIT(traverse_module_state->__pyx_n_s_transient_failure);
+  Py_VISIT(traverse_module_state->__pyx_n_s_true);
+  Py_VISIT(traverse_module_state->__pyx_n_s_try_to_connect);
+  Py_VISIT(traverse_module_state->__pyx_n_s_type);
+  Py_VISIT(traverse_module_state->__pyx_n_s_typing);
+  Py_VISIT(traverse_module_state->__pyx_n_s_uds);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unary_handler);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unary_stream);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unary_unary);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unauthenticated);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unavailable);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unimplemented);
+  Py_VISIT(traverse_module_state->__pyx_n_s_uninstall_context);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unknown);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unused_future);
+  Py_VISIT(traverse_module_state->__pyx_n_s_unused_task);
+  Py_VISIT(traverse_module_state->__pyx_n_s_update);
+  Py_VISIT(traverse_module_state->__pyx_n_s_upper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_use_setstate);
+  Py_VISIT(traverse_module_state->__pyx_n_s_used_mask);
+  Py_VISIT(traverse_module_state->__pyx_n_s_user_tag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_utf8);
+  Py_VISIT(traverse_module_state->__pyx_kp_s_utf_8);
+  Py_VISIT(traverse_module_state->__pyx_n_s_value);
+  Py_VISIT(traverse_module_state->__pyx_n_s_values);
+  Py_VISIT(traverse_module_state->__pyx_n_s_wait);
+  Py_VISIT(traverse_module_state->__pyx_n_s_wait_for);
+  Py_VISIT(traverse_module_state->__pyx_n_s_wait_for_ready);
+  Py_VISIT(traverse_module_state->__pyx_n_s_wait_for_ready_explicitly_set);
+  Py_VISIT(traverse_module_state->__pyx_n_s_wait_for_termination);
+  Py_VISIT(traverse_module_state->__pyx_n_s_wait_time);
+  Py_VISIT(traverse_module_state->__pyx_n_s_warning);
+  Py_VISIT(traverse_module_state->__pyx_n_s_warnings);
+  Py_VISIT(traverse_module_state->__pyx_n_s_watch_connectivity_state);
+  Py_VISIT(traverse_module_state->__pyx_n_s_wrap);
+  Py_VISIT(traverse_module_state->__pyx_n_s_wrapper);
+  Py_VISIT(traverse_module_state->__pyx_n_s_write);
+  Py_VISIT(traverse_module_state->__pyx_n_s_write_flag);
+  Py_VISIT(traverse_module_state->__pyx_n_s_xds);
+  Py_VISIT(traverse_module_state->__pyx_n_s_xds_server_credentials);
+  Py_VISIT(traverse_module_state->__pyx_n_s_yes);
+  Py_VISIT(traverse_module_state->__pyx_n_s_yield_to_queue);
+  Py_VISIT(traverse_module_state->__pyx_float_1_0);
+  Py_VISIT(traverse_module_state->__pyx_int_0);
+  Py_VISIT(traverse_module_state->__pyx_int_1);
+  Py_VISIT(traverse_module_state->__pyx_int_5);
+  Py_VISIT(traverse_module_state->__pyx_int_118587260);
+  Py_VISIT(traverse_module_state->__pyx_int_171381981);
+  Py_VISIT(traverse_module_state->__pyx_int_171651213);
+  Py_VISIT(traverse_module_state->__pyx_int_222419149);
+  Py_VISIT(traverse_module_state->__pyx_int_228825662);
+  Py_VISIT(traverse_module_state->__pyx_int_238750788);
+  Py_VISIT(traverse_module_state->__pyx_k__76);
+  Py_VISIT(traverse_module_state->__pyx_k__80);
+  Py_VISIT(traverse_module_state->__pyx_tuple_);
+  Py_VISIT(traverse_module_state->__pyx_tuple__4);
+  Py_VISIT(traverse_module_state->__pyx_tuple__8);
+  Py_VISIT(traverse_module_state->__pyx_slice__37);
+  Py_VISIT(traverse_module_state->__pyx_tuple__10);
+  Py_VISIT(traverse_module_state->__pyx_tuple__11);
+  Py_VISIT(traverse_module_state->__pyx_tuple__12);
+  Py_VISIT(traverse_module_state->__pyx_tuple__14);
+  Py_VISIT(traverse_module_state->__pyx_tuple__17);
+  Py_VISIT(traverse_module_state->__pyx_tuple__19);
+  Py_VISIT(traverse_module_state->__pyx_tuple__21);
+  Py_VISIT(traverse_module_state->__pyx_tuple__23);
+  Py_VISIT(traverse_module_state->__pyx_tuple__24);
+  Py_VISIT(traverse_module_state->__pyx_tuple__25);
+  Py_VISIT(traverse_module_state->__pyx_tuple__26);
+  Py_VISIT(traverse_module_state->__pyx_tuple__27);
+  Py_VISIT(traverse_module_state->__pyx_tuple__28);
+  Py_VISIT(traverse_module_state->__pyx_tuple__29);
+  Py_VISIT(traverse_module_state->__pyx_tuple__30);
+  Py_VISIT(traverse_module_state->__pyx_tuple__31);
+  Py_VISIT(traverse_module_state->__pyx_tuple__32);
+  Py_VISIT(traverse_module_state->__pyx_tuple__33);
+  Py_VISIT(traverse_module_state->__pyx_tuple__34);
+  Py_VISIT(traverse_module_state->__pyx_tuple__35);
+  Py_VISIT(traverse_module_state->__pyx_tuple__36);
+  Py_VISIT(traverse_module_state->__pyx_tuple__39);
+  Py_VISIT(traverse_module_state->__pyx_tuple__40);
+  Py_VISIT(traverse_module_state->__pyx_tuple__46);
+  Py_VISIT(traverse_module_state->__pyx_tuple__48);
+  Py_VISIT(traverse_module_state->__pyx_tuple__50);
+  Py_VISIT(traverse_module_state->__pyx_tuple__79);
+  Py_VISIT(traverse_module_state->__pyx_tuple__83);
+  Py_VISIT(traverse_module_state->__pyx_tuple__93);
+  Py_VISIT(traverse_module_state->__pyx_tuple__98);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__2);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__3);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__5);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__6);
+  Py_VISIT(traverse_module_state->__pyx_tuple__105);
+  Py_VISIT(traverse_module_state->__pyx_tuple__106);
+  Py_VISIT(traverse_module_state->__pyx_tuple__108);
+  Py_VISIT(traverse_module_state->__pyx_tuple__110);
+  Py_VISIT(traverse_module_state->__pyx_tuple__116);
+  Py_VISIT(traverse_module_state->__pyx_tuple__118);
+  Py_VISIT(traverse_module_state->__pyx_tuple__121);
+  Py_VISIT(traverse_module_state->__pyx_tuple__123);
+  Py_VISIT(traverse_module_state->__pyx_tuple__125);
+  Py_VISIT(traverse_module_state->__pyx_tuple__127);
+  Py_VISIT(traverse_module_state->__pyx_tuple__138);
+  Py_VISIT(traverse_module_state->__pyx_tuple__144);
+  Py_VISIT(traverse_module_state->__pyx_tuple__148);
+  Py_VISIT(traverse_module_state->__pyx_tuple__150);
+  Py_VISIT(traverse_module_state->__pyx_tuple__152);
+  Py_VISIT(traverse_module_state->__pyx_tuple__153);
+  Py_VISIT(traverse_module_state->__pyx_tuple__156);
+  Py_VISIT(traverse_module_state->__pyx_tuple__158);
+  Py_VISIT(traverse_module_state->__pyx_tuple__162);
+  Py_VISIT(traverse_module_state->__pyx_tuple__166);
+  Py_VISIT(traverse_module_state->__pyx_tuple__168);
+  Py_VISIT(traverse_module_state->__pyx_tuple__170);
+  Py_VISIT(traverse_module_state->__pyx_tuple__172);
+  Py_VISIT(traverse_module_state->__pyx_tuple__174);
+  Py_VISIT(traverse_module_state->__pyx_tuple__176);
+  Py_VISIT(traverse_module_state->__pyx_tuple__178);
+  Py_VISIT(traverse_module_state->__pyx_tuple__180);
+  Py_VISIT(traverse_module_state->__pyx_tuple__182);
+  Py_VISIT(traverse_module_state->__pyx_tuple__184);
+  Py_VISIT(traverse_module_state->__pyx_tuple__186);
+  Py_VISIT(traverse_module_state->__pyx_tuple__194);
+  Py_VISIT(traverse_module_state->__pyx_tuple__209);
+  Py_VISIT(traverse_module_state->__pyx_tuple__211);
+  Py_VISIT(traverse_module_state->__pyx_tuple__213);
+  Py_VISIT(traverse_module_state->__pyx_tuple__217);
+  Py_VISIT(traverse_module_state->__pyx_tuple__222);
+  Py_VISIT(traverse_module_state->__pyx_tuple__224);
+  Py_VISIT(traverse_module_state->__pyx_tuple__226);
+  Py_VISIT(traverse_module_state->__pyx_tuple__230);
+  Py_VISIT(traverse_module_state->__pyx_tuple__232);
+  Py_VISIT(traverse_module_state->__pyx_tuple__236);
+  Py_VISIT(traverse_module_state->__pyx_tuple__238);
+  Py_VISIT(traverse_module_state->__pyx_tuple__241);
+  Py_VISIT(traverse_module_state->__pyx_tuple__254);
+  Py_VISIT(traverse_module_state->__pyx_tuple__255);
+  Py_VISIT(traverse_module_state->__pyx_tuple__293);
+  Py_VISIT(traverse_module_state->__pyx_tuple__296);
+  Py_VISIT(traverse_module_state->__pyx_tuple__301);
+  Py_VISIT(traverse_module_state->__pyx_tuple__304);
+  Py_VISIT(traverse_module_state->__pyx_tuple__306);
+  Py_VISIT(traverse_module_state->__pyx_tuple__308);
+  Py_VISIT(traverse_module_state->__pyx_tuple__310);
+  Py_VISIT(traverse_module_state->__pyx_tuple__312);
+  Py_VISIT(traverse_module_state->__pyx_tuple__314);
+  Py_VISIT(traverse_module_state->__pyx_tuple__316);
+  Py_VISIT(traverse_module_state->__pyx_tuple__317);
+  Py_VISIT(traverse_module_state->__pyx_tuple__319);
+  Py_VISIT(traverse_module_state->__pyx_tuple__335);
+  Py_VISIT(traverse_module_state->__pyx_tuple__342);
+  Py_VISIT(traverse_module_state->__pyx_tuple__346);
+  Py_VISIT(traverse_module_state->__pyx_tuple__349);
+  Py_VISIT(traverse_module_state->__pyx_tuple__353);
+  Py_VISIT(traverse_module_state->__pyx_tuple__356);
+  Py_VISIT(traverse_module_state->__pyx_tuple__358);
+  Py_VISIT(traverse_module_state->__pyx_tuple__360);
+  Py_VISIT(traverse_module_state->__pyx_tuple__362);
+  Py_VISIT(traverse_module_state->__pyx_tuple__364);
+  Py_VISIT(traverse_module_state->__pyx_tuple__366);
+  Py_VISIT(traverse_module_state->__pyx_tuple__368);
+  Py_VISIT(traverse_module_state->__pyx_tuple__370);
+  Py_VISIT(traverse_module_state->__pyx_tuple__371);
+  Py_VISIT(traverse_module_state->__pyx_tuple__372);
+  Py_VISIT(traverse_module_state->__pyx_tuple__374);
+  Py_VISIT(traverse_module_state->__pyx_tuple__375);
+  Py_VISIT(traverse_module_state->__pyx_tuple__379);
+  Py_VISIT(traverse_module_state->__pyx_tuple__385);
+  Py_VISIT(traverse_module_state->__pyx_tuple__388);
+  Py_VISIT(traverse_module_state->__pyx_tuple__389);
+  Py_VISIT(traverse_module_state->__pyx_tuple__393);
+  Py_VISIT(traverse_module_state->__pyx_tuple__395);
+  Py_VISIT(traverse_module_state->__pyx_tuple__396);
+  Py_VISIT(traverse_module_state->__pyx_tuple__403);
+  Py_VISIT(traverse_module_state->__pyx_tuple__405);
+  Py_VISIT(traverse_module_state->__pyx_tuple__406);
+  Py_VISIT(traverse_module_state->__pyx_tuple__409);
+  Py_VISIT(traverse_module_state->__pyx_tuple__417);
+  Py_VISIT(traverse_module_state->__pyx_tuple__424);
+  Py_VISIT(traverse_module_state->__pyx_tuple__427);
+  Py_VISIT(traverse_module_state->__pyx_tuple__435);
+  Py_VISIT(traverse_module_state->__pyx_tuple__436);
+  Py_VISIT(traverse_module_state->__pyx_tuple__437);
+  Py_VISIT(traverse_module_state->__pyx_tuple__438);
+  Py_VISIT(traverse_module_state->__pyx_tuple__439);
+  Py_VISIT(traverse_module_state->__pyx_tuple__440);
+  Py_VISIT(traverse_module_state->__pyx_tuple__441);
+  Py_VISIT(traverse_module_state->__pyx_tuple__444);
+  Py_VISIT(traverse_module_state->__pyx_tuple__448);
+  Py_VISIT(traverse_module_state->__pyx_tuple__450);
+  Py_VISIT(traverse_module_state->__pyx_tuple__453);
+  Py_VISIT(traverse_module_state->__pyx_tuple__457);
+  Py_VISIT(traverse_module_state->__pyx_tuple__460);
+  Py_VISIT(traverse_module_state->__pyx_tuple__462);
+  Py_VISIT(traverse_module_state->__pyx_tuple__463);
+  Py_VISIT(traverse_module_state->__pyx_tuple__464);
+  Py_VISIT(traverse_module_state->__pyx_tuple__465);
+  Py_VISIT(traverse_module_state->__pyx_tuple__466);
+  Py_VISIT(traverse_module_state->__pyx_tuple__467);
+  Py_VISIT(traverse_module_state->__pyx_tuple__468);
+  Py_VISIT(traverse_module_state->__pyx_tuple__472);
+  Py_VISIT(traverse_module_state->__pyx_tuple__476);
+  Py_VISIT(traverse_module_state->__pyx_tuple__484);
+  Py_VISIT(traverse_module_state->__pyx_tuple__485);
+  Py_VISIT(traverse_module_state->__pyx_tuple__486);
+  Py_VISIT(traverse_module_state->__pyx_tuple__487);
+  Py_VISIT(traverse_module_state->__pyx_tuple__491);
+  Py_VISIT(traverse_module_state->__pyx_tuple__494);
+  Py_VISIT(traverse_module_state->__pyx_tuple__497);
+  Py_VISIT(traverse_module_state->__pyx_tuple__500);
+  Py_VISIT(traverse_module_state->__pyx_tuple__502);
+  Py_VISIT(traverse_module_state->__pyx_tuple__504);
+  Py_VISIT(traverse_module_state->__pyx_tuple__506);
+  Py_VISIT(traverse_module_state->__pyx_tuple__509);
+  Py_VISIT(traverse_module_state->__pyx_tuple__515);
+  Py_VISIT(traverse_module_state->__pyx_tuple__517);
+  Py_VISIT(traverse_module_state->__pyx_tuple__533);
+  Py_VISIT(traverse_module_state->__pyx_tuple__534);
+  Py_VISIT(traverse_module_state->__pyx_tuple__536);
+  Py_VISIT(traverse_module_state->__pyx_tuple__537);
+  Py_VISIT(traverse_module_state->__pyx_tuple__538);
+  Py_VISIT(traverse_module_state->__pyx_tuple__539);
+  Py_VISIT(traverse_module_state->__pyx_tuple__542);
+  Py_VISIT(traverse_module_state->__pyx_tuple__543);
+  Py_VISIT(traverse_module_state->__pyx_tuple__544);
+  Py_VISIT(traverse_module_state->__pyx_tuple__545);
+  Py_VISIT(traverse_module_state->__pyx_tuple__546);
+  Py_VISIT(traverse_module_state->__pyx_tuple__548);
+  Py_VISIT(traverse_module_state->__pyx_tuple__550);
+  Py_VISIT(traverse_module_state->__pyx_tuple__554);
+  Py_VISIT(traverse_module_state->__pyx_tuple__556);
+  Py_VISIT(traverse_module_state->__pyx_tuple__558);
+  Py_VISIT(traverse_module_state->__pyx_tuple__560);
+  Py_VISIT(traverse_module_state->__pyx_tuple__561);
+  Py_VISIT(traverse_module_state->__pyx_tuple__562);
+  Py_VISIT(traverse_module_state->__pyx_tuple__564);
+  Py_VISIT(traverse_module_state->__pyx_tuple__565);
+  Py_VISIT(traverse_module_state->__pyx_tuple__566);
+  Py_VISIT(traverse_module_state->__pyx_tuple__570);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__13);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__15);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__16);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__18);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__20);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__22);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__41);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__42);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__43);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__44);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__45);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__47);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__51);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__52);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__53);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__54);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__55);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__56);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__59);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__60);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__61);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__62);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__63);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__64);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__65);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__66);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__67);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__68);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__72);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__73);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__74);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__75);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__77);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__78);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__81);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__82);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__84);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__85);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__86);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__87);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__88);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__89);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__90);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__91);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__92);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__94);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__95);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__96);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__97);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__99);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__100);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__101);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__102);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__103);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__104);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__109);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__111);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__112);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__113);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__114);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__115);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__117);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__119);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__120);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__122);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__124);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__126);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__128);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__129);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__130);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__131);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__132);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__133);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__134);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__135);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__136);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__137);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__139);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__140);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__141);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__142);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__143);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__145);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__146);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__147);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__149);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__151);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__154);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__155);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__157);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__159);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__160);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__161);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__163);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__164);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__165);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__167);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__169);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__171);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__173);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__175);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__177);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__179);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__181);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__183);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__185);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__187);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__188);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__189);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__190);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__191);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__192);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__193);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__195);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__196);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__197);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__198);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__199);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__200);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__201);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__202);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__203);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__204);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__205);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__206);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__207);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__208);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__210);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__212);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__214);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__215);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__216);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__218);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__219);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__220);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__221);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__223);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__225);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__227);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__228);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__229);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__231);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__233);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__234);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__235);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__237);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__239);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__240);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__242);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__243);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__244);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__245);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__246);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__247);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__248);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__249);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__250);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__251);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__252);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__253);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__256);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__257);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__258);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__259);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__260);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__261);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__262);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__263);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__264);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__265);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__266);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__267);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__268);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__269);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__270);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__271);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__272);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__273);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__274);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__275);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__276);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__277);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__278);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__279);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__280);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__281);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__282);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__283);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__284);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__285);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__286);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__287);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__288);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__289);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__290);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__291);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__292);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__294);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__295);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__297);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__298);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__299);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__300);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__302);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__303);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__305);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__307);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__309);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__311);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__313);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__315);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__318);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__320);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__321);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__322);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__323);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__324);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__325);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__326);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__327);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__328);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__329);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__330);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__331);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__332);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__333);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__334);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__336);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__337);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__338);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__339);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__340);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__341);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__343);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__344);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__345);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__347);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__348);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__350);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__351);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__352);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__354);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__355);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__357);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__359);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__361);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__363);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__365);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__367);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__369);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__373);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__376);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__377);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__378);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__380);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__381);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__382);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__383);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__384);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__386);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__387);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__390);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__391);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__392);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__394);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__397);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__398);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__399);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__400);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__401);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__402);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__404);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__407);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__408);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__410);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__411);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__412);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__413);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__414);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__415);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__416);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__418);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__419);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__420);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__421);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__422);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__423);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__425);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__426);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__428);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__429);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__430);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__431);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__432);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__433);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__434);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__442);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__443);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__445);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__446);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__447);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__449);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__451);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__452);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__454);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__455);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__456);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__458);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__459);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__461);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__469);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__470);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__471);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__473);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__474);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__475);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__477);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__478);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__479);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__480);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__481);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__482);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__483);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__488);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__489);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__490);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__492);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__493);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__495);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__496);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__498);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__499);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__501);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__503);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__505);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__507);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__508);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__510);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__511);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__512);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__513);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__514);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__516);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__518);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__519);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__520);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__521);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__522);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__523);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__524);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__525);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__526);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__527);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__528);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__529);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__530);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__531);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__532);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__535);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__540);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__541);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__547);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__549);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__551);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__552);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__553);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__555);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__557);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__559);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__563);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__567);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__568);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__569);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__571);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__572);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__573);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__574);
+  Py_VISIT(traverse_module_state->__pyx_codeobj__575);
+  return 0;
+}
+#endif
+/* #### Code section: module_state_defines ### */
+#define __pyx_d __pyx_mstate_global->__pyx_d
+#define __pyx_b __pyx_mstate_global->__pyx_b
+#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime
+#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple
+#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes
+#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode
+#ifdef __Pyx_CyFunction_USED
+#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType
+#endif
+#ifdef __Pyx_FusedFunction_USED
+#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType
+#endif
+#ifdef __Pyx_Generator_USED
+#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType
+#endif
+#ifdef __Pyx_IterableCoroutine_USED
+#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType
+#endif
+#ifdef __Pyx_Coroutine_USED
+#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType
+#endif
+#ifdef __Pyx_Coroutine_USED
+#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#define __pyx_ptype_7cpython_4bool_bool __pyx_mstate_global->__pyx_ptype_7cpython_4bool_bool
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#define __pyx_ptype_7cpython_7complex_complex __pyx_mstate_global->__pyx_ptype_7cpython_7complex_complex
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#endif
+#if CYTHON_USE_MODULE_STATE
+#define __pyx_type_7_cython_6cygrpc__ChannelArg __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__ChannelArg
+#define __pyx_type_7_cython_6cygrpc__ChannelArgs __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__ChannelArgs
+#define __pyx_type_7_cython_6cygrpc_Call __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_Call
+#define __pyx_type_7_cython_6cygrpc__CallState __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__CallState
+#define __pyx_type_7_cython_6cygrpc__ChannelState __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__ChannelState
+#define __pyx_type_7_cython_6cygrpc_IntegratedCall __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_IntegratedCall
+#define __pyx_type_7_cython_6cygrpc_SegregatedCall __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_SegregatedCall
+#define __pyx_type_7_cython_6cygrpc_Channel __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_Channel
+#define __pyx_type_7_cython_6cygrpc_CallHandle __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CallHandle
+#define __pyx_type_7_cython_6cygrpc_CallCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CallCredentials
+#define __pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials
+#define __pyx_type_7_cython_6cygrpc_CompositeCallCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CompositeCallCredentials
+#define __pyx_type_7_cython_6cygrpc_ChannelCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ChannelCredentials
+#define __pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU
+#define __pyx_type_7_cython_6cygrpc_SSLChannelCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_SSLChannelCredentials
+#define __pyx_type_7_cython_6cygrpc_CompositeChannelCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CompositeChannelCredentials
+#define __pyx_type_7_cython_6cygrpc_XDSChannelCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_XDSChannelCredentials
+#define __pyx_type_7_cython_6cygrpc_ServerCertificateConfig __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ServerCertificateConfig
+#define __pyx_type_7_cython_6cygrpc_ServerCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ServerCredentials
+#define __pyx_type_7_cython_6cygrpc_LocalChannelCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_LocalChannelCredentials
+#define __pyx_type_7_cython_6cygrpc_ALTSChannelCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ALTSChannelCredentials
+#define __pyx_type_7_cython_6cygrpc__LatentEventArg __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__LatentEventArg
+#define __pyx_type_7_cython_6cygrpc_CompletionQueue __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CompletionQueue
+#define __pyx_type_7_cython_6cygrpc_BaseEvent __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_BaseEvent
+#define __pyx_type_7_cython_6cygrpc_ConnectivityEvent __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ConnectivityEvent
+#define __pyx_type_7_cython_6cygrpc_RequestCallEvent __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_RequestCallEvent
+#define __pyx_type_7_cython_6cygrpc_BatchOperationEvent __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_BatchOperationEvent
+#define __pyx_type_7_cython_6cygrpc_ServerShutdownEvent __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ServerShutdownEvent
+#define __pyx_type_7_cython_6cygrpc_Operation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_Operation
+#define __pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation
+#define __pyx_type_7_cython_6cygrpc_SendMessageOperation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_SendMessageOperation
+#define __pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation
+#define __pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation
+#define __pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation
+#define __pyx_type_7_cython_6cygrpc_ReceiveMessageOperation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ReceiveMessageOperation
+#define __pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation
+#define __pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation
+#define __pyx_type_7_cython_6cygrpc_CallDetails __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CallDetails
+#define __pyx_type_7_cython_6cygrpc_SslPemKeyCertPair __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_SslPemKeyCertPair
+#define __pyx_type_7_cython_6cygrpc_CompressionOptions __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CompressionOptions
+#define __pyx_type_7_cython_6cygrpc_Server __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_Server
+#define __pyx_type_7_cython_6cygrpc__Tag __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__Tag
+#define __pyx_type_7_cython_6cygrpc__ConnectivityTag __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__ConnectivityTag
+#define __pyx_type_7_cython_6cygrpc__RequestCallTag __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__RequestCallTag
+#define __pyx_type_7_cython_6cygrpc__BatchOperationTag __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__BatchOperationTag
+#define __pyx_type_7_cython_6cygrpc__ServerShutdownTag __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__ServerShutdownTag
+#define __pyx_type_7_cython_6cygrpc_BaseCompletionQueue __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_BaseCompletionQueue
+#define __pyx_type_7_cython_6cygrpc__BoundEventLoop __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__BoundEventLoop
+#define __pyx_type_7_cython_6cygrpc_PollerCompletionQueue __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_PollerCompletionQueue
+#define __pyx_type_7_cython_6cygrpc_AioRpcStatus __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_AioRpcStatus
+#define __pyx_type_7_cython_6cygrpc__AioState __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__AioState
+#define __pyx_type_7_cython_6cygrpc_CallbackFailureHandler __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CallbackFailureHandler
+#define __pyx_type_7_cython_6cygrpc_CallbackWrapper __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CallbackWrapper
+#define __pyx_type_7_cython_6cygrpc_GrpcCallWrapper __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_GrpcCallWrapper
+#define __pyx_type_7_cython_6cygrpc__AioCall __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__AioCall
+#define __pyx_type_7_cython_6cygrpc_AioChannel __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_AioChannel
+#define __pyx_type_7_cython_6cygrpc__HandlerCallDetails __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__HandlerCallDetails
+#define __pyx_type_7_cython_6cygrpc_RPCState __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_RPCState
+#define __pyx_type_7_cython_6cygrpc__ServicerContext __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__ServicerContext
+#define __pyx_type_7_cython_6cygrpc__SyncServicerContext __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__SyncServicerContext
+#define __pyx_type_7_cython_6cygrpc__MessageReceiver __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__MessageReceiver
+#define __pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter
+#define __pyx_type_7_cython_6cygrpc_AioServer __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_AioServer
+#define __pyx_type_7_cython_6cygrpc__GrpcArgWrapper __pyx_mstate_global->__pyx_type_7_cython_6cygrpc__GrpcArgWrapper
+#define __pyx_type_7_cython_6cygrpc_InsecureChannelCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_InsecureChannelCredentials
+#define __pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials
+#define __pyx_type_7_cython_6cygrpc_CensusContext __pyx_mstate_global->__pyx_type_7_cython_6cygrpc_CensusContext
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init__ __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init__
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext__ __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext__
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown
+#define __pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination __pyx_mstate_global->__pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination
+#define __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg __pyx_mstate_global->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg
+#define __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ __pyx_mstate_global->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_
+#define __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args __pyx_mstate_global->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args
+#define __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ __pyx_mstate_global->__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_
+#endif
+#define __pyx_ptype_7_cython_6cygrpc__ChannelArg __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__ChannelArg
+#define __pyx_ptype_7_cython_6cygrpc__ChannelArgs __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__ChannelArgs
+#define __pyx_ptype_7_cython_6cygrpc_Call __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_Call
+#define __pyx_ptype_7_cython_6cygrpc__CallState __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__CallState
+#define __pyx_ptype_7_cython_6cygrpc__ChannelState __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__ChannelState
+#define __pyx_ptype_7_cython_6cygrpc_IntegratedCall __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_IntegratedCall
+#define __pyx_ptype_7_cython_6cygrpc_SegregatedCall __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_SegregatedCall
+#define __pyx_ptype_7_cython_6cygrpc_Channel __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_Channel
+#define __pyx_ptype_7_cython_6cygrpc_CallHandle __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CallHandle
+#define __pyx_ptype_7_cython_6cygrpc_CallCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CallCredentials
+#define __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials
+#define __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials
+#define __pyx_ptype_7_cython_6cygrpc_ChannelCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ChannelCredentials
+#define __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU
+#define __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials
+#define __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials
+#define __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials
+#define __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig
+#define __pyx_ptype_7_cython_6cygrpc_ServerCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ServerCredentials
+#define __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials
+#define __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials
+#define __pyx_ptype_7_cython_6cygrpc__LatentEventArg __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__LatentEventArg
+#define __pyx_ptype_7_cython_6cygrpc_CompletionQueue __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CompletionQueue
+#define __pyx_ptype_7_cython_6cygrpc_BaseEvent __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_BaseEvent
+#define __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent
+#define __pyx_ptype_7_cython_6cygrpc_RequestCallEvent __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_RequestCallEvent
+#define __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent
+#define __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent
+#define __pyx_ptype_7_cython_6cygrpc_Operation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_Operation
+#define __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation
+#define __pyx_ptype_7_cython_6cygrpc_SendMessageOperation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_SendMessageOperation
+#define __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation
+#define __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation
+#define __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation
+#define __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation
+#define __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation
+#define __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation
+#define __pyx_ptype_7_cython_6cygrpc_CallDetails __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CallDetails
+#define __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair
+#define __pyx_ptype_7_cython_6cygrpc_CompressionOptions __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CompressionOptions
+#define __pyx_ptype_7_cython_6cygrpc_Server __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_Server
+#define __pyx_ptype_7_cython_6cygrpc__Tag __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__Tag
+#define __pyx_ptype_7_cython_6cygrpc__ConnectivityTag __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__ConnectivityTag
+#define __pyx_ptype_7_cython_6cygrpc__RequestCallTag __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__RequestCallTag
+#define __pyx_ptype_7_cython_6cygrpc__BatchOperationTag __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__BatchOperationTag
+#define __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag
+#define __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue
+#define __pyx_ptype_7_cython_6cygrpc__BoundEventLoop __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__BoundEventLoop
+#define __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue
+#define __pyx_ptype_7_cython_6cygrpc_AioRpcStatus __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_AioRpcStatus
+#define __pyx_ptype_7_cython_6cygrpc__AioState __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__AioState
+#define __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler
+#define __pyx_ptype_7_cython_6cygrpc_CallbackWrapper __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CallbackWrapper
+#define __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper
+#define __pyx_ptype_7_cython_6cygrpc__AioCall __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__AioCall
+#define __pyx_ptype_7_cython_6cygrpc_AioChannel __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_AioChannel
+#define __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__HandlerCallDetails
+#define __pyx_ptype_7_cython_6cygrpc_RPCState __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_RPCState
+#define __pyx_ptype_7_cython_6cygrpc__ServicerContext __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__ServicerContext
+#define __pyx_ptype_7_cython_6cygrpc__SyncServicerContext __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__SyncServicerContext
+#define __pyx_ptype_7_cython_6cygrpc__MessageReceiver __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__MessageReceiver
+#define __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter
+#define __pyx_ptype_7_cython_6cygrpc_AioServer __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_AioServer
+#define __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper
+#define __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials
+#define __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials
+#define __pyx_ptype_7_cython_6cygrpc_CensusContext __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc_CensusContext
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__ __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__ __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown
+#define __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination __pyx_mstate_global->__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination
+#define __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg __pyx_mstate_global->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg
+#define __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ __pyx_mstate_global->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_
+#define __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args __pyx_mstate_global->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args
+#define __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ __pyx_mstate_global->__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_
+#define __pyx_kp_s_0 __pyx_mstate_global->__pyx_kp_s_0
+#define __pyx_kp_s_1 __pyx_mstate_global->__pyx_kp_s_1
+#define __pyx_n_s_ALTSChannelCredentials __pyx_mstate_global->__pyx_n_s_ALTSChannelCredentials
+#define __pyx_n_s_ALTSChannelCredentials___reduce __pyx_mstate_global->__pyx_n_s_ALTSChannelCredentials___reduce
+#define __pyx_n_s_ALTSChannelCredentials___setstat __pyx_mstate_global->__pyx_n_s_ALTSChannelCredentials___setstat
+#define __pyx_n_s_AWAIT_THREADS_TIMEOUT_SECONDS __pyx_mstate_global->__pyx_n_s_AWAIT_THREADS_TIMEOUT_SECONDS
+#define __pyx_n_s_AbortError __pyx_mstate_global->__pyx_n_s_AbortError
+#define __pyx_kp_s_Abort_already_called __pyx_mstate_global->__pyx_kp_s_Abort_already_called
+#define __pyx_kp_s_Abort_error_has_been_replaced __pyx_mstate_global->__pyx_kp_s_Abort_error_has_been_replaced
+#define __pyx_kp_s_Abort_error_unexpectedly_suppres __pyx_mstate_global->__pyx_kp_s_Abort_error_unexpectedly_suppres
+#define __pyx_kp_s_Aborting_method_s_due_to_server __pyx_mstate_global->__pyx_kp_s_Aborting_method_s_due_to_server
+#define __pyx_n_s_ActiveThreadCount __pyx_mstate_global->__pyx_n_s_ActiveThreadCount
+#define __pyx_n_s_ActiveThreadCount___init __pyx_mstate_global->__pyx_n_s_ActiveThreadCount___init
+#define __pyx_n_s_ActiveThreadCount_await_zero_th __pyx_mstate_global->__pyx_n_s_ActiveThreadCount_await_zero_th
+#define __pyx_n_s_ActiveThreadCount_decrement __pyx_mstate_global->__pyx_n_s_ActiveThreadCount_decrement
+#define __pyx_n_s_ActiveThreadCount_increment __pyx_mstate_global->__pyx_n_s_ActiveThreadCount_increment
+#define __pyx_n_s_AioCall __pyx_mstate_global->__pyx_n_s_AioCall
+#define __pyx_n_s_AioCall___reduce_cython __pyx_mstate_global->__pyx_n_s_AioCall___reduce_cython
+#define __pyx_n_s_AioCall___setstate_cython __pyx_mstate_global->__pyx_n_s_AioCall___setstate_cython
+#define __pyx_n_s_AioCall__handle_status_once_rec __pyx_mstate_global->__pyx_n_s_AioCall__handle_status_once_rec
+#define __pyx_n_s_AioCall__repr __pyx_mstate_global->__pyx_n_s_AioCall__repr
+#define __pyx_n_s_AioCall_add_done_callback __pyx_mstate_global->__pyx_n_s_AioCall_add_done_callback
+#define __pyx_n_s_AioCall_cancel __pyx_mstate_global->__pyx_n_s_AioCall_cancel
+#define __pyx_n_s_AioCall_cancelled __pyx_mstate_global->__pyx_n_s_AioCall_cancelled
+#define __pyx_n_s_AioCall_done __pyx_mstate_global->__pyx_n_s_AioCall_done
+#define __pyx_n_s_AioCall_initial_metadata __pyx_mstate_global->__pyx_n_s_AioCall_initial_metadata
+#define __pyx_n_s_AioCall_initiate_stream_stream __pyx_mstate_global->__pyx_n_s_AioCall_initiate_stream_stream
+#define __pyx_n_s_AioCall_initiate_unary_stream __pyx_mstate_global->__pyx_n_s_AioCall_initiate_unary_stream
+#define __pyx_n_s_AioCall_is_locally_cancelled __pyx_mstate_global->__pyx_n_s_AioCall_is_locally_cancelled
+#define __pyx_n_s_AioCall_is_ok __pyx_mstate_global->__pyx_n_s_AioCall_is_ok
+#define __pyx_n_s_AioCall_receive_serialized_mess __pyx_mstate_global->__pyx_n_s_AioCall_receive_serialized_mess
+#define __pyx_n_s_AioCall_send_receive_close __pyx_mstate_global->__pyx_n_s_AioCall_send_receive_close
+#define __pyx_n_s_AioCall_send_serialized_message __pyx_mstate_global->__pyx_n_s_AioCall_send_serialized_message
+#define __pyx_n_s_AioCall_set_internal_error __pyx_mstate_global->__pyx_n_s_AioCall_set_internal_error
+#define __pyx_n_s_AioCall_status __pyx_mstate_global->__pyx_n_s_AioCall_status
+#define __pyx_n_s_AioCall_stream_unary __pyx_mstate_global->__pyx_n_s_AioCall_stream_unary
+#define __pyx_n_s_AioCall_time_remaining __pyx_mstate_global->__pyx_n_s_AioCall_time_remaining
+#define __pyx_n_s_AioCall_unary_unary __pyx_mstate_global->__pyx_n_s_AioCall_unary_unary
+#define __pyx_n_s_AioChannel __pyx_mstate_global->__pyx_n_s_AioChannel
+#define __pyx_n_s_AioChannel___reduce_cython __pyx_mstate_global->__pyx_n_s_AioChannel___reduce_cython
+#define __pyx_n_s_AioChannel___setstate_cython __pyx_mstate_global->__pyx_n_s_AioChannel___setstate_cython
+#define __pyx_n_s_AioChannel_call __pyx_mstate_global->__pyx_n_s_AioChannel_call
+#define __pyx_n_s_AioChannel_check_connectivity_st __pyx_mstate_global->__pyx_n_s_AioChannel_check_connectivity_st
+#define __pyx_n_s_AioChannel_close __pyx_mstate_global->__pyx_n_s_AioChannel_close
+#define __pyx_n_s_AioChannel_closed __pyx_mstate_global->__pyx_n_s_AioChannel_closed
+#define __pyx_n_s_AioChannel_closing __pyx_mstate_global->__pyx_n_s_AioChannel_closing
+#define __pyx_n_s_AioChannel_watch_connectivity_st __pyx_mstate_global->__pyx_n_s_AioChannel_watch_connectivity_st
+#define __pyx_n_s_AioRpcStatus __pyx_mstate_global->__pyx_n_s_AioRpcStatus
+#define __pyx_n_s_AioRpcStatus___reduce_cython __pyx_mstate_global->__pyx_n_s_AioRpcStatus___reduce_cython
+#define __pyx_n_s_AioRpcStatus___setstate_cython __pyx_mstate_global->__pyx_n_s_AioRpcStatus___setstate_cython
+#define __pyx_n_s_AioRpcStatus_code __pyx_mstate_global->__pyx_n_s_AioRpcStatus_code
+#define __pyx_n_s_AioRpcStatus_debug_error_string __pyx_mstate_global->__pyx_n_s_AioRpcStatus_debug_error_string
+#define __pyx_n_s_AioRpcStatus_details __pyx_mstate_global->__pyx_n_s_AioRpcStatus_details
+#define __pyx_n_s_AioRpcStatus_trailing_metadata __pyx_mstate_global->__pyx_n_s_AioRpcStatus_trailing_metadata
+#define __pyx_n_s_AioServer __pyx_mstate_global->__pyx_n_s_AioServer
+#define __pyx_n_s_AioServer___reduce_cython __pyx_mstate_global->__pyx_n_s_AioServer___reduce_cython
+#define __pyx_n_s_AioServer___setstate_cython __pyx_mstate_global->__pyx_n_s_AioServer___setstate_cython
+#define __pyx_n_s_AioServer__request_call __pyx_mstate_global->__pyx_n_s_AioServer__request_call
+#define __pyx_n_s_AioServer__server_main_loop __pyx_mstate_global->__pyx_n_s_AioServer__server_main_loop
+#define __pyx_n_s_AioServer__serving_task_crash_ha __pyx_mstate_global->__pyx_n_s_AioServer__serving_task_crash_ha
+#define __pyx_n_s_AioServer__start_shutting_down __pyx_mstate_global->__pyx_n_s_AioServer__start_shutting_down
+#define __pyx_n_s_AioServer_add_generic_rpc_handle __pyx_mstate_global->__pyx_n_s_AioServer_add_generic_rpc_handle
+#define __pyx_n_s_AioServer_add_insecure_port __pyx_mstate_global->__pyx_n_s_AioServer_add_insecure_port
+#define __pyx_n_s_AioServer_add_secure_port __pyx_mstate_global->__pyx_n_s_AioServer_add_secure_port
+#define __pyx_n_s_AioServer_is_running __pyx_mstate_global->__pyx_n_s_AioServer_is_running
+#define __pyx_n_s_AioServer_shutdown __pyx_mstate_global->__pyx_n_s_AioServer_shutdown
+#define __pyx_n_s_AioServer_start __pyx_mstate_global->__pyx_n_s_AioServer_start
+#define __pyx_n_s_AioServer_wait_for_termination __pyx_mstate_global->__pyx_n_s_AioServer_wait_for_termination
+#define __pyx_n_s_AioState __pyx_mstate_global->__pyx_n_s_AioState
+#define __pyx_n_s_AioState___reduce_cython __pyx_mstate_global->__pyx_n_s_AioState___reduce_cython
+#define __pyx_n_s_AioState___setstate_cython __pyx_mstate_global->__pyx_n_s_AioState___setstate_cython
+#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError
+#define __pyx_n_s_AsyncIOEngine __pyx_mstate_global->__pyx_n_s_AsyncIOEngine
+#define __pyx_n_s_AttributeError __pyx_mstate_global->__pyx_n_s_AttributeError
+#define __pyx_n_s_BaseCompletionQueue __pyx_mstate_global->__pyx_n_s_BaseCompletionQueue
+#define __pyx_n_s_BaseCompletionQueue___reduce_cyt __pyx_mstate_global->__pyx_n_s_BaseCompletionQueue___reduce_cyt
+#define __pyx_n_s_BaseCompletionQueue___setstate_c __pyx_mstate_global->__pyx_n_s_BaseCompletionQueue___setstate_c
+#define __pyx_n_s_BaseError __pyx_mstate_global->__pyx_n_s_BaseError
+#define __pyx_n_s_BaseEvent __pyx_mstate_global->__pyx_n_s_BaseEvent
+#define __pyx_n_s_BatchOperationEvent __pyx_mstate_global->__pyx_n_s_BatchOperationEvent
+#define __pyx_n_s_BatchOperationEvent___reduce_cyt __pyx_mstate_global->__pyx_n_s_BatchOperationEvent___reduce_cyt
+#define __pyx_n_s_BatchOperationEvent___setstate_c __pyx_mstate_global->__pyx_n_s_BatchOperationEvent___setstate_c
+#define __pyx_n_s_BatchOperationTag __pyx_mstate_global->__pyx_n_s_BatchOperationTag
+#define __pyx_n_s_BatchOperationTag___reduce_cyth __pyx_mstate_global->__pyx_n_s_BatchOperationTag___reduce_cyth
+#define __pyx_n_s_BatchOperationTag___setstate_cy __pyx_mstate_global->__pyx_n_s_BatchOperationTag___setstate_cy
+#define __pyx_kp_s_Binary_metadata_key_s_expected_b __pyx_mstate_global->__pyx_kp_s_Binary_metadata_key_s_expected_b
+#define __pyx_n_s_BoundEventLoop __pyx_mstate_global->__pyx_n_s_BoundEventLoop
+#define __pyx_n_s_BoundEventLoop___reduce_cython __pyx_mstate_global->__pyx_n_s_BoundEventLoop___reduce_cython
+#define __pyx_n_s_BoundEventLoop___setstate_cytho __pyx_mstate_global->__pyx_n_s_BoundEventLoop___setstate_cytho
+#define __pyx_n_s_BoundEventLoop_close __pyx_mstate_global->__pyx_n_s_BoundEventLoop_close
+#define __pyx_n_s_COMPRESSION_METADATA_STRING_MAP __pyx_mstate_global->__pyx_n_s_COMPRESSION_METADATA_STRING_MAP
+#define __pyx_n_s_CUSTOM_IO_MANAGER __pyx_mstate_global->__pyx_n_s_CUSTOM_IO_MANAGER
+#define __pyx_n_s_CYGRPC_STATUS_CODE_TO_STATUS_COD __pyx_mstate_global->__pyx_n_s_CYGRPC_STATUS_CODE_TO_STATUS_COD
+#define __pyx_n_s_Call __pyx_mstate_global->__pyx_n_s_Call
+#define __pyx_n_s_CallCredentials __pyx_mstate_global->__pyx_n_s_CallCredentials
+#define __pyx_n_s_CallCredentials___reduce_cython __pyx_mstate_global->__pyx_n_s_CallCredentials___reduce_cython
+#define __pyx_n_s_CallCredentials___setstate_cytho __pyx_mstate_global->__pyx_n_s_CallCredentials___setstate_cytho
+#define __pyx_n_s_CallDetails __pyx_mstate_global->__pyx_n_s_CallDetails
+#define __pyx_n_s_CallDetails___reduce_cython __pyx_mstate_global->__pyx_n_s_CallDetails___reduce_cython
+#define __pyx_n_s_CallDetails___setstate_cython __pyx_mstate_global->__pyx_n_s_CallDetails___setstate_cython
+#define __pyx_n_s_CallError __pyx_mstate_global->__pyx_n_s_CallError
+#define __pyx_n_s_CallHandle __pyx_mstate_global->__pyx_n_s_CallHandle
+#define __pyx_n_s_CallHandle___reduce_cython __pyx_mstate_global->__pyx_n_s_CallHandle___reduce_cython
+#define __pyx_n_s_CallHandle___setstate_cython __pyx_mstate_global->__pyx_n_s_CallHandle___setstate_cython
+#define __pyx_n_s_CallState __pyx_mstate_global->__pyx_n_s_CallState
+#define __pyx_n_s_CallState___reduce_cython __pyx_mstate_global->__pyx_n_s_CallState___reduce_cython
+#define __pyx_n_s_CallState___setstate_cython __pyx_mstate_global->__pyx_n_s_CallState___setstate_cython
+#define __pyx_n_s_Call___reduce_cython __pyx_mstate_global->__pyx_n_s_Call___reduce_cython
+#define __pyx_n_s_Call___setstate_cython __pyx_mstate_global->__pyx_n_s_Call___setstate_cython
+#define __pyx_n_s_Call__custom_op_on_c_call __pyx_mstate_global->__pyx_n_s_Call__custom_op_on_c_call
+#define __pyx_n_s_Call__start_batch __pyx_mstate_global->__pyx_n_s_Call__start_batch
+#define __pyx_n_s_Call_cancel __pyx_mstate_global->__pyx_n_s_Call_cancel
+#define __pyx_kp_s_Call_credentials_are_only_valid __pyx_mstate_global->__pyx_kp_s_Call_credentials_are_only_valid
+#define __pyx_kp_s_Call_credentials_may_not_be_NULL __pyx_mstate_global->__pyx_kp_s_Call_credentials_may_not_be_NULL
+#define __pyx_n_s_Call_peer __pyx_mstate_global->__pyx_n_s_Call_peer
+#define __pyx_n_s_Call_set_credentials __pyx_mstate_global->__pyx_n_s_Call_set_credentials
+#define __pyx_n_s_Call_start_client_batch __pyx_mstate_global->__pyx_n_s_Call_start_client_batch
+#define __pyx_n_s_Call_start_server_batch __pyx_mstate_global->__pyx_n_s_Call_start_server_batch
+#define __pyx_n_s_CallbackFailureHandler __pyx_mstate_global->__pyx_n_s_CallbackFailureHandler
+#define __pyx_n_s_CallbackFailureHandler___reduce __pyx_mstate_global->__pyx_n_s_CallbackFailureHandler___reduce
+#define __pyx_n_s_CallbackFailureHandler___setstat __pyx_mstate_global->__pyx_n_s_CallbackFailureHandler___setstat
+#define __pyx_n_s_CallbackWrapper __pyx_mstate_global->__pyx_n_s_CallbackWrapper
+#define __pyx_n_s_CallbackWrapper___reduce_cython __pyx_mstate_global->__pyx_n_s_CallbackWrapper___reduce_cython
+#define __pyx_n_s_CallbackWrapper___setstate_cytho __pyx_mstate_global->__pyx_n_s_CallbackWrapper___setstate_cytho
+#define __pyx_n_s_CancelledError __pyx_mstate_global->__pyx_n_s_CancelledError
+#define __pyx_kp_s_Cannot_invoke_RPC_on_closed_chan __pyx_mstate_global->__pyx_kp_s_Cannot_invoke_RPC_on_closed_chan
+#define __pyx_kp_s_Cannot_invoke_RPC_s __pyx_mstate_global->__pyx_kp_s_Cannot_invoke_RPC_s
+#define __pyx_kp_s_Cannot_monitor_channel_state_s __pyx_mstate_global->__pyx_kp_s_Cannot_monitor_channel_state_s
+#define __pyx_n_s_CensusContext __pyx_mstate_global->__pyx_n_s_CensusContext
+#define __pyx_n_s_CensusContext___reduce_cython __pyx_mstate_global->__pyx_n_s_CensusContext___reduce_cython
+#define __pyx_n_s_CensusContext___setstate_cython __pyx_mstate_global->__pyx_n_s_CensusContext___setstate_cython
+#define __pyx_n_s_Channel __pyx_mstate_global->__pyx_n_s_Channel
+#define __pyx_n_s_ChannelArg __pyx_mstate_global->__pyx_n_s_ChannelArg
+#define __pyx_n_s_ChannelArgKey __pyx_mstate_global->__pyx_n_s_ChannelArgKey
+#define __pyx_n_s_ChannelArg___reduce_cython __pyx_mstate_global->__pyx_n_s_ChannelArg___reduce_cython
+#define __pyx_n_s_ChannelArg___setstate_cython __pyx_mstate_global->__pyx_n_s_ChannelArg___setstate_cython
+#define __pyx_n_s_ChannelArgs __pyx_mstate_global->__pyx_n_s_ChannelArgs
+#define __pyx_n_s_ChannelArgs___reduce_cython __pyx_mstate_global->__pyx_n_s_ChannelArgs___reduce_cython
+#define __pyx_n_s_ChannelArgs___setstate_cython __pyx_mstate_global->__pyx_n_s_ChannelArgs___setstate_cython
+#define __pyx_n_s_ChannelCredentials __pyx_mstate_global->__pyx_n_s_ChannelCredentials
+#define __pyx_n_s_ChannelCredentials___reduce_cyth __pyx_mstate_global->__pyx_n_s_ChannelCredentials___reduce_cyth
+#define __pyx_n_s_ChannelCredentials___setstate_cy __pyx_mstate_global->__pyx_n_s_ChannelCredentials___setstate_cy
+#define __pyx_n_s_ChannelState __pyx_mstate_global->__pyx_n_s_ChannelState
+#define __pyx_n_s_ChannelState___reduce_cython __pyx_mstate_global->__pyx_n_s_ChannelState___reduce_cython
+#define __pyx_n_s_ChannelState___setstate_cython __pyx_mstate_global->__pyx_n_s_ChannelState___setstate_cython
+#define __pyx_n_s_Channel___reduce_cython __pyx_mstate_global->__pyx_n_s_Channel___reduce_cython
+#define __pyx_n_s_Channel___setstate_cython __pyx_mstate_global->__pyx_n_s_Channel___setstate_cython
+#define __pyx_n_s_Channel_check_connectivity_state __pyx_mstate_global->__pyx_n_s_Channel_check_connectivity_state
+#define __pyx_n_s_Channel_close __pyx_mstate_global->__pyx_n_s_Channel_close
+#define __pyx_n_s_Channel_close_on_fork __pyx_mstate_global->__pyx_n_s_Channel_close_on_fork
+#define __pyx_n_s_Channel_get_registered_call_hand __pyx_mstate_global->__pyx_n_s_Channel_get_registered_call_hand
+#define __pyx_n_s_Channel_integrated_call __pyx_mstate_global->__pyx_n_s_Channel_integrated_call
+#define __pyx_kp_s_Channel_is_closed __pyx_mstate_global->__pyx_kp_s_Channel_is_closed
+#define __pyx_n_s_Channel_next_call_event __pyx_mstate_global->__pyx_n_s_Channel_next_call_event
+#define __pyx_n_s_Channel_segregated_call __pyx_mstate_global->__pyx_n_s_Channel_segregated_call
+#define __pyx_n_s_Channel_target __pyx_mstate_global->__pyx_n_s_Channel_target
+#define __pyx_n_s_Channel_watch_connectivity_state __pyx_mstate_global->__pyx_n_s_Channel_watch_connectivity_state
+#define __pyx_n_s_CompletionQueue __pyx_mstate_global->__pyx_n_s_CompletionQueue
+#define __pyx_n_s_CompletionQueue___reduce_cython __pyx_mstate_global->__pyx_n_s_CompletionQueue___reduce_cython
+#define __pyx_n_s_CompletionQueue___setstate_cytho __pyx_mstate_global->__pyx_n_s_CompletionQueue___setstate_cytho
+#define __pyx_n_s_CompletionQueue__internal_poll __pyx_mstate_global->__pyx_n_s_CompletionQueue__internal_poll
+#define __pyx_n_s_CompletionQueue_clear __pyx_mstate_global->__pyx_n_s_CompletionQueue_clear
+#define __pyx_n_s_CompletionQueue_poll __pyx_mstate_global->__pyx_n_s_CompletionQueue_poll
+#define __pyx_n_s_CompletionQueue_shutdown __pyx_mstate_global->__pyx_n_s_CompletionQueue_shutdown
+#define __pyx_n_s_CompletionType __pyx_mstate_global->__pyx_n_s_CompletionType
+#define __pyx_n_s_CompositeCallCredentials __pyx_mstate_global->__pyx_n_s_CompositeCallCredentials
+#define __pyx_n_s_CompositeCallCredentials___reduc __pyx_mstate_global->__pyx_n_s_CompositeCallCredentials___reduc
+#define __pyx_n_s_CompositeCallCredentials___setst __pyx_mstate_global->__pyx_n_s_CompositeCallCredentials___setst
+#define __pyx_n_s_CompositeChannelCredentials __pyx_mstate_global->__pyx_n_s_CompositeChannelCredentials
+#define __pyx_n_s_CompositeChannelCredentials___re __pyx_mstate_global->__pyx_n_s_CompositeChannelCredentials___re
+#define __pyx_n_s_CompositeChannelCredentials___se __pyx_mstate_global->__pyx_n_s_CompositeChannelCredentials___se
+#define __pyx_n_s_CompressionAlgorithm __pyx_mstate_global->__pyx_n_s_CompressionAlgorithm
+#define __pyx_n_s_CompressionLevel __pyx_mstate_global->__pyx_n_s_CompressionLevel
+#define __pyx_n_s_CompressionOptions __pyx_mstate_global->__pyx_n_s_CompressionOptions
+#define __pyx_n_s_CompressionOptions___reduce_cyth __pyx_mstate_global->__pyx_n_s_CompressionOptions___reduce_cyth
+#define __pyx_n_s_CompressionOptions___setstate_cy __pyx_mstate_global->__pyx_n_s_CompressionOptions___setstate_cy
+#define __pyx_n_s_CompressionOptions_disable_algor __pyx_mstate_global->__pyx_n_s_CompressionOptions_disable_algor
+#define __pyx_n_s_CompressionOptions_enable_algori __pyx_mstate_global->__pyx_n_s_CompressionOptions_enable_algori
+#define __pyx_n_s_CompressionOptions_is_algorithm __pyx_mstate_global->__pyx_n_s_CompressionOptions_is_algorithm
+#define __pyx_n_s_CompressionOptions_to_channel_ar __pyx_mstate_global->__pyx_n_s_CompressionOptions_to_channel_ar
+#define __pyx_kp_s_Compression_setting_must_be_spec __pyx_mstate_global->__pyx_kp_s_Compression_setting_must_be_spec
+#define __pyx_n_s_ComputeEngineChannelCredentials __pyx_mstate_global->__pyx_n_s_ComputeEngineChannelCredentials
+#define __pyx_n_s_ComputeEngineChannelCredentials_2 __pyx_mstate_global->__pyx_n_s_ComputeEngineChannelCredentials_2
+#define __pyx_n_s_ComputeEngineChannelCredentials_3 __pyx_mstate_global->__pyx_n_s_ComputeEngineChannelCredentials_3
+#define __pyx_n_s_ConcurrentRpcLimiter __pyx_mstate_global->__pyx_n_s_ConcurrentRpcLimiter
+#define __pyx_n_s_ConcurrentRpcLimiter___reduce_c __pyx_mstate_global->__pyx_n_s_ConcurrentRpcLimiter___reduce_c
+#define __pyx_n_s_ConcurrentRpcLimiter___setstate __pyx_mstate_global->__pyx_n_s_ConcurrentRpcLimiter___setstate
+#define __pyx_n_s_ConcurrentRpcLimiter__decrease __pyx_mstate_global->__pyx_n_s_ConcurrentRpcLimiter__decrease
+#define __pyx_n_s_ConcurrentRpcLimiter_check_befo __pyx_mstate_global->__pyx_n_s_ConcurrentRpcLimiter_check_befo
+#define __pyx_n_s_ConcurrentRpcLimiter_decrease_o __pyx_mstate_global->__pyx_n_s_ConcurrentRpcLimiter_decrease_o
+#define __pyx_kp_s_Concurrent_RPC_limit_exceeded __pyx_mstate_global->__pyx_kp_s_Concurrent_RPC_limit_exceeded
+#define __pyx_n_s_Condition __pyx_mstate_global->__pyx_n_s_Condition
+#define __pyx_n_s_ConnectivityEvent __pyx_mstate_global->__pyx_n_s_ConnectivityEvent
+#define __pyx_n_s_ConnectivityEvent___reduce_cytho __pyx_mstate_global->__pyx_n_s_ConnectivityEvent___reduce_cytho
+#define __pyx_n_s_ConnectivityEvent___setstate_cyt __pyx_mstate_global->__pyx_n_s_ConnectivityEvent___setstate_cyt
+#define __pyx_n_s_ConnectivityState __pyx_mstate_global->__pyx_n_s_ConnectivityState
+#define __pyx_n_s_ConnectivityTag __pyx_mstate_global->__pyx_n_s_ConnectivityTag
+#define __pyx_n_s_ConnectivityTag___reduce_cython __pyx_mstate_global->__pyx_n_s_ConnectivityTag___reduce_cython
+#define __pyx_n_s_ConnectivityTag___setstate_cyth __pyx_mstate_global->__pyx_n_s_ConnectivityTag___setstate_cyth
+#define __pyx_kp_s_Core_should_not_return_GRPC_QUEU __pyx_mstate_global->__pyx_kp_s_Core_should_not_return_GRPC_QUEU
+#define __pyx_kp_s_Credentials_couldn_t_have_been_s __pyx_mstate_global->__pyx_kp_s_Credentials_couldn_t_have_been_s
+#define __pyx_kp_s_Dedicated_exception_class_for_wa __pyx_mstate_global->__pyx_kp_s_Dedicated_exception_class_for_wa
+#define __pyx_n_s_DeprecationWarning __pyx_mstate_global->__pyx_n_s_DeprecationWarning
+#define __pyx_n_s_EMPTY_FLAGS __pyx_mstate_global->__pyx_n_s_EMPTY_FLAGS
+#define __pyx_n_s_EMPTY_MASK __pyx_mstate_global->__pyx_n_s_EMPTY_MASK
+#define __pyx_n_s_EOF __pyx_mstate_global->__pyx_n_s_EOF
+#define __pyx_n_s_EOF_2 __pyx_mstate_global->__pyx_n_s_EOF_2
+#define __pyx_n_s_EOF___bool __pyx_mstate_global->__pyx_n_s_EOF___bool
+#define __pyx_n_s_EOF___len __pyx_mstate_global->__pyx_n_s_EOF___len
+#define __pyx_n_s_EOF___repr __pyx_mstate_global->__pyx_n_s_EOF___repr
+#define __pyx_n_s_EOF___str __pyx_mstate_global->__pyx_n_s_EOF___str
+#define __pyx_n_s_EOF__repr __pyx_mstate_global->__pyx_n_s_EOF__repr
+#define __pyx_n_s_EX_USAGE __pyx_mstate_global->__pyx_n_s_EX_USAGE
+#define __pyx_n_s_Enum __pyx_mstate_global->__pyx_n_s_Enum
+#define __pyx_kp_s_Error_fetching_certificate_confi __pyx_mstate_global->__pyx_kp_s_Error_fetching_certificate_confi
+#define __pyx_kp_s_Error_fetching_certificate_confi_2 __pyx_mstate_global->__pyx_kp_s_Error_fetching_certificate_confi_2
+#define __pyx_kp_s_Error_in_callback_for_method_s __pyx_mstate_global->__pyx_kp_s_Error_in_callback_for_method_s
+#define __pyx_kp_s_Error_in_grpc_server_request_cal __pyx_mstate_global->__pyx_kp_s_Error_in_grpc_server_request_cal
+#define __pyx_n_s_ExecuteBatchError __pyx_mstate_global->__pyx_n_s_ExecuteBatchError
+#define __pyx_kp_s_ExecuteBatchError_raised_in_core __pyx_mstate_global->__pyx_kp_s_ExecuteBatchError_raised_in_core
+#define __pyx_kp_s_Exiting_child_due_to_raised_exce __pyx_mstate_global->__pyx_kp_s_Exiting_child_due_to_raised_exce
+#define __pyx_kp_s_Expected_bytes_str_or_unicode_no __pyx_mstate_global->__pyx_kp_s_Expected_bytes_str_or_unicode_no
+#define __pyx_kp_s_Expected_int_bytes_or_behavior_g __pyx_mstate_global->__pyx_kp_s_Expected_int_bytes_or_behavior_g
+#define __pyx_kp_s_Expected_str_not __pyx_mstate_global->__pyx_kp_s_Expected_str_not
+#define __pyx_kp_s_Expecting_non_ok_status_code __pyx_mstate_global->__pyx_kp_s_Expecting_non_ok_status_code
+#define __pyx_kp_s_Failed_grpc_call_start_batch_wit __pyx_mstate_global->__pyx_kp_s_Failed_grpc_call_start_batch_wit
+#define __pyx_kp_s_Failed_s_s __pyx_mstate_global->__pyx_kp_s_Failed_s_s
+#define __pyx_kp_s_Failed_sending_error_status_from __pyx_mstate_global->__pyx_kp_s_Failed_sending_error_status_from
+#define __pyx_kp_s_Failed_to_get_server_sockets_ple __pyx_mstate_global->__pyx_kp_s_Failed_to_get_server_sockets_ple
+#define __pyx_kp_s_Failed_to_get_servers_please_ens __pyx_mstate_global->__pyx_kp_s_Failed_to_get_servers_please_ens
+#define __pyx_kp_s_Failed_to_get_the_channel_please __pyx_mstate_global->__pyx_kp_s_Failed_to_get_the_channel_please
+#define __pyx_kp_s_Failed_to_get_the_server_please __pyx_mstate_global->__pyx_kp_s_Failed_to_get_the_server_please
+#define __pyx_kp_s_Failed_to_get_the_socket_please __pyx_mstate_global->__pyx_kp_s_Failed_to_get_the_socket_please
+#define __pyx_kp_s_Failed_to_get_the_subchannel_ple __pyx_mstate_global->__pyx_kp_s_Failed_to_get_the_subchannel_ple
+#define __pyx_kp_s_Failed_to_get_top_channels_pleas __pyx_mstate_global->__pyx_kp_s_Failed_to_get_top_channels_pleas
+#define __pyx_kp_s_Failed_to_receive_any_message_fr __pyx_mstate_global->__pyx_kp_s_Failed_to_receive_any_message_fr
+#define __pyx_kp_s_Failed_to_shutdown_gRPC_Core_aft __pyx_mstate_global->__pyx_kp_s_Failed_to_shutdown_gRPC_Core_aft
+#define __pyx_kp_s_Failed_to_shutdown_gRPC_Python_t __pyx_mstate_global->__pyx_kp_s_Failed_to_shutdown_gRPC_Python_t
+#define __pyx_n_s_ForkManagedThread __pyx_mstate_global->__pyx_n_s_ForkManagedThread
+#define __pyx_n_s_ForkManagedThread___init __pyx_mstate_global->__pyx_n_s_ForkManagedThread___init
+#define __pyx_n_s_ForkManagedThread___init___local __pyx_mstate_global->__pyx_n_s_ForkManagedThread___init___local
+#define __pyx_n_s_ForkManagedThread_join __pyx_mstate_global->__pyx_n_s_ForkManagedThread_join
+#define __pyx_n_s_ForkManagedThread_setDaemon __pyx_mstate_global->__pyx_n_s_ForkManagedThread_setDaemon
+#define __pyx_n_s_ForkManagedThread_start __pyx_mstate_global->__pyx_n_s_ForkManagedThread_start
+#define __pyx_n_s_ForkState __pyx_mstate_global->__pyx_n_s_ForkState
+#define __pyx_n_s_ForkState___init __pyx_mstate_global->__pyx_n_s_ForkState___init
+#define __pyx_n_s_GRPC_ASYNCIO_ENGINE __pyx_mstate_global->__pyx_n_s_GRPC_ASYNCIO_ENGINE
+#define __pyx_n_s_GRPC_COMPRESSION_CHANNEL_DEFAULT __pyx_mstate_global->__pyx_n_s_GRPC_COMPRESSION_CHANNEL_DEFAULT
+#define __pyx_n_s_GRPC_COMPRESSION_REQUEST_ALGORIT __pyx_mstate_global->__pyx_n_s_GRPC_COMPRESSION_REQUEST_ALGORIT
+#define __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT __pyx_mstate_global->__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT
+#define __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT_2 __pyx_mstate_global->__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT_2
+#define __pyx_n_s_GRPC_PROPAGATE_CANCELLATION __pyx_mstate_global->__pyx_n_s_GRPC_PROPAGATE_CANCELLATION
+#define __pyx_n_s_GRPC_PROPAGATE_CENSUS_STATS_CONT __pyx_mstate_global->__pyx_n_s_GRPC_PROPAGATE_CENSUS_STATS_CONT
+#define __pyx_n_s_GRPC_PROPAGATE_CENSUS_TRACING_CO __pyx_mstate_global->__pyx_n_s_GRPC_PROPAGATE_CENSUS_TRACING_CO
+#define __pyx_n_s_GRPC_PROPAGATE_DEADLINE __pyx_mstate_global->__pyx_n_s_GRPC_PROPAGATE_DEADLINE
+#define __pyx_n_s_GRPC_PROPAGATE_DEFAULTS __pyx_mstate_global->__pyx_n_s_GRPC_PROPAGATE_DEFAULTS
+#define __pyx_n_s_Group __pyx_mstate_global->__pyx_n_s_Group
+#define __pyx_n_s_GrpcArgWrapper __pyx_mstate_global->__pyx_n_s_GrpcArgWrapper
+#define __pyx_n_s_GrpcArgWrapper___reduce_cython __pyx_mstate_global->__pyx_n_s_GrpcArgWrapper___reduce_cython
+#define __pyx_n_s_GrpcArgWrapper___setstate_cytho __pyx_mstate_global->__pyx_n_s_GrpcArgWrapper___setstate_cytho
+#define __pyx_n_s_GrpcCallWrapper __pyx_mstate_global->__pyx_n_s_GrpcCallWrapper
+#define __pyx_n_s_HandlerCallDetails __pyx_mstate_global->__pyx_n_s_HandlerCallDetails
+#define __pyx_n_s_HandlerCallDetails___reduce_cyt __pyx_mstate_global->__pyx_n_s_HandlerCallDetails___reduce_cyt
+#define __pyx_n_s_HandlerCallDetails___setstate_c __pyx_mstate_global->__pyx_n_s_HandlerCallDetails___setstate_c
+#define __pyx_n_s_IMMUTABLE_EMPTY_METADATA __pyx_mstate_global->__pyx_n_s_IMMUTABLE_EMPTY_METADATA
+#define __pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR __pyx_mstate_global->__pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR
+#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError
+#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0
+#define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2
+#define __pyx_n_s_InitialMetadataFlags __pyx_mstate_global->__pyx_n_s_InitialMetadataFlags
+#define __pyx_n_s_InsecureChannelCredentials __pyx_mstate_global->__pyx_n_s_InsecureChannelCredentials
+#define __pyx_n_s_InsecureChannelCredentials___red __pyx_mstate_global->__pyx_n_s_InsecureChannelCredentials___red
+#define __pyx_n_s_InsecureChannelCredentials___set __pyx_mstate_global->__pyx_n_s_InsecureChannelCredentials___set
+#define __pyx_n_s_IntegratedCall __pyx_mstate_global->__pyx_n_s_IntegratedCall
+#define __pyx_n_s_IntegratedCall___reduce_cython __pyx_mstate_global->__pyx_n_s_IntegratedCall___reduce_cython
+#define __pyx_n_s_IntegratedCall___setstate_cython __pyx_mstate_global->__pyx_n_s_IntegratedCall___setstate_cython
+#define __pyx_n_s_IntegratedCall_cancel __pyx_mstate_global->__pyx_n_s_IntegratedCall_cancel
+#define __pyx_n_s_IntegratedCall_operate __pyx_mstate_global->__pyx_n_s_IntegratedCall_operate
+#define __pyx_n_s_InternalError __pyx_mstate_global->__pyx_n_s_InternalError
+#define __pyx_kp_s_Internal_error_from_Core __pyx_mstate_global->__pyx_kp_s_Internal_error_from_Core
+#define __pyx_kp_s_Internal_gRPC_call_error_d __pyx_mstate_global->__pyx_kp_s_Internal_gRPC_call_error_d
+#define __pyx_kp_s_Invalid_encoding_on_s __pyx_mstate_global->__pyx_kp_s_Invalid_encoding_on_s
+#define __pyx_kp_u_Invalid_trailing_metadata_type_e __pyx_mstate_global->__pyx_kp_u_Invalid_trailing_metadata_type_e
+#define __pyx_n_s_KeyError __pyx_mstate_global->__pyx_n_s_KeyError
+#define __pyx_n_s_KeyboardInterrupt __pyx_mstate_global->__pyx_n_s_KeyboardInterrupt
+#define __pyx_n_s_LOGGER __pyx_mstate_global->__pyx_n_s_LOGGER
+#define __pyx_n_s_LatentEventArg __pyx_mstate_global->__pyx_n_s_LatentEventArg
+#define __pyx_n_s_LocalChannelCredentials __pyx_mstate_global->__pyx_n_s_LocalChannelCredentials
+#define __pyx_n_s_LocalChannelCredentials___reduce __pyx_mstate_global->__pyx_n_s_LocalChannelCredentials___reduce
+#define __pyx_n_s_LocalChannelCredentials___setsta __pyx_mstate_global->__pyx_n_s_LocalChannelCredentials___setsta
+#define __pyx_n_s_LocalConnectionType __pyx_mstate_global->__pyx_n_s_LocalConnectionType
+#define __pyx_kp_s_Locally_aborted __pyx_mstate_global->__pyx_kp_s_Locally_aborted
+#define __pyx_n_s_Lock __pyx_mstate_global->__pyx_n_s_Lock
+#define __pyx_n_s_MessageReceiver __pyx_mstate_global->__pyx_n_s_MessageReceiver
+#define __pyx_n_s_MessageReceiver___anext __pyx_mstate_global->__pyx_n_s_MessageReceiver___anext
+#define __pyx_n_s_MessageReceiver___reduce_cython __pyx_mstate_global->__pyx_n_s_MessageReceiver___reduce_cython
+#define __pyx_n_s_MessageReceiver___setstate_cyth __pyx_mstate_global->__pyx_n_s_MessageReceiver___setstate_cyth
+#define __pyx_n_s_MessageReceiver__async_message __pyx_mstate_global->__pyx_n_s_MessageReceiver__async_message
+#define __pyx_n_s_MetadataPluginCallCredentials __pyx_mstate_global->__pyx_n_s_MetadataPluginCallCredentials
+#define __pyx_n_s_MetadataPluginCallCredentials_2 __pyx_mstate_global->__pyx_n_s_MetadataPluginCallCredentials_2
+#define __pyx_n_s_MetadataPluginCallCredentials_3 __pyx_mstate_global->__pyx_n_s_MetadataPluginCallCredentials_3
+#define __pyx_n_s_Metadatum __pyx_mstate_global->__pyx_n_s_Metadatum
+#define __pyx_kp_s_Method_not_found __pyx_mstate_global->__pyx_kp_s_Method_not_found
+#define __pyx_n_s_NON_OK_CALL_REPRESENTATION __pyx_mstate_global->__pyx_n_s_NON_OK_CALL_REPRESENTATION
+#define __pyx_kp_s_No_custom_hooks_are_implemented __pyx_mstate_global->__pyx_kp_s_No_custom_hooks_are_implemented
+#define __pyx_kp_s_Non_thread_safe_operation __pyx_mstate_global->__pyx_kp_s_Non_thread_safe_operation
+#define __pyx_n_s_None __pyx_mstate_global->__pyx_n_s_None
+#define __pyx_n_s_NotImplementedError __pyx_mstate_global->__pyx_n_s_NotImplementedError
+#define __pyx_n_s_OK_CALL_REPRESENTATION __pyx_mstate_global->__pyx_n_s_OK_CALL_REPRESENTATION
+#define __pyx_n_s_Operation __pyx_mstate_global->__pyx_n_s_Operation
+#define __pyx_n_s_OperationType __pyx_mstate_global->__pyx_n_s_OperationType
+#define __pyx_n_s_Operation___reduce_cython __pyx_mstate_global->__pyx_n_s_Operation___reduce_cython
+#define __pyx_n_s_Operation___setstate_cython __pyx_mstate_global->__pyx_n_s_Operation___setstate_cython
+#define __pyx_n_s_Optional __pyx_mstate_global->__pyx_n_s_Optional
+#define __pyx_n_s_POLLER __pyx_mstate_global->__pyx_n_s_POLLER
+#define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError
+#define __pyx_kp_s_Please_report_to_https_github_co __pyx_mstate_global->__pyx_kp_s_Please_report_to_https_github_co
+#define __pyx_n_s_PollerCompletionQueue __pyx_mstate_global->__pyx_n_s_PollerCompletionQueue
+#define __pyx_n_s_PollerCompletionQueue___reduce_c __pyx_mstate_global->__pyx_n_s_PollerCompletionQueue___reduce_c
+#define __pyx_n_s_PollerCompletionQueue___setstate __pyx_mstate_global->__pyx_n_s_PollerCompletionQueue___setstate
+#define __pyx_n_s_PollerCompletionQueue__handle_ev __pyx_mstate_global->__pyx_n_s_PollerCompletionQueue__handle_ev
+#define __pyx_n_s_PollerCompletionQueue__poll_wrap __pyx_mstate_global->__pyx_n_s_PollerCompletionQueue__poll_wrap
+#define __pyx_n_s_PollerCompletionQueue_bind_loop __pyx_mstate_global->__pyx_n_s_PollerCompletionQueue_bind_loop
+#define __pyx_n_s_PropagationConstants __pyx_mstate_global->__pyx_n_s_PropagationConstants
+#define __pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj __pyx_mstate_global->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj
+#define __pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_2 __pyx_mstate_global->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_2
+#define __pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_3 __pyx_mstate_global->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_3
+#define __pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_voi __pyx_mstate_global->__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_voi
+#define __pyx_n_s_Queue __pyx_mstate_global->__pyx_n_s_Queue
+#define __pyx_n_s_RLock __pyx_mstate_global->__pyx_n_s_RLock
+#define __pyx_n_s_RPCState __pyx_mstate_global->__pyx_n_s_RPCState
+#define __pyx_n_s_RPCState___reduce_cython __pyx_mstate_global->__pyx_n_s_RPCState___reduce_cython
+#define __pyx_n_s_RPCState___setstate_cython __pyx_mstate_global->__pyx_n_s_RPCState___setstate_cython
+#define __pyx_kp_s_RPC_already_finished __pyx_mstate_global->__pyx_kp_s_RPC_already_finished
+#define __pyx_kp_s_RPC_cancelled_for_servicer_metho __pyx_mstate_global->__pyx_kp_s_RPC_cancelled_for_servicer_metho
+#define __pyx_kp_s_RPC_cancelled_for_unknown_reason __pyx_mstate_global->__pyx_kp_s_RPC_cancelled_for_unknown_reason
+#define __pyx_kp_s_Raised_if_the_server_is_stopped __pyx_mstate_global->__pyx_kp_s_Raised_if_the_server_is_stopped
+#define __pyx_kp_s_Raised_upon_unexpected_errors_in __pyx_mstate_global->__pyx_kp_s_Raised_upon_unexpected_errors_in
+#define __pyx_kp_s_Raised_when_calling_abort_in_ser __pyx_mstate_global->__pyx_kp_s_Raised_when_calling_abort_in_ser
+#define __pyx_kp_s_Raised_when_execute_batch_return __pyx_mstate_global->__pyx_kp_s_Raised_when_execute_batch_return
+#define __pyx_kp_s_Raised_when_the_usage_of_API_by __pyx_mstate_global->__pyx_kp_s_Raised_when_the_usage_of_API_by
+#define __pyx_n_s_ReceiveCloseOnServerOperation __pyx_mstate_global->__pyx_n_s_ReceiveCloseOnServerOperation
+#define __pyx_n_s_ReceiveCloseOnServerOperation_2 __pyx_mstate_global->__pyx_n_s_ReceiveCloseOnServerOperation_2
+#define __pyx_n_s_ReceiveCloseOnServerOperation_3 __pyx_mstate_global->__pyx_n_s_ReceiveCloseOnServerOperation_3
+#define __pyx_n_s_ReceiveCloseOnServerOperation_ca __pyx_mstate_global->__pyx_n_s_ReceiveCloseOnServerOperation_ca
+#define __pyx_n_s_ReceiveCloseOnServerOperation_ty __pyx_mstate_global->__pyx_n_s_ReceiveCloseOnServerOperation_ty
+#define __pyx_n_s_ReceiveInitialMetadataOperation __pyx_mstate_global->__pyx_n_s_ReceiveInitialMetadataOperation
+#define __pyx_n_s_ReceiveInitialMetadataOperation_2 __pyx_mstate_global->__pyx_n_s_ReceiveInitialMetadataOperation_2
+#define __pyx_n_s_ReceiveInitialMetadataOperation_3 __pyx_mstate_global->__pyx_n_s_ReceiveInitialMetadataOperation_3
+#define __pyx_n_s_ReceiveInitialMetadataOperation_4 __pyx_mstate_global->__pyx_n_s_ReceiveInitialMetadataOperation_4
+#define __pyx_n_s_ReceiveInitialMetadataOperation_5 __pyx_mstate_global->__pyx_n_s_ReceiveInitialMetadataOperation_5
+#define __pyx_n_s_ReceiveMessageOperation __pyx_mstate_global->__pyx_n_s_ReceiveMessageOperation
+#define __pyx_n_s_ReceiveMessageOperation___reduce __pyx_mstate_global->__pyx_n_s_ReceiveMessageOperation___reduce
+#define __pyx_n_s_ReceiveMessageOperation___setsta __pyx_mstate_global->__pyx_n_s_ReceiveMessageOperation___setsta
+#define __pyx_n_s_ReceiveMessageOperation_message __pyx_mstate_global->__pyx_n_s_ReceiveMessageOperation_message
+#define __pyx_n_s_ReceiveMessageOperation_type __pyx_mstate_global->__pyx_n_s_ReceiveMessageOperation_type
+#define __pyx_n_s_ReceiveStatusOnClientOperation __pyx_mstate_global->__pyx_n_s_ReceiveStatusOnClientOperation
+#define __pyx_n_s_ReceiveStatusOnClientOperation_2 __pyx_mstate_global->__pyx_n_s_ReceiveStatusOnClientOperation_2
+#define __pyx_n_s_ReceiveStatusOnClientOperation_3 __pyx_mstate_global->__pyx_n_s_ReceiveStatusOnClientOperation_3
+#define __pyx_n_s_ReceiveStatusOnClientOperation_c __pyx_mstate_global->__pyx_n_s_ReceiveStatusOnClientOperation_c
+#define __pyx_n_s_ReceiveStatusOnClientOperation_d __pyx_mstate_global->__pyx_n_s_ReceiveStatusOnClientOperation_d
+#define __pyx_n_s_ReceiveStatusOnClientOperation_e __pyx_mstate_global->__pyx_n_s_ReceiveStatusOnClientOperation_e
+#define __pyx_n_s_ReceiveStatusOnClientOperation_t __pyx_mstate_global->__pyx_n_s_ReceiveStatusOnClientOperation_t
+#define __pyx_n_s_ReceiveStatusOnClientOperation_t_2 __pyx_mstate_global->__pyx_n_s_ReceiveStatusOnClientOperation_t_2
+#define __pyx_n_s_RequestCallError __pyx_mstate_global->__pyx_n_s_RequestCallError
+#define __pyx_n_s_RequestCallEvent __pyx_mstate_global->__pyx_n_s_RequestCallEvent
+#define __pyx_n_s_RequestCallEvent___reduce_cython __pyx_mstate_global->__pyx_n_s_RequestCallEvent___reduce_cython
+#define __pyx_n_s_RequestCallEvent___setstate_cyth __pyx_mstate_global->__pyx_n_s_RequestCallEvent___setstate_cyth
+#define __pyx_n_s_RequestCallTag __pyx_mstate_global->__pyx_n_s_RequestCallTag
+#define __pyx_n_s_RequestCallTag___reduce_cython __pyx_mstate_global->__pyx_n_s_RequestCallTag___reduce_cython
+#define __pyx_n_s_RequestCallTag___setstate_cytho __pyx_mstate_global->__pyx_n_s_RequestCallTag___setstate_cytho
+#define __pyx_n_s_RuntimeError __pyx_mstate_global->__pyx_n_s_RuntimeError
+#define __pyx_n_s_SERVICES_TO_EXCLUDE __pyx_mstate_global->__pyx_n_s_SERVICES_TO_EXCLUDE
+#define __pyx_n_s_SSLChannelCredentials __pyx_mstate_global->__pyx_n_s_SSLChannelCredentials
+#define __pyx_n_s_SSLChannelCredentials___reduce_c __pyx_mstate_global->__pyx_n_s_SSLChannelCredentials___reduce_c
+#define __pyx_n_s_SSLChannelCredentials___setstate __pyx_mstate_global->__pyx_n_s_SSLChannelCredentials___setstate
+#define __pyx_n_s_SSLSessionCacheLRU __pyx_mstate_global->__pyx_n_s_SSLSessionCacheLRU
+#define __pyx_n_s_SSLSessionCacheLRU___reduce_cyth __pyx_mstate_global->__pyx_n_s_SSLSessionCacheLRU___reduce_cyth
+#define __pyx_n_s_SSLSessionCacheLRU___setstate_cy __pyx_mstate_global->__pyx_n_s_SSLSessionCacheLRU___setstate_cy
+#define __pyx_n_s_SegregatedCall __pyx_mstate_global->__pyx_n_s_SegregatedCall
+#define __pyx_n_s_SegregatedCall___reduce_cython __pyx_mstate_global->__pyx_n_s_SegregatedCall___reduce_cython
+#define __pyx_n_s_SegregatedCall___setstate_cython __pyx_mstate_global->__pyx_n_s_SegregatedCall___setstate_cython
+#define __pyx_n_s_SegregatedCall_cancel __pyx_mstate_global->__pyx_n_s_SegregatedCall_cancel
+#define __pyx_n_s_SegregatedCall_next_event __pyx_mstate_global->__pyx_n_s_SegregatedCall_next_event
+#define __pyx_n_s_SegregatedCall_operate __pyx_mstate_global->__pyx_n_s_SegregatedCall_operate
+#define __pyx_n_s_SendCloseFromClientOperation __pyx_mstate_global->__pyx_n_s_SendCloseFromClientOperation
+#define __pyx_n_s_SendCloseFromClientOperation___r __pyx_mstate_global->__pyx_n_s_SendCloseFromClientOperation___r
+#define __pyx_n_s_SendCloseFromClientOperation___s __pyx_mstate_global->__pyx_n_s_SendCloseFromClientOperation___s
+#define __pyx_n_s_SendCloseFromClientOperation_typ __pyx_mstate_global->__pyx_n_s_SendCloseFromClientOperation_typ
+#define __pyx_n_s_SendInitialMetadataOperation __pyx_mstate_global->__pyx_n_s_SendInitialMetadataOperation
+#define __pyx_n_s_SendInitialMetadataOperation___r __pyx_mstate_global->__pyx_n_s_SendInitialMetadataOperation___r
+#define __pyx_n_s_SendInitialMetadataOperation___s __pyx_mstate_global->__pyx_n_s_SendInitialMetadataOperation___s
+#define __pyx_n_s_SendInitialMetadataOperation_typ __pyx_mstate_global->__pyx_n_s_SendInitialMetadataOperation_typ
+#define __pyx_n_s_SendMessageOperation __pyx_mstate_global->__pyx_n_s_SendMessageOperation
+#define __pyx_n_s_SendMessageOperation___reduce_cy __pyx_mstate_global->__pyx_n_s_SendMessageOperation___reduce_cy
+#define __pyx_n_s_SendMessageOperation___setstate __pyx_mstate_global->__pyx_n_s_SendMessageOperation___setstate
+#define __pyx_n_s_SendMessageOperation_type __pyx_mstate_global->__pyx_n_s_SendMessageOperation_type
+#define __pyx_n_s_SendStatusFromServerOperation __pyx_mstate_global->__pyx_n_s_SendStatusFromServerOperation
+#define __pyx_n_s_SendStatusFromServerOperation_2 __pyx_mstate_global->__pyx_n_s_SendStatusFromServerOperation_2
+#define __pyx_n_s_SendStatusFromServerOperation_3 __pyx_mstate_global->__pyx_n_s_SendStatusFromServerOperation_3
+#define __pyx_n_s_SendStatusFromServerOperation_ty __pyx_mstate_global->__pyx_n_s_SendStatusFromServerOperation_ty
+#define __pyx_kp_s_Send_initial_metadata_failed_alr __pyx_mstate_global->__pyx_kp_s_Send_initial_metadata_failed_alr
+#define __pyx_n_s_Server __pyx_mstate_global->__pyx_n_s_Server
+#define __pyx_n_s_ServerCertificateConfig __pyx_mstate_global->__pyx_n_s_ServerCertificateConfig
+#define __pyx_n_s_ServerCertificateConfig___reduce __pyx_mstate_global->__pyx_n_s_ServerCertificateConfig___reduce
+#define __pyx_n_s_ServerCertificateConfig___setsta __pyx_mstate_global->__pyx_n_s_ServerCertificateConfig___setsta
+#define __pyx_n_s_ServerCertificateConfiguration __pyx_mstate_global->__pyx_n_s_ServerCertificateConfiguration
+#define __pyx_n_s_ServerCredentials __pyx_mstate_global->__pyx_n_s_ServerCredentials
+#define __pyx_n_s_ServerCredentials___reduce_cytho __pyx_mstate_global->__pyx_n_s_ServerCredentials___reduce_cytho
+#define __pyx_n_s_ServerCredentials___setstate_cyt __pyx_mstate_global->__pyx_n_s_ServerCredentials___setstate_cyt
+#define __pyx_n_s_ServerShutdownEvent __pyx_mstate_global->__pyx_n_s_ServerShutdownEvent
+#define __pyx_n_s_ServerShutdownEvent___reduce_cyt __pyx_mstate_global->__pyx_n_s_ServerShutdownEvent___reduce_cyt
+#define __pyx_n_s_ServerShutdownEvent___setstate_c __pyx_mstate_global->__pyx_n_s_ServerShutdownEvent___setstate_c
+#define __pyx_n_s_ServerShutdownTag __pyx_mstate_global->__pyx_n_s_ServerShutdownTag
+#define __pyx_n_s_ServerShutdownTag___reduce_cyth __pyx_mstate_global->__pyx_n_s_ServerShutdownTag___reduce_cyth
+#define __pyx_n_s_ServerShutdownTag___setstate_cy __pyx_mstate_global->__pyx_n_s_ServerShutdownTag___setstate_cy
+#define __pyx_n_s_ServerStoppedError __pyx_mstate_global->__pyx_n_s_ServerStoppedError
+#define __pyx_n_s_Server___reduce_cython __pyx_mstate_global->__pyx_n_s_Server___reduce_cython
+#define __pyx_n_s_Server___setstate_cython __pyx_mstate_global->__pyx_n_s_Server___setstate_cython
+#define __pyx_n_s_Server_add_http2_port __pyx_mstate_global->__pyx_n_s_Server_add_http2_port
+#define __pyx_kp_s_Server_already_stopped __pyx_mstate_global->__pyx_kp_s_Server_already_stopped
+#define __pyx_n_s_Server_cancel_all_calls __pyx_mstate_global->__pyx_n_s_Server_cancel_all_calls
+#define __pyx_n_s_Server_destroy __pyx_mstate_global->__pyx_n_s_Server_destroy
+#define __pyx_kp_s_Server_not_in_ready_state __pyx_mstate_global->__pyx_kp_s_Server_not_in_ready_state
+#define __pyx_n_s_Server_register_completion_queue __pyx_mstate_global->__pyx_n_s_Server_register_completion_queue
+#define __pyx_n_s_Server_request_call __pyx_mstate_global->__pyx_n_s_Server_request_call
+#define __pyx_n_s_Server_shutdown __pyx_mstate_global->__pyx_n_s_Server_shutdown
+#define __pyx_kp_s_Server_shutdown_failed_no_comple __pyx_mstate_global->__pyx_kp_s_Server_shutdown_failed_no_comple
+#define __pyx_n_s_Server_start __pyx_mstate_global->__pyx_n_s_Server_start
+#define __pyx_n_s_ServicerContext __pyx_mstate_global->__pyx_n_s_ServicerContext
+#define __pyx_n_s_ServicerContext___reduce_cython __pyx_mstate_global->__pyx_n_s_ServicerContext___reduce_cython
+#define __pyx_n_s_ServicerContext___setstate_cyth __pyx_mstate_global->__pyx_n_s_ServicerContext___setstate_cyth
+#define __pyx_n_s_ServicerContext_abort __pyx_mstate_global->__pyx_n_s_ServicerContext_abort
+#define __pyx_n_s_ServicerContext_abort_with_stat __pyx_mstate_global->__pyx_n_s_ServicerContext_abort_with_stat
+#define __pyx_n_s_ServicerContext_add_done_callba __pyx_mstate_global->__pyx_n_s_ServicerContext_add_done_callba
+#define __pyx_n_s_ServicerContext_auth_context __pyx_mstate_global->__pyx_n_s_ServicerContext_auth_context
+#define __pyx_n_s_ServicerContext_cancelled __pyx_mstate_global->__pyx_n_s_ServicerContext_cancelled
+#define __pyx_n_s_ServicerContext_code __pyx_mstate_global->__pyx_n_s_ServicerContext_code
+#define __pyx_n_s_ServicerContext_details __pyx_mstate_global->__pyx_n_s_ServicerContext_details
+#define __pyx_n_s_ServicerContext_disable_next_me __pyx_mstate_global->__pyx_n_s_ServicerContext_disable_next_me
+#define __pyx_n_s_ServicerContext_done __pyx_mstate_global->__pyx_n_s_ServicerContext_done
+#define __pyx_n_s_ServicerContext_invocation_meta __pyx_mstate_global->__pyx_n_s_ServicerContext_invocation_meta
+#define __pyx_n_s_ServicerContext_peer __pyx_mstate_global->__pyx_n_s_ServicerContext_peer
+#define __pyx_n_s_ServicerContext_peer_identities __pyx_mstate_global->__pyx_n_s_ServicerContext_peer_identities
+#define __pyx_n_s_ServicerContext_peer_identity_k __pyx_mstate_global->__pyx_n_s_ServicerContext_peer_identity_k
+#define __pyx_n_s_ServicerContext_read __pyx_mstate_global->__pyx_n_s_ServicerContext_read
+#define __pyx_n_s_ServicerContext_send_initial_me __pyx_mstate_global->__pyx_n_s_ServicerContext_send_initial_me
+#define __pyx_n_s_ServicerContext_set_code __pyx_mstate_global->__pyx_n_s_ServicerContext_set_code
+#define __pyx_n_s_ServicerContext_set_compression __pyx_mstate_global->__pyx_n_s_ServicerContext_set_compression
+#define __pyx_n_s_ServicerContext_set_details __pyx_mstate_global->__pyx_n_s_ServicerContext_set_details
+#define __pyx_n_s_ServicerContext_set_trailing_me __pyx_mstate_global->__pyx_n_s_ServicerContext_set_trailing_me
+#define __pyx_n_s_ServicerContext_time_remaining __pyx_mstate_global->__pyx_n_s_ServicerContext_time_remaining
+#define __pyx_n_s_ServicerContext_trailing_metada __pyx_mstate_global->__pyx_n_s_ServicerContext_trailing_metada
+#define __pyx_n_s_ServicerContext_write __pyx_mstate_global->__pyx_n_s_ServicerContext_write
+#define __pyx_n_s_SslPemKeyCertPair __pyx_mstate_global->__pyx_n_s_SslPemKeyCertPair
+#define __pyx_n_s_SslPemKeyCertPair___reduce_cytho __pyx_mstate_global->__pyx_n_s_SslPemKeyCertPair___reduce_cytho
+#define __pyx_n_s_SslPemKeyCertPair___setstate_cyt __pyx_mstate_global->__pyx_n_s_SslPemKeyCertPair___setstate_cyt
+#define __pyx_n_s_StatusCode __pyx_mstate_global->__pyx_n_s_StatusCode
+#define __pyx_n_s_SyncServicerContext __pyx_mstate_global->__pyx_n_s_SyncServicerContext
+#define __pyx_n_s_SyncServicerContext___reduce_cy __pyx_mstate_global->__pyx_n_s_SyncServicerContext___reduce_cy
+#define __pyx_n_s_SyncServicerContext___setstate __pyx_mstate_global->__pyx_n_s_SyncServicerContext___setstate
+#define __pyx_n_s_SyncServicerContext_abort __pyx_mstate_global->__pyx_n_s_SyncServicerContext_abort
+#define __pyx_n_s_SyncServicerContext_add_callbac __pyx_mstate_global->__pyx_n_s_SyncServicerContext_add_callbac
+#define __pyx_n_s_SyncServicerContext_auth_contex __pyx_mstate_global->__pyx_n_s_SyncServicerContext_auth_contex
+#define __pyx_n_s_SyncServicerContext_disable_nex __pyx_mstate_global->__pyx_n_s_SyncServicerContext_disable_nex
+#define __pyx_n_s_SyncServicerContext_invocation __pyx_mstate_global->__pyx_n_s_SyncServicerContext_invocation
+#define __pyx_n_s_SyncServicerContext_peer __pyx_mstate_global->__pyx_n_s_SyncServicerContext_peer
+#define __pyx_n_s_SyncServicerContext_peer_identi __pyx_mstate_global->__pyx_n_s_SyncServicerContext_peer_identi
+#define __pyx_n_s_SyncServicerContext_peer_identi_2 __pyx_mstate_global->__pyx_n_s_SyncServicerContext_peer_identi_2
+#define __pyx_n_s_SyncServicerContext_send_initia __pyx_mstate_global->__pyx_n_s_SyncServicerContext_send_initia
+#define __pyx_n_s_SyncServicerContext_set_code __pyx_mstate_global->__pyx_n_s_SyncServicerContext_set_code
+#define __pyx_n_s_SyncServicerContext_set_compres __pyx_mstate_global->__pyx_n_s_SyncServicerContext_set_compres
+#define __pyx_n_s_SyncServicerContext_set_details __pyx_mstate_global->__pyx_n_s_SyncServicerContext_set_details
+#define __pyx_n_s_SyncServicerContext_set_trailin __pyx_mstate_global->__pyx_n_s_SyncServicerContext_set_trailin
+#define __pyx_n_s_SyncServicerContext_time_remain __pyx_mstate_global->__pyx_n_s_SyncServicerContext_time_remain
+#define __pyx_n_s_SystemExit __pyx_mstate_global->__pyx_n_s_SystemExit
+#define __pyx_n_s_TRUE __pyx_mstate_global->__pyx_n_s_TRUE
+#define __pyx_n_s_TRUE_VALUES __pyx_mstate_global->__pyx_n_s_TRUE_VALUES
+#define __pyx_n_s_TYPE_METADATA_STRING __pyx_mstate_global->__pyx_n_s_TYPE_METADATA_STRING
+#define __pyx_n_s_Tag __pyx_mstate_global->__pyx_n_s_Tag
+#define __pyx_n_s_Tag___reduce_cython __pyx_mstate_global->__pyx_n_s_Tag___reduce_cython
+#define __pyx_n_s_Tag___setstate_cython __pyx_mstate_global->__pyx_n_s_Tag___setstate_cython
+#define __pyx_kp_s_The_base_class_for_exceptions_ge __pyx_mstate_global->__pyx_kp_s_The_base_class_for_exceptions_ge
+#define __pyx_n_s_Thread __pyx_mstate_global->__pyx_n_s_Thread
+#define __pyx_kp_s_Timed_out __pyx_mstate_global->__pyx_kp_s_Timed_out
+#define __pyx_n_s_TimeoutError __pyx_mstate_global->__pyx_n_s_TimeoutError
+#define __pyx_n_s_True __pyx_mstate_global->__pyx_n_s_True
+#define __pyx_kp_s_Tuple_Tuple_str_Union_str_bytes __pyx_mstate_global->__pyx_kp_s_Tuple_Tuple_str_Union_str_bytes
+#define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError
+#define __pyx_n_s_UNKNOWN_CANCELLATION_DETAILS __pyx_mstate_global->__pyx_n_s_UNKNOWN_CANCELLATION_DETAILS
+#define __pyx_kp_s_Unexpected_s_raised_by_servicer __pyx_mstate_global->__pyx_kp_s_Unexpected_s_raised_by_servicer
+#define __pyx_kp_s_Unexpected_s_s __pyx_mstate_global->__pyx_kp_s_Unexpected_s_s
+#define __pyx_n_s_UnicodeDecodeError __pyx_mstate_global->__pyx_n_s_UnicodeDecodeError
+#define __pyx_n_s_Unknown __pyx_mstate_global->__pyx_n_s_Unknown
+#define __pyx_kp_s_Unsupported_engine_type_s __pyx_mstate_global->__pyx_kp_s_Unsupported_engine_type_s
+#define __pyx_n_s_UsageError __pyx_mstate_global->__pyx_n_s_UsageError
+#define __pyx_kp_s_Using_s_as_I_O_engine __pyx_mstate_global->__pyx_kp_s_Using_s_as_I_O_engine
+#define __pyx_n_s_ValueError __pyx_mstate_global->__pyx_n_s_ValueError
+#define __pyx_n_s_WatchConnectivityFailed __pyx_mstate_global->__pyx_n_s_WatchConnectivityFailed
+#define __pyx_n_s_WriteFlag __pyx_mstate_global->__pyx_n_s_WriteFlag
+#define __pyx_n_s_XDSChannelCredentials __pyx_mstate_global->__pyx_n_s_XDSChannelCredentials
+#define __pyx_n_s_XDSChannelCredentials___reduce_c __pyx_mstate_global->__pyx_n_s_XDSChannelCredentials___reduce_c
+#define __pyx_n_s_XDSChannelCredentials___setstate __pyx_mstate_global->__pyx_n_s_XDSChannelCredentials___setstate
+#define __pyx_n_s_YES __pyx_mstate_global->__pyx_n_s_YES
+#define __pyx_n_s_Yes __pyx_mstate_global->__pyx_n_s_Yes
+#define __pyx_n_s__107 __pyx_mstate_global->__pyx_n_s__107
+#define __pyx_n_s__38 __pyx_mstate_global->__pyx_n_s__38
+#define __pyx_kp_u__49 __pyx_mstate_global->__pyx_kp_u__49
+#define __pyx_n_s__57 __pyx_mstate_global->__pyx_n_s__57
+#define __pyx_kp_u__58 __pyx_mstate_global->__pyx_kp_u__58
+#define __pyx_kp_u__69 __pyx_mstate_global->__pyx_kp_u__69
+#define __pyx_kp_b__7 __pyx_mstate_global->__pyx_kp_b__7
+#define __pyx_kp_s__7 __pyx_mstate_global->__pyx_kp_s__7
+#define __pyx_kp_u__70 __pyx_mstate_global->__pyx_kp_u__70
+#define __pyx_kp_u__71 __pyx_mstate_global->__pyx_kp_u__71
+#define __pyx_n_s_abort __pyx_mstate_global->__pyx_n_s_abort
+#define __pyx_n_s_abort_with_status __pyx_mstate_global->__pyx_n_s_abort_with_status
+#define __pyx_n_s_aborted __pyx_mstate_global->__pyx_n_s_aborted
+#define __pyx_n_s_active_thread_count __pyx_mstate_global->__pyx_n_s_active_thread_count
+#define __pyx_n_s_actual_code __pyx_mstate_global->__pyx_n_s_actual_code
+#define __pyx_n_s_add __pyx_mstate_global->__pyx_n_s_add
+#define __pyx_n_s_add_callback __pyx_mstate_global->__pyx_n_s_add_callback
+#define __pyx_n_s_add_callback_handler_locals_han __pyx_mstate_global->__pyx_n_s_add_callback_handler_locals_han
+#define __pyx_n_s_add_done_callback __pyx_mstate_global->__pyx_n_s_add_done_callback
+#define __pyx_n_s_add_generic_rpc_handlers __pyx_mstate_global->__pyx_n_s_add_generic_rpc_handlers
+#define __pyx_n_s_add_http2_port __pyx_mstate_global->__pyx_n_s_add_http2_port
+#define __pyx_n_s_add_insecure_port __pyx_mstate_global->__pyx_n_s_add_insecure_port
+#define __pyx_n_s_add_reader __pyx_mstate_global->__pyx_n_s_add_reader
+#define __pyx_n_s_add_secure_port __pyx_mstate_global->__pyx_n_s_add_secure_port
+#define __pyx_n_s_address __pyx_mstate_global->__pyx_n_s_address
+#define __pyx_n_s_address_c_string __pyx_mstate_global->__pyx_n_s_address_c_string
+#define __pyx_n_s_aenter __pyx_mstate_global->__pyx_n_s_aenter
+#define __pyx_n_s_aexit __pyx_mstate_global->__pyx_n_s_aexit
+#define __pyx_n_s_after_in_child __pyx_mstate_global->__pyx_n_s_after_in_child
+#define __pyx_n_s_after_in_parent __pyx_mstate_global->__pyx_n_s_after_in_parent
+#define __pyx_n_s_agen __pyx_mstate_global->__pyx_n_s_agen
+#define __pyx_n_s_aiter __pyx_mstate_global->__pyx_n_s_aiter
+#define __pyx_n_s_algorithm __pyx_mstate_global->__pyx_n_s_algorithm
+#define __pyx_n_s_already_accepted __pyx_mstate_global->__pyx_n_s_already_accepted
+#define __pyx_n_s_already_exists __pyx_mstate_global->__pyx_n_s_already_exists
+#define __pyx_n_s_already_finished __pyx_mstate_global->__pyx_n_s_already_finished
+#define __pyx_n_s_already_invoked __pyx_mstate_global->__pyx_n_s_already_invoked
+#define __pyx_n_s_anext __pyx_mstate_global->__pyx_n_s_anext
+#define __pyx_n_s_append __pyx_mstate_global->__pyx_n_s_append
+#define __pyx_n_s_apply __pyx_mstate_global->__pyx_n_s_apply
+#define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args
+#define __pyx_n_s_arguments __pyx_mstate_global->__pyx_n_s_arguments
+#define __pyx_n_s_ascii __pyx_mstate_global->__pyx_n_s_ascii
+#define __pyx_n_s_async_callback_func __pyx_mstate_global->__pyx_n_s_async_callback_func
+#define __pyx_n_s_async_generator_to_generator __pyx_mstate_global->__pyx_n_s_async_generator_to_generator
+#define __pyx_n_s_async_message_receiver __pyx_mstate_global->__pyx_n_s_async_message_receiver
+#define __pyx_n_s_async_response_generator __pyx_mstate_global->__pyx_n_s_async_response_generator
+#define __pyx_n_s_asyncio __pyx_mstate_global->__pyx_n_s_asyncio
+#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines
+#define __pyx_n_s_asyncio_tasks __pyx_mstate_global->__pyx_n_s_asyncio_tasks
+#define __pyx_n_s_atexit __pyx_mstate_global->__pyx_n_s_atexit
+#define __pyx_n_s_auth_context __pyx_mstate_global->__pyx_n_s_auth_context
+#define __pyx_n_s_await __pyx_mstate_global->__pyx_n_s_await
+#define __pyx_n_s_await_zero_threads __pyx_mstate_global->__pyx_n_s_await_zero_threads
+#define __pyx_n_s_backup_queue __pyx_mstate_global->__pyx_n_s_backup_queue
+#define __pyx_n_s_batch_error __pyx_mstate_global->__pyx_n_s_batch_error
+#define __pyx_n_s_batch_operation_tag __pyx_mstate_global->__pyx_n_s_batch_operation_tag
+#define __pyx_n_s_batch_operations __pyx_mstate_global->__pyx_n_s_batch_operations
+#define __pyx_n_s_before __pyx_mstate_global->__pyx_n_s_before
+#define __pyx_kp_b_bin __pyx_mstate_global->__pyx_kp_b_bin
+#define __pyx_n_s_bind_loop __pyx_mstate_global->__pyx_n_s_bind_loop
+#define __pyx_n_s_block_if_fork_in_progress __pyx_mstate_global->__pyx_n_s_block_if_fork_in_progress
+#define __pyx_n_s_bool __pyx_mstate_global->__pyx_n_s_bool
+#define __pyx_n_s_buffer_hint __pyx_mstate_global->__pyx_n_s_buffer_hint
+#define __pyx_n_s_build_census_context __pyx_mstate_global->__pyx_n_s_build_census_context
+#define __pyx_n_s_bytes_ctx __pyx_mstate_global->__pyx_n_s_bytes_ctx
+#define __pyx_n_s_c_call_credentials __pyx_mstate_global->__pyx_n_s_c_call_credentials
+#define __pyx_n_s_c_cert_config __pyx_mstate_global->__pyx_n_s_c_cert_config
+#define __pyx_n_s_c_deadline __pyx_mstate_global->__pyx_n_s_c_deadline
+#define __pyx_n_s_c_details __pyx_mstate_global->__pyx_n_s_c_details
+#define __pyx_n_s_c_error_details __pyx_mstate_global->__pyx_n_s_c_error_details
+#define __pyx_n_s_c_event __pyx_mstate_global->__pyx_n_s_c_event
+#define __pyx_n_s_c_key __pyx_mstate_global->__pyx_n_s_c_key
+#define __pyx_n_s_c_options __pyx_mstate_global->__pyx_n_s_c_options
+#define __pyx_n_s_c_peer __pyx_mstate_global->__pyx_n_s_c_peer
+#define __pyx_n_s_c_pem_root_certs __pyx_mstate_global->__pyx_n_s_c_pem_root_certs
+#define __pyx_n_s_c_returned_str __pyx_mstate_global->__pyx_n_s_c_returned_str
+#define __pyx_n_s_c_target __pyx_mstate_global->__pyx_n_s_c_target
+#define __pyx_n_s_call __pyx_mstate_global->__pyx_n_s_call
+#define __pyx_n_s_call_credentials __pyx_mstate_global->__pyx_n_s_call_credentials
+#define __pyx_n_s_call_credentialses __pyx_mstate_global->__pyx_n_s_call_credentialses
+#define __pyx_n_s_call_creds __pyx_mstate_global->__pyx_n_s_call_creds
+#define __pyx_n_s_call_details __pyx_mstate_global->__pyx_n_s_call_details
+#define __pyx_n_s_call_error __pyx_mstate_global->__pyx_n_s_call_error
+#define __pyx_n_s_call_handle __pyx_mstate_global->__pyx_n_s_call_handle
+#define __pyx_n_s_call_queue __pyx_mstate_global->__pyx_n_s_call_queue
+#define __pyx_n_s_call_soon_threadsafe __pyx_mstate_global->__pyx_n_s_call_soon_threadsafe
+#define __pyx_n_s_call_state __pyx_mstate_global->__pyx_n_s_call_state
+#define __pyx_n_s_callback __pyx_mstate_global->__pyx_n_s_callback
+#define __pyx_n_s_callback_func __pyx_mstate_global->__pyx_n_s_callback_func
+#define __pyx_n_s_callback_wrapper __pyx_mstate_global->__pyx_n_s_callback_wrapper
+#define __pyx_n_s_cancel __pyx_mstate_global->__pyx_n_s_cancel
+#define __pyx_n_s_cancel_all_calls __pyx_mstate_global->__pyx_n_s_cancel_all_calls
+#define __pyx_n_s_cancelled __pyx_mstate_global->__pyx_n_s_cancelled
+#define __pyx_kp_s_cannot_register_completion_queue __pyx_mstate_global->__pyx_kp_s_cannot_register_completion_queue
+#define __pyx_n_s_capacity __pyx_mstate_global->__pyx_n_s_capacity
+#define __pyx_n_s_capsule __pyx_mstate_global->__pyx_n_s_capsule
+#define __pyx_n_s_capsule_ptr __pyx_mstate_global->__pyx_n_s_capsule_ptr
+#define __pyx_n_s_catch_warnings __pyx_mstate_global->__pyx_n_s_catch_warnings
+#define __pyx_n_s_cb __pyx_mstate_global->__pyx_n_s_cb
+#define __pyx_n_s_cb_func __pyx_mstate_global->__pyx_n_s_cb_func
+#define __pyx_n_s_census_ctx __pyx_mstate_global->__pyx_n_s_census_ctx
+#define __pyx_n_s_cert_config __pyx_mstate_global->__pyx_n_s_cert_config
+#define __pyx_n_s_cert_config_fetcher __pyx_mstate_global->__pyx_n_s_cert_config_fetcher
+#define __pyx_kp_s_cert_config_fetcher_must_be_call __pyx_mstate_global->__pyx_kp_s_cert_config_fetcher_must_be_call
+#define __pyx_n_s_certificate_chain __pyx_mstate_global->__pyx_n_s_certificate_chain
+#define __pyx_n_s_certificate_configuration __pyx_mstate_global->__pyx_n_s_certificate_configuration
+#define __pyx_n_s_cfunc_to_py __pyx_mstate_global->__pyx_n_s_cfunc_to_py
+#define __pyx_n_s_channel __pyx_mstate_global->__pyx_n_s_channel
+#define __pyx_n_s_channel_credentials __pyx_mstate_global->__pyx_n_s_channel_credentials
+#define __pyx_n_s_channel_credentials_alts __pyx_mstate_global->__pyx_n_s_channel_credentials_alts
+#define __pyx_n_s_channel_credentials_compute_engi __pyx_mstate_global->__pyx_n_s_channel_credentials_compute_engi
+#define __pyx_n_s_channel_credentials_insecure __pyx_mstate_global->__pyx_n_s_channel_credentials_insecure
+#define __pyx_n_s_channel_credentials_local __pyx_mstate_global->__pyx_n_s_channel_credentials_local
+#define __pyx_n_s_channel_id __pyx_mstate_global->__pyx_n_s_channel_id
+#define __pyx_n_s_channel_state __pyx_mstate_global->__pyx_n_s_channel_state
+#define __pyx_n_s_channels __pyx_mstate_global->__pyx_n_s_channels
+#define __pyx_n_s_channelz_get_channel __pyx_mstate_global->__pyx_n_s_channelz_get_channel
+#define __pyx_n_s_channelz_get_server __pyx_mstate_global->__pyx_n_s_channelz_get_server
+#define __pyx_n_s_channelz_get_server_sockets __pyx_mstate_global->__pyx_n_s_channelz_get_server_sockets
+#define __pyx_n_s_channelz_get_servers __pyx_mstate_global->__pyx_n_s_channelz_get_servers
+#define __pyx_n_s_channelz_get_socket __pyx_mstate_global->__pyx_n_s_channelz_get_socket
+#define __pyx_n_s_channelz_get_subchannel __pyx_mstate_global->__pyx_n_s_channelz_get_subchannel
+#define __pyx_n_s_channelz_get_top_channels __pyx_mstate_global->__pyx_n_s_channelz_get_top_channels
+#define __pyx_n_s_check_before_request_call __pyx_mstate_global->__pyx_n_s_check_before_request_call
+#define __pyx_n_s_check_connectivity_state __pyx_mstate_global->__pyx_n_s_check_connectivity_state
+#define __pyx_n_s_class __pyx_mstate_global->__pyx_n_s_class
+#define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem
+#define __pyx_n_s_clear __pyx_mstate_global->__pyx_n_s_clear
+#define __pyx_n_s_clear_server_call_tracer_factory __pyx_mstate_global->__pyx_n_s_clear_server_call_tracer_factory
+#define __pyx_n_s_client_config_in_slice __pyx_mstate_global->__pyx_n_s_client_config_in_slice
+#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback
+#define __pyx_n_s_close __pyx_mstate_global->__pyx_n_s_close
+#define __pyx_n_s_close_on_fork __pyx_mstate_global->__pyx_n_s_close_on_fork
+#define __pyx_n_s_close_on_fork_2 __pyx_mstate_global->__pyx_n_s_close_on_fork_2
+#define __pyx_n_s_closed __pyx_mstate_global->__pyx_n_s_closed
+#define __pyx_n_s_closing __pyx_mstate_global->__pyx_n_s_closing
+#define __pyx_n_s_code __pyx_mstate_global->__pyx_n_s_code
+#define __pyx_n_s_codecs __pyx_mstate_global->__pyx_n_s_codecs
+#define __pyx_n_s_collections __pyx_mstate_global->__pyx_n_s_collections
+#define __pyx_n_s_common __pyx_mstate_global->__pyx_n_s_common
+#define __pyx_n_s_completion_type __pyx_mstate_global->__pyx_n_s_completion_type
+#define __pyx_n_s_compression __pyx_mstate_global->__pyx_n_s_compression
+#define __pyx_n_s_compression_algorithm_name __pyx_mstate_global->__pyx_n_s_compression_algorithm_name
+#define __pyx_n_s_concurrency_exceeded __pyx_mstate_global->__pyx_n_s_concurrency_exceeded
+#define __pyx_n_s_condition __pyx_mstate_global->__pyx_n_s_condition
+#define __pyx_n_s_connecting __pyx_mstate_global->__pyx_n_s_connecting
+#define __pyx_n_s_context __pyx_mstate_global->__pyx_n_s_context
+#define __pyx_n_s_context_loop __pyx_mstate_global->__pyx_n_s_context_loop
+#define __pyx_n_s_contextvars __pyx_mstate_global->__pyx_n_s_contextvars
+#define __pyx_n_s_contextvars_supported __pyx_mstate_global->__pyx_n_s_contextvars_supported
+#define __pyx_n_s_continuation __pyx_mstate_global->__pyx_n_s_continuation
+#define __pyx_n_s_copy __pyx_mstate_global->__pyx_n_s_copy
+#define __pyx_n_s_copy_context __pyx_mstate_global->__pyx_n_s_copy_context
+#define __pyx_n_s_core_function_name __pyx_mstate_global->__pyx_n_s_core_function_name
+#define __pyx_n_s_coro __pyx_mstate_global->__pyx_n_s_coro
+#define __pyx_n_s_create_client_call_tracer __pyx_mstate_global->__pyx_n_s_create_client_call_tracer
+#define __pyx_n_s_create_future __pyx_mstate_global->__pyx_n_s_create_future
+#define __pyx_n_s_create_server_call_tracer_factor __pyx_mstate_global->__pyx_n_s_create_server_call_tracer_factor
+#define __pyx_n_s_create_task __pyx_mstate_global->__pyx_n_s_create_task
+#define __pyx_n_s_credentials __pyx_mstate_global->__pyx_n_s_credentials
+#define __pyx_n_s_credentials_2 __pyx_mstate_global->__pyx_n_s_credentials_2
+#define __pyx_kp_s_credentials_roots_pem __pyx_mstate_global->__pyx_kp_s_credentials_roots_pem
+#define __pyx_n_s_creds __pyx_mstate_global->__pyx_n_s_creds
+#define __pyx_n_s_ctx __pyx_mstate_global->__pyx_n_s_ctx
+#define __pyx_n_s_custom_io_manager __pyx_mstate_global->__pyx_n_s_custom_io_manager
+#define __pyx_n_s_custom_op_on_c_call __pyx_mstate_global->__pyx_n_s_custom_op_on_c_call
+#define __pyx_kp_s_cygrpc __pyx_mstate_global->__pyx_kp_s_cygrpc
+#define __pyx_n_s_cython_call_credentials __pyx_mstate_global->__pyx_n_s_cython_call_credentials
+#define __pyx_n_s_cython_cygrpc __pyx_mstate_global->__pyx_n_s_cython_cygrpc
+#define __pyx_n_s_daemon __pyx_mstate_global->__pyx_n_s_daemon
+#define __pyx_n_s_daemonic __pyx_mstate_global->__pyx_n_s_daemonic
+#define __pyx_n_s_data __pyx_mstate_global->__pyx_n_s_data
+#define __pyx_n_s_data_loss __pyx_mstate_global->__pyx_n_s_data_loss
+#define __pyx_n_s_deadline __pyx_mstate_global->__pyx_n_s_deadline
+#define __pyx_n_s_deadline_exceeded __pyx_mstate_global->__pyx_n_s_deadline_exceeded
+#define __pyx_kp_s_dealloc___called_on_running_se __pyx_mstate_global->__pyx_kp_s_dealloc___called_on_running_se
+#define __pyx_n_s_debug __pyx_mstate_global->__pyx_n_s_debug
+#define __pyx_n_s_debug_error_string __pyx_mstate_global->__pyx_n_s_debug_error_string
+#define __pyx_n_s_decode __pyx_mstate_global->__pyx_n_s_decode
+#define __pyx_n_s_decrease_active_rpcs_count __pyx_mstate_global->__pyx_n_s_decrease_active_rpcs_count
+#define __pyx_n_s_decrease_once_finished __pyx_mstate_global->__pyx_n_s_decrease_once_finished
+#define __pyx_n_s_decrement __pyx_mstate_global->__pyx_n_s_decrement
+#define __pyx_n_s_default_authority __pyx_mstate_global->__pyx_n_s_default_authority
+#define __pyx_n_s_default_vtable __pyx_mstate_global->__pyx_n_s_default_vtable
+#define __pyx_n_s_deflate __pyx_mstate_global->__pyx_n_s_deflate
+#define __pyx_n_s_delete_call_tracer __pyx_mstate_global->__pyx_n_s_delete_call_tracer
+#define __pyx_n_s_destroy __pyx_mstate_global->__pyx_n_s_destroy
+#define __pyx_n_s_details __pyx_mstate_global->__pyx_n_s_details
+#define __pyx_n_s_details_bytes __pyx_mstate_global->__pyx_n_s_details_bytes
+#define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict
+#define __pyx_n_s_dict_2 __pyx_mstate_global->__pyx_n_s_dict_2
+#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable
+#define __pyx_n_s_disable_algorithm __pyx_mstate_global->__pyx_n_s_disable_algorithm
+#define __pyx_n_s_disable_next_message_compression __pyx_mstate_global->__pyx_n_s_disable_next_message_compression
+#define __pyx_n_s_discard __pyx_mstate_global->__pyx_n_s_discard
+#define __pyx_n_s_doc __pyx_mstate_global->__pyx_n_s_doc
+#define __pyx_n_s_done __pyx_mstate_global->__pyx_n_s_done
+#define __pyx_n_s_dump_xds_configs __pyx_mstate_global->__pyx_n_s_dump_xds_configs
+#define __pyx_n_s_e __pyx_mstate_global->__pyx_n_s_e
+#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable
+#define __pyx_n_s_enable_algorithm __pyx_mstate_global->__pyx_n_s_enable_algorithm
+#define __pyx_n_s_enable_census __pyx_mstate_global->__pyx_n_s_enable_census
+#define __pyx_n_s_encode __pyx_mstate_global->__pyx_n_s_encode
+#define __pyx_n_s_end_time __pyx_mstate_global->__pyx_n_s_end_time
+#define __pyx_n_s_endswith __pyx_mstate_global->__pyx_n_s_endswith
+#define __pyx_n_s_enter __pyx_mstate_global->__pyx_n_s_enter
+#define __pyx_n_s_enter_user_request_generator __pyx_mstate_global->__pyx_n_s_enter_user_request_generator
+#define __pyx_n_s_enum __pyx_mstate_global->__pyx_n_s_enum
+#define __pyx_n_s_enumerate __pyx_mstate_global->__pyx_n_s_enumerate
+#define __pyx_n_s_environ __pyx_mstate_global->__pyx_n_s_environ
+#define __pyx_n_s_errno __pyx_mstate_global->__pyx_n_s_errno
+#define __pyx_n_s_error __pyx_mstate_global->__pyx_n_s_error
+#define __pyx_n_s_error_code __pyx_mstate_global->__pyx_n_s_error_code
+#define __pyx_n_s_error_details __pyx_mstate_global->__pyx_n_s_error_details
+#define __pyx_n_s_error_str __pyx_mstate_global->__pyx_n_s_error_str
+#define __pyx_n_s_error_string __pyx_mstate_global->__pyx_n_s_error_string
+#define __pyx_n_s_event __pyx_mstate_global->__pyx_n_s_event
+#define __pyx_n_s_exc_info __pyx_mstate_global->__pyx_n_s_exc_info
+#define __pyx_n_s_exception __pyx_mstate_global->__pyx_n_s_exception
+#define __pyx_n_s_exception_type __pyx_mstate_global->__pyx_n_s_exception_type
+#define __pyx_n_s_execute_batch __pyx_mstate_global->__pyx_n_s_execute_batch
+#define __pyx_n_s_exit __pyx_mstate_global->__pyx_n_s_exit
+#define __pyx_n_s_exit_2 __pyx_mstate_global->__pyx_n_s_exit_2
+#define __pyx_kp_s_expected_certificate_to_be_bytes __pyx_mstate_global->__pyx_kp_s_expected_certificate_to_be_bytes
+#define __pyx_kp_s_expected_pem_key_cert_pairs_to_b __pyx_mstate_global->__pyx_kp_s_expected_pem_key_cert_pairs_to_b
+#define __pyx_kp_s_expected_registered_completion_q __pyx_mstate_global->__pyx_kp_s_expected_registered_completion_q
+#define __pyx_n_s_failed_precondition __pyx_mstate_global->__pyx_n_s_failed_precondition
+#define __pyx_n_s_failure_handler __pyx_mstate_global->__pyx_n_s_failure_handler
+#define __pyx_n_s_fallback_credentials __pyx_mstate_global->__pyx_n_s_fallback_credentials
+#define __pyx_n_s_fileno __pyx_mstate_global->__pyx_n_s_fileno
+#define __pyx_n_s_find_method_handler __pyx_mstate_global->__pyx_n_s_find_method_handler
+#define __pyx_n_s_find_method_handler_locals_quer __pyx_mstate_global->__pyx_n_s_find_method_handler_locals_quer
+#define __pyx_n_s_finish_handler_with_stream_resp __pyx_mstate_global->__pyx_n_s_finish_handler_with_stream_resp
+#define __pyx_n_s_finish_handler_with_unary_respo __pyx_mstate_global->__pyx_n_s_finish_handler_with_unary_respo
+#define __pyx_n_s_finish_ops __pyx_mstate_global->__pyx_n_s_finish_ops
+#define __pyx_n_s_flags __pyx_mstate_global->__pyx_n_s_flags
+#define __pyx_n_s_fn __pyx_mstate_global->__pyx_n_s_fn
+#define __pyx_n_s_force_client_auth __pyx_mstate_global->__pyx_n_s_force_client_auth
+#define __pyx_n_s_fork_epoch __pyx_mstate_global->__pyx_n_s_fork_epoch
+#define __pyx_n_s_fork_handler_failed __pyx_mstate_global->__pyx_n_s_fork_handler_failed
+#define __pyx_n_s_fork_handler_registered __pyx_mstate_global->__pyx_n_s_fork_handler_registered
+#define __pyx_n_s_fork_handler_registered_lock __pyx_mstate_global->__pyx_n_s_fork_handler_registered_lock
+#define __pyx_n_s_fork_handlers_and_grpc_init __pyx_mstate_global->__pyx_n_s_fork_handlers_and_grpc_init
+#define __pyx_n_s_fork_in_progress __pyx_mstate_global->__pyx_n_s_fork_in_progress
+#define __pyx_n_s_fork_in_progress_condition __pyx_mstate_global->__pyx_n_s_fork_in_progress_condition
+#define __pyx_n_s_fork_register_channel __pyx_mstate_global->__pyx_n_s_fork_register_channel
+#define __pyx_n_s_fork_state __pyx_mstate_global->__pyx_n_s_fork_state
+#define __pyx_n_s_fork_unregister_channel __pyx_mstate_global->__pyx_n_s_fork_unregister_channel
+#define __pyx_n_s_format __pyx_mstate_global->__pyx_n_s_format
+#define __pyx_n_s_format_exception __pyx_mstate_global->__pyx_n_s_format_exception
+#define __pyx_n_s_functools __pyx_mstate_global->__pyx_n_s_functools
+#define __pyx_n_s_future __pyx_mstate_global->__pyx_n_s_future
+#define __pyx_n_s_g_gevent_activated __pyx_mstate_global->__pyx_n_s_g_gevent_activated
+#define __pyx_n_s_g_gevent_pool __pyx_mstate_global->__pyx_n_s_g_gevent_pool
+#define __pyx_n_s_g_gevent_threadpool __pyx_mstate_global->__pyx_n_s_g_gevent_threadpool
+#define __pyx_n_s_g_interrupt_check_period_ms __pyx_mstate_global->__pyx_n_s_g_interrupt_check_period_ms
+#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc
+#define __pyx_n_s_gen __pyx_mstate_global->__pyx_n_s_gen
+#define __pyx_n_s_generator_to_async_generator __pyx_mstate_global->__pyx_n_s_generator_to_async_generator
+#define __pyx_n_s_generator_to_async_generator_loc __pyx_mstate_global->__pyx_n_s_generator_to_async_generator_loc
+#define __pyx_n_s_generic_handler __pyx_mstate_global->__pyx_n_s_generic_handler
+#define __pyx_n_s_generic_handlers __pyx_mstate_global->__pyx_n_s_generic_handlers
+#define __pyx_n_s_generic_rpc_handlers __pyx_mstate_global->__pyx_n_s_generic_rpc_handlers
+#define __pyx_n_s_genexpr __pyx_mstate_global->__pyx_n_s_genexpr
+#define __pyx_n_s_get __pyx_mstate_global->__pyx_n_s_get
+#define __pyx_n_s_getLogger __pyx_mstate_global->__pyx_n_s_getLogger
+#define __pyx_n_s_get_data __pyx_mstate_global->__pyx_n_s_get_data
+#define __pyx_n_s_get_deadline_from_context __pyx_mstate_global->__pyx_n_s_get_deadline_from_context
+#define __pyx_n_s_get_event_loop __pyx_mstate_global->__pyx_n_s_get_event_loop
+#define __pyx_n_s_get_event_loop_policy __pyx_mstate_global->__pyx_n_s_get_event_loop_policy
+#define __pyx_n_s_get_fork_epoch __pyx_mstate_global->__pyx_n_s_get_fork_epoch
+#define __pyx_n_s_get_hub __pyx_mstate_global->__pyx_n_s_get_hub
+#define __pyx_n_s_get_metadata_locals_callback __pyx_mstate_global->__pyx_n_s_get_metadata_locals_callback
+#define __pyx_n_s_get_plugin __pyx_mstate_global->__pyx_n_s_get_plugin
+#define __pyx_n_s_get_registered_call_handle __pyx_mstate_global->__pyx_n_s_get_registered_call_handle
+#define __pyx_n_s_get_running_loop __pyx_mstate_global->__pyx_n_s_get_running_loop
+#define __pyx_n_s_get_working_loop __pyx_mstate_global->__pyx_n_s_get_working_loop
+#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate
+#define __pyx_n_s_gevent __pyx_mstate_global->__pyx_n_s_gevent
+#define __pyx_n_s_gevent_decrement_channel_count __pyx_mstate_global->__pyx_n_s_gevent_decrement_channel_count
+#define __pyx_n_s_gevent_hub __pyx_mstate_global->__pyx_n_s_gevent_hub
+#define __pyx_n_s_gevent_increment_channel_count __pyx_mstate_global->__pyx_n_s_gevent_increment_channel_count
+#define __pyx_n_s_gevent_pool __pyx_mstate_global->__pyx_n_s_gevent_pool
+#define __pyx_n_s_grace __pyx_mstate_global->__pyx_n_s_grace
+#define __pyx_n_s_grpc __pyx_mstate_global->__pyx_n_s_grpc
+#define __pyx_kp_s_grpc_aio_EOF __pyx_mstate_global->__pyx_kp_s_grpc_aio_EOF
+#define __pyx_n_s_grpc_call_error_string __pyx_mstate_global->__pyx_n_s_grpc_call_error_string
+#define __pyx_n_s_grpc_call_wrapper __pyx_mstate_global->__pyx_n_s_grpc_call_wrapper
+#define __pyx_n_s_grpc_completion_queue_shutdown __pyx_mstate_global->__pyx_n_s_grpc_completion_queue_shutdown
+#define __pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap __pyx_mstate_global->__pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap
+#define __pyx_n_s_grpc_server_request_call __pyx_mstate_global->__pyx_n_s_grpc_server_request_call
+#define __pyx_n_s_grpc_server_shutdown_and_notify __pyx_mstate_global->__pyx_n_s_grpc_server_shutdown_and_notify
+#define __pyx_n_s_grpc_shutdown_wrapper __pyx_mstate_global->__pyx_n_s_grpc_shutdown_wrapper
+#define __pyx_n_s_gzip __pyx_mstate_global->__pyx_n_s_gzip
+#define __pyx_n_s_handle_callback_wrapper __pyx_mstate_global->__pyx_n_s_handle_callback_wrapper
+#define __pyx_n_s_handle_callbacks __pyx_mstate_global->__pyx_n_s_handle_callbacks
+#define __pyx_n_s_handle_cancellation_from_core __pyx_mstate_global->__pyx_n_s_handle_cancellation_from_core
+#define __pyx_n_s_handle_events __pyx_mstate_global->__pyx_n_s_handle_events
+#define __pyx_n_s_handle_exceptions __pyx_mstate_global->__pyx_n_s_handle_exceptions
+#define __pyx_n_s_handle_rpc __pyx_mstate_global->__pyx_n_s_handle_rpc
+#define __pyx_n_s_handle_status_once_received __pyx_mstate_global->__pyx_n_s_handle_status_once_received
+#define __pyx_n_s_handle_stream_stream_rpc __pyx_mstate_global->__pyx_n_s_handle_stream_stream_rpc
+#define __pyx_n_s_handle_stream_unary_rpc __pyx_mstate_global->__pyx_n_s_handle_stream_unary_rpc
+#define __pyx_n_s_handle_unary_stream_rpc __pyx_mstate_global->__pyx_n_s_handle_unary_stream_rpc
+#define __pyx_n_s_handle_unary_unary_rpc __pyx_mstate_global->__pyx_n_s_handle_unary_unary_rpc
+#define __pyx_n_s_handler __pyx_mstate_global->__pyx_n_s_handler
+#define __pyx_n_s_handler_call_details __pyx_mstate_global->__pyx_n_s_handler_call_details
+#define __pyx_n_s_hex_codec __pyx_mstate_global->__pyx_n_s_hex_codec
+#define __pyx_n_s_high __pyx_mstate_global->__pyx_n_s_high
+#define __pyx_n_s_host __pyx_mstate_global->__pyx_n_s_host
+#define __pyx_n_s_http2_initial_sequence_number __pyx_mstate_global->__pyx_n_s_http2_initial_sequence_number
+#define __pyx_n_s_hub __pyx_mstate_global->__pyx_n_s_hub
+#define __pyx_n_s_id __pyx_mstate_global->__pyx_n_s_id
+#define __pyx_n_s_identities __pyx_mstate_global->__pyx_n_s_identities
+#define __pyx_n_s_identity __pyx_mstate_global->__pyx_n_s_identity
+#define __pyx_n_s_identity_key __pyx_mstate_global->__pyx_n_s_identity_key
+#define __pyx_n_s_idle __pyx_mstate_global->__pyx_n_s_idle
+#define __pyx_kp_s_if_error_code_is_specified_so_mu __pyx_mstate_global->__pyx_kp_s_if_error_code_is_specified_so_mu
+#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import
+#define __pyx_n_s_inbound_ops __pyx_mstate_global->__pyx_n_s_inbound_ops
+#define __pyx_n_s_increment __pyx_mstate_global->__pyx_n_s_increment
+#define __pyx_n_s_init __pyx_mstate_global->__pyx_n_s_init
+#define __pyx_n_s_init_grpc_aio __pyx_mstate_global->__pyx_n_s_init_grpc_aio
+#define __pyx_n_s_init_grpc_gevent __pyx_mstate_global->__pyx_n_s_init_grpc_gevent
+#define __pyx_n_s_init_subclass __pyx_mstate_global->__pyx_n_s_init_subclass
+#define __pyx_n_s_initial_cert_config __pyx_mstate_global->__pyx_n_s_initial_cert_config
+#define __pyx_kp_s_initial_cert_config_must_be_a_gr __pyx_mstate_global->__pyx_kp_s_initial_cert_config_must_be_a_gr
+#define __pyx_n_s_initial_metadata __pyx_mstate_global->__pyx_n_s_initial_metadata
+#define __pyx_n_s_initial_metadata_op __pyx_mstate_global->__pyx_n_s_initial_metadata_op
+#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing
+#define __pyx_n_s_initiate_stream_stream __pyx_mstate_global->__pyx_n_s_initiate_stream_stream
+#define __pyx_n_s_initiate_unary_stream __pyx_mstate_global->__pyx_n_s_initiate_unary_stream
+#define __pyx_n_s_insecure_server_credentials __pyx_mstate_global->__pyx_n_s_insecure_server_credentials
+#define __pyx_n_s_inspect __pyx_mstate_global->__pyx_n_s_inspect
+#define __pyx_n_s_install_context_from_request_cal __pyx_mstate_global->__pyx_n_s_install_context_from_request_cal
+#define __pyx_n_s_install_context_from_request_cal_2 __pyx_mstate_global->__pyx_n_s_install_context_from_request_cal_2
+#define __pyx_n_s_int __pyx_mstate_global->__pyx_n_s_int
+#define __pyx_n_s_integrated_call __pyx_mstate_global->__pyx_n_s_integrated_call
+#define __pyx_n_s_integrated_call_locals_on_succe __pyx_mstate_global->__pyx_n_s_integrated_call_locals_on_succe
+#define __pyx_n_s_intercept_service __pyx_mstate_global->__pyx_n_s_intercept_service
+#define __pyx_n_s_interceptor __pyx_mstate_global->__pyx_n_s_interceptor
+#define __pyx_n_s_interceptors __pyx_mstate_global->__pyx_n_s_interceptors
+#define __pyx_n_s_internal __pyx_mstate_global->__pyx_n_s_internal
+#define __pyx_kp_s_internal_error_user_data_must_be __pyx_mstate_global->__pyx_kp_s_internal_error_user_data_must_be
+#define __pyx_n_s_internal_poll __pyx_mstate_global->__pyx_n_s_internal_poll
+#define __pyx_n_s_invalid_argument __pyx_mstate_global->__pyx_n_s_invalid_argument
+#define __pyx_kp_s_invalid_call_object_cannot_be_us __pyx_mstate_global->__pyx_kp_s_invalid_call_object_cannot_be_us
+#define __pyx_n_s_invalid_flags __pyx_mstate_global->__pyx_n_s_invalid_flags
+#define __pyx_n_s_invalid_metadata __pyx_mstate_global->__pyx_n_s_invalid_metadata
+#define __pyx_n_s_invocation_metadata __pyx_mstate_global->__pyx_n_s_invocation_metadata
+#define __pyx_n_s_is_algorithm_enabled __pyx_mstate_global->__pyx_n_s_is_algorithm_enabled
+#define __pyx_n_s_is_async_handler __pyx_mstate_global->__pyx_n_s_is_async_handler
+#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine
+#define __pyx_n_s_is_fork_support_enabled __pyx_mstate_global->__pyx_n_s_is_fork_support_enabled
+#define __pyx_n_s_is_locally_cancelled __pyx_mstate_global->__pyx_n_s_is_locally_cancelled
+#define __pyx_n_s_is_ok __pyx_mstate_global->__pyx_n_s_is_ok
+#define __pyx_n_s_is_running __pyx_mstate_global->__pyx_n_s_is_running
+#define __pyx_n_s_is_sampled __pyx_mstate_global->__pyx_n_s_is_sampled
+#define __pyx_n_s_is_valid __pyx_mstate_global->__pyx_n_s_is_valid
+#define __pyx_n_s_isasyncgenfunction __pyx_mstate_global->__pyx_n_s_isasyncgenfunction
+#define __pyx_n_s_isawaitable __pyx_mstate_global->__pyx_n_s_isawaitable
+#define __pyx_n_s_iscoroutinefunction __pyx_mstate_global->__pyx_n_s_iscoroutinefunction
+#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled
+#define __pyx_n_s_item __pyx_mstate_global->__pyx_n_s_item
+#define __pyx_n_s_iter __pyx_mstate_global->__pyx_n_s_iter
+#define __pyx_n_s_join __pyx_mstate_global->__pyx_n_s_join
+#define __pyx_n_s_key __pyx_mstate_global->__pyx_n_s_key
+#define __pyx_n_s_keys __pyx_mstate_global->__pyx_n_s_keys
+#define __pyx_n_s_last_observed_state __pyx_mstate_global->__pyx_n_s_last_observed_state
+#define __pyx_n_s_latent_event_arg __pyx_mstate_global->__pyx_n_s_latent_event_arg
+#define __pyx_n_s_len __pyx_mstate_global->__pyx_n_s_len
+#define __pyx_n_s_lk __pyx_mstate_global->__pyx_n_s_lk
+#define __pyx_n_s_local_connect_type __pyx_mstate_global->__pyx_n_s_local_connect_type
+#define __pyx_n_s_local_tcp __pyx_mstate_global->__pyx_n_s_local_tcp
+#define __pyx_n_s_logging __pyx_mstate_global->__pyx_n_s_logging
+#define __pyx_n_s_loop __pyx_mstate_global->__pyx_n_s_loop
+#define __pyx_n_s_low __pyx_mstate_global->__pyx_n_s_low
+#define __pyx_n_s_lower __pyx_mstate_global->__pyx_n_s_lower
+#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main
+#define __pyx_n_s_managed_target __pyx_mstate_global->__pyx_n_s_managed_target
+#define __pyx_n_s_max_concurrent_streams __pyx_mstate_global->__pyx_n_s_max_concurrent_streams
+#define __pyx_n_s_max_receive_message_length __pyx_mstate_global->__pyx_n_s_max_receive_message_length
+#define __pyx_n_s_max_results __pyx_mstate_global->__pyx_n_s_max_results
+#define __pyx_n_s_max_send_message_length __pyx_mstate_global->__pyx_n_s_max_send_message_length
+#define __pyx_n_s_maximum_concurrent_rpcs __pyx_mstate_global->__pyx_n_s_maximum_concurrent_rpcs
+#define __pyx_kp_s_maximum_concurrent_rpcs_should_b __pyx_mstate_global->__pyx_kp_s_maximum_concurrent_rpcs_should_b
+#define __pyx_n_s_maxsize __pyx_mstate_global->__pyx_n_s_maxsize
+#define __pyx_n_s_maybe_save_server_trace_context __pyx_mstate_global->__pyx_n_s_maybe_save_server_trace_context
+#define __pyx_n_s_medium __pyx_mstate_global->__pyx_n_s_medium
+#define __pyx_n_s_members __pyx_mstate_global->__pyx_n_s_members
+#define __pyx_n_s_message __pyx_mstate_global->__pyx_n_s_message
+#define __pyx_n_s_metaclass __pyx_mstate_global->__pyx_n_s_metaclass
+#define __pyx_n_s_metadata __pyx_mstate_global->__pyx_n_s_metadata
+#define __pyx_n_s_metadata_locals_genexpr __pyx_mstate_global->__pyx_n_s_metadata_locals_genexpr
+#define __pyx_n_s_metadata_plugin __pyx_mstate_global->__pyx_n_s_metadata_plugin
+#define __pyx_n_s_metadata_sent_observer __pyx_mstate_global->__pyx_n_s_metadata_sent_observer
+#define __pyx_kp_s_metadata_was_invalid_s __pyx_mstate_global->__pyx_kp_s_metadata_was_invalid_s
+#define __pyx_n_s_method __pyx_mstate_global->__pyx_n_s_method
+#define __pyx_n_s_method_handler __pyx_mstate_global->__pyx_n_s_method_handler
+#define __pyx_n_s_module __pyx_mstate_global->__pyx_n_s_module
+#define __pyx_n_s_mro_entries __pyx_mstate_global->__pyx_n_s_mro_entries
+#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name
+#define __pyx_n_s_name_2 __pyx_mstate_global->__pyx_n_s_name_2
+#define __pyx_n_s_namedtuple __pyx_mstate_global->__pyx_n_s_namedtuple
+#define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new
+#define __pyx_n_s_new_event_loop __pyx_mstate_global->__pyx_n_s_new_event_loop
+#define __pyx_n_s_next_call_event __pyx_mstate_global->__pyx_n_s_next_call_event
+#define __pyx_n_s_next_call_event_locals_on_succes __pyx_mstate_global->__pyx_n_s_next_call_event_locals_on_succes
+#define __pyx_n_s_next_event __pyx_mstate_global->__pyx_n_s_next_event
+#define __pyx_n_s_next_event_locals_on_failure __pyx_mstate_global->__pyx_n_s_next_event_locals_on_failure
+#define __pyx_n_s_next_event_locals_on_success __pyx_mstate_global->__pyx_n_s_next_event_locals_on_success
+#define __pyx_n_s_no_compress __pyx_mstate_global->__pyx_n_s_no_compress
+#define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non
+#define __pyx_n_s_none __pyx_mstate_global->__pyx_n_s_none
+#define __pyx_n_s_not_found __pyx_mstate_global->__pyx_n_s_not_found
+#define __pyx_n_s_not_invoked __pyx_mstate_global->__pyx_n_s_not_invoked
+#define __pyx_n_s_not_on_client __pyx_mstate_global->__pyx_n_s_not_on_client
+#define __pyx_n_s_not_on_server __pyx_mstate_global->__pyx_n_s_not_on_server
+#define __pyx_n_s_notify_all __pyx_mstate_global->__pyx_n_s_notify_all
+#define __pyx_n_s_num_active_threads __pyx_mstate_global->__pyx_n_s_num_active_threads
+#define __pyx_n_s_object __pyx_mstate_global->__pyx_n_s_object
+#define __pyx_kp_s_object_2 __pyx_mstate_global->__pyx_kp_s_object_2
+#define __pyx_n_s_observability __pyx_mstate_global->__pyx_n_s_observability
+#define __pyx_n_s_observability_enabled __pyx_mstate_global->__pyx_n_s_observability_enabled
+#define __pyx_n_s_observability_plugin __pyx_mstate_global->__pyx_n_s_observability_plugin
+#define __pyx_kp_s_of_RPC_that_terminated_with_sta __pyx_mstate_global->__pyx_kp_s_of_RPC_that_terminated_with_sta
+#define __pyx_kp_s_of_RPC_that_terminated_with_sta_2 __pyx_mstate_global->__pyx_kp_s_of_RPC_that_terminated_with_sta_2
+#define __pyx_n_s_ok __pyx_mstate_global->__pyx_n_s_ok
+#define __pyx_n_s_on_failure __pyx_mstate_global->__pyx_n_s_on_failure
+#define __pyx_n_s_on_success __pyx_mstate_global->__pyx_n_s_on_success
+#define __pyx_n_s_op __pyx_mstate_global->__pyx_n_s_op
+#define __pyx_n_s_operate __pyx_mstate_global->__pyx_n_s_operate
+#define __pyx_n_s_operation_complete __pyx_mstate_global->__pyx_n_s_operation_complete
+#define __pyx_n_s_operations __pyx_mstate_global->__pyx_n_s_operations
+#define __pyx_n_s_operationses_and_tags __pyx_mstate_global->__pyx_n_s_operationses_and_tags
+#define __pyx_n_s_ops __pyx_mstate_global->__pyx_n_s_ops
+#define __pyx_n_s_options __pyx_mstate_global->__pyx_n_s_options
+#define __pyx_n_s_os __pyx_mstate_global->__pyx_n_s_os
+#define __pyx_n_s_out_of_range __pyx_mstate_global->__pyx_n_s_out_of_range
+#define __pyx_n_s_outbound_initial_metadata __pyx_mstate_global->__pyx_n_s_outbound_initial_metadata
+#define __pyx_n_s_outbound_ops __pyx_mstate_global->__pyx_n_s_outbound_ops
+#define __pyx_n_s_partial __pyx_mstate_global->__pyx_n_s_partial
+#define __pyx_n_s_peer __pyx_mstate_global->__pyx_n_s_peer
+#define __pyx_n_s_peer_identities __pyx_mstate_global->__pyx_n_s_peer_identities
+#define __pyx_n_s_peer_identity_key __pyx_mstate_global->__pyx_n_s_peer_identity_key
+#define __pyx_n_s_pem_key_cert_pairs __pyx_mstate_global->__pyx_n_s_pem_key_cert_pairs
+#define __pyx_n_s_pem_root_certificates __pyx_mstate_global->__pyx_n_s_pem_root_certificates
+#define __pyx_n_s_pem_root_certs __pyx_mstate_global->__pyx_n_s_pem_root_certs
+#define __pyx_n_s_permission_denied __pyx_mstate_global->__pyx_n_s_permission_denied
+#define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle
+#define __pyx_n_s_pkgutil __pyx_mstate_global->__pyx_n_s_pkgutil
+#define __pyx_n_s_plugin __pyx_mstate_global->__pyx_n_s_plugin
+#define __pyx_n_s_poll __pyx_mstate_global->__pyx_n_s_poll
+#define __pyx_n_s_poll_wrapper __pyx_mstate_global->__pyx_n_s_poll_wrapper
+#define __pyx_n_s_poller __pyx_mstate_global->__pyx_n_s_poller
+#define __pyx_n_s_pool __pyx_mstate_global->__pyx_n_s_pool
+#define __pyx_n_s_pop __pyx_mstate_global->__pyx_n_s_pop
+#define __pyx_n_s_postfork_state_to_reset __pyx_mstate_global->__pyx_n_s_postfork_state_to_reset
+#define __pyx_n_s_postfork_states_to_reset __pyx_mstate_global->__pyx_n_s_postfork_states_to_reset
+#define __pyx_n_s_prepare __pyx_mstate_global->__pyx_n_s_prepare
+#define __pyx_n_s_primary_user_agent_string __pyx_mstate_global->__pyx_n_s_primary_user_agent_string
+#define __pyx_n_s_print_exc __pyx_mstate_global->__pyx_n_s_print_exc
+#define __pyx_n_s_private_key __pyx_mstate_global->__pyx_n_s_private_key
+#define __pyx_n_s_properties __pyx_mstate_global->__pyx_n_s_properties
+#define __pyx_n_s_property __pyx_mstate_global->__pyx_n_s_property
+#define __pyx_n_s_put __pyx_mstate_global->__pyx_n_s_put
+#define __pyx_n_s_py_auth_context __pyx_mstate_global->__pyx_n_s_py_auth_context
+#define __pyx_n_s_python_call_credentials __pyx_mstate_global->__pyx_n_s_python_call_credentials
+#define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError
+#define __pyx_n_s_pyx_capi __pyx_mstate_global->__pyx_n_s_pyx_capi
+#define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum
+#define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result
+#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state
+#define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type
+#define __pyx_n_s_pyx_unpickle_AioServer __pyx_mstate_global->__pyx_n_s_pyx_unpickle_AioServer
+#define __pyx_n_s_pyx_unpickle_CensusContext __pyx_mstate_global->__pyx_n_s_pyx_unpickle_CensusContext
+#define __pyx_n_s_pyx_unpickle_ChannelCredential __pyx_mstate_global->__pyx_n_s_pyx_unpickle_ChannelCredential
+#define __pyx_n_s_pyx_unpickle_InsecureChannelCr __pyx_mstate_global->__pyx_n_s_pyx_unpickle_InsecureChannelCr
+#define __pyx_n_s_pyx_unpickle__Tag __pyx_mstate_global->__pyx_n_s_pyx_unpickle__Tag
+#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable
+#define __pyx_n_s_qualname __pyx_mstate_global->__pyx_n_s_qualname
+#define __pyx_n_s_query_call __pyx_mstate_global->__pyx_n_s_query_call
+#define __pyx_n_s_query_handler __pyx_mstate_global->__pyx_n_s_query_handler
+#define __pyx_n_s_query_handlers __pyx_mstate_global->__pyx_n_s_query_handlers
+#define __pyx_n_s_queue __pyx_mstate_global->__pyx_n_s_queue
+#define __pyx_n_s_queue_deadline __pyx_mstate_global->__pyx_n_s_queue_deadline
+#define __pyx_kp_s_queue_must_be_live __pyx_mstate_global->__pyx_kp_s_queue_must_be_live
+#define __pyx_kp_s_queue_must_be_shutting_down_to_b __pyx_mstate_global->__pyx_kp_s_queue_must_be_shutting_down_to_b
+#define __pyx_n_s_queue_shutdown __pyx_mstate_global->__pyx_n_s_queue_shutdown
+#define __pyx_n_s_queue_timeout __pyx_mstate_global->__pyx_n_s_queue_timeout
+#define __pyx_n_s_raise_if_not_valid_trailing_meta __pyx_mstate_global->__pyx_n_s_raise_if_not_valid_trailing_meta
+#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range
+#define __pyx_n_s_raw_message __pyx_mstate_global->__pyx_n_s_raw_message
+#define __pyx_n_s_read __pyx_mstate_global->__pyx_n_s_read
+#define __pyx_n_s_read_socket __pyx_mstate_global->__pyx_n_s_read_socket
+#define __pyx_n_s_ready __pyx_mstate_global->__pyx_n_s_ready
+#define __pyx_n_s_receive_close_on_server __pyx_mstate_global->__pyx_n_s_receive_close_on_server
+#define __pyx_n_s_receive_initial_metadata __pyx_mstate_global->__pyx_n_s_receive_initial_metadata
+#define __pyx_n_s_receive_initial_metadata_2 __pyx_mstate_global->__pyx_n_s_receive_initial_metadata_2
+#define __pyx_n_s_receive_initial_metadata_op __pyx_mstate_global->__pyx_n_s_receive_initial_metadata_op
+#define __pyx_n_s_receive_message __pyx_mstate_global->__pyx_n_s_receive_message
+#define __pyx_n_s_receive_message_2 __pyx_mstate_global->__pyx_n_s_receive_message_2
+#define __pyx_n_s_receive_message_op __pyx_mstate_global->__pyx_n_s_receive_message_op
+#define __pyx_n_s_receive_op __pyx_mstate_global->__pyx_n_s_receive_op
+#define __pyx_n_s_receive_serialized_message __pyx_mstate_global->__pyx_n_s_receive_serialized_message
+#define __pyx_n_s_receive_status_on_client __pyx_mstate_global->__pyx_n_s_receive_status_on_client
+#define __pyx_n_s_receive_status_on_client_op __pyx_mstate_global->__pyx_n_s_receive_status_on_client_op
+#define __pyx_n_s_received_message __pyx_mstate_global->__pyx_n_s_received_message
+#define __pyx_n_s_recv __pyx_mstate_global->__pyx_n_s_recv
+#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce
+#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython
+#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex
+#define __pyx_n_s_register __pyx_mstate_global->__pyx_n_s_register
+#define __pyx_n_s_register_at_fork __pyx_mstate_global->__pyx_n_s_register_at_fork
+#define __pyx_n_s_register_completion_queue __pyx_mstate_global->__pyx_n_s_register_completion_queue
+#define __pyx_n_s_registered_call_handle __pyx_mstate_global->__pyx_n_s_registered_call_handle
+#define __pyx_n_s_remove_reader __pyx_mstate_global->__pyx_n_s_remove_reader
+#define __pyx_n_s_repr __pyx_mstate_global->__pyx_n_s_repr
+#define __pyx_n_s_repr_2 __pyx_mstate_global->__pyx_n_s_repr_2
+#define __pyx_n_s_request __pyx_mstate_global->__pyx_n_s_request
+#define __pyx_n_s_request_call __pyx_mstate_global->__pyx_n_s_request_call
+#define __pyx_n_s_request_call_2 __pyx_mstate_global->__pyx_n_s_request_call_2
+#define __pyx_n_s_request_call_tag __pyx_mstate_global->__pyx_n_s_request_call_tag
+#define __pyx_n_s_request_deserializer __pyx_mstate_global->__pyx_n_s_request_deserializer
+#define __pyx_n_s_request_iterator __pyx_mstate_global->__pyx_n_s_request_iterator
+#define __pyx_n_s_request_message __pyx_mstate_global->__pyx_n_s_request_message
+#define __pyx_n_s_request_raw __pyx_mstate_global->__pyx_n_s_request_raw
+#define __pyx_n_s_request_streaming __pyx_mstate_global->__pyx_n_s_request_streaming
+#define __pyx_n_s_reset_grpc_config_vars __pyx_mstate_global->__pyx_n_s_reset_grpc_config_vars
+#define __pyx_n_s_reset_postfork_child __pyx_mstate_global->__pyx_n_s_reset_postfork_child
+#define __pyx_n_s_resource_exhausted __pyx_mstate_global->__pyx_n_s_resource_exhausted
+#define __pyx_n_s_response __pyx_mstate_global->__pyx_n_s_response
+#define __pyx_n_s_response_message __pyx_mstate_global->__pyx_n_s_response_message
+#define __pyx_n_s_response_raw __pyx_mstate_global->__pyx_n_s_response_raw
+#define __pyx_n_s_response_serializer __pyx_mstate_global->__pyx_n_s_response_serializer
+#define __pyx_n_s_response_streaming __pyx_mstate_global->__pyx_n_s_response_streaming
+#define __pyx_n_s_result __pyx_mstate_global->__pyx_n_s_result
+#define __pyx_n_s_retain_self __pyx_mstate_global->__pyx_n_s_retain_self
+#define __pyx_n_s_return __pyx_mstate_global->__pyx_n_s_return
+#define __pyx_n_s_return_from_user_request_generat __pyx_mstate_global->__pyx_n_s_return_from_user_request_generat
+#define __pyx_n_s_rpc_coro __pyx_mstate_global->__pyx_n_s_rpc_coro
+#define __pyx_n_s_rpc_state __pyx_mstate_global->__pyx_n_s_rpc_state
+#define __pyx_n_s_rpc_task __pyx_mstate_global->__pyx_n_s_rpc_task
+#define __pyx_n_s_run __pyx_mstate_global->__pyx_n_s_run
+#define __pyx_n_s_run_2 __pyx_mstate_global->__pyx_n_s_run_2
+#define __pyx_n_s_run_coroutine_threadsafe __pyx_mstate_global->__pyx_n_s_run_coroutine_threadsafe
+#define __pyx_n_s_run_in_executor __pyx_mstate_global->__pyx_n_s_run_in_executor
+#define __pyx_n_s_run_interceptor __pyx_mstate_global->__pyx_n_s_run_interceptor
+#define __pyx_n_s_run_spawn_greenlets __pyx_mstate_global->__pyx_n_s_run_spawn_greenlets
+#define __pyx_n_s_run_with_context __pyx_mstate_global->__pyx_n_s_run_with_context
+#define __pyx_n_s_run_with_context_locals__run __pyx_mstate_global->__pyx_n_s_run_with_context_locals__run
+#define __pyx_n_s_runtime_error __pyx_mstate_global->__pyx_n_s_runtime_error
+#define __pyx_n_s_save_trace_context __pyx_mstate_global->__pyx_n_s_save_trace_context
+#define __pyx_n_s_schedule_coro_threadsafe __pyx_mstate_global->__pyx_n_s_schedule_coro_threadsafe
+#define __pyx_n_s_schedule_rpc_coro __pyx_mstate_global->__pyx_n_s_schedule_rpc_coro
+#define __pyx_n_s_secondary_user_agent_string __pyx_mstate_global->__pyx_n_s_secondary_user_agent_string
+#define __pyx_n_s_segregated_call __pyx_mstate_global->__pyx_n_s_segregated_call
+#define __pyx_n_s_segregated_call_locals_on_succe __pyx_mstate_global->__pyx_n_s_segregated_call_locals_on_succe
+#define __pyx_n_s_self __pyx_mstate_global->__pyx_n_s_self
+#define __pyx_kp_s_self__cq_cannot_be_converted_to __pyx_mstate_global->__pyx_kp_s_self__cq_cannot_be_converted_to
+#define __pyx_kp_s_self_arg_cannot_be_converted_to __pyx_mstate_global->__pyx_kp_s_self_arg_cannot_be_converted_to
+#define __pyx_kp_s_self_c_argument_cannot_be_conver __pyx_mstate_global->__pyx_kp_s_self_c_argument_cannot_be_conver
+#define __pyx_kp_s_self_c_credentials_cannot_be_con __pyx_mstate_global->__pyx_kp_s_self_c_credentials_cannot_be_con
+#define __pyx_kp_s_self_c_op_cannot_be_converted_to __pyx_mstate_global->__pyx_kp_s_self_c_op_cannot_be_converted_to
+#define __pyx_n_s_send __pyx_mstate_global->__pyx_n_s_send
+#define __pyx_n_s_send_close_from_client __pyx_mstate_global->__pyx_n_s_send_close_from_client
+#define __pyx_n_s_send_close_op __pyx_mstate_global->__pyx_n_s_send_close_op
+#define __pyx_n_s_send_error_status_from_server __pyx_mstate_global->__pyx_n_s_send_error_status_from_server
+#define __pyx_n_s_send_initial_metadata __pyx_mstate_global->__pyx_n_s_send_initial_metadata
+#define __pyx_n_s_send_initial_metadata_2 __pyx_mstate_global->__pyx_n_s_send_initial_metadata_2
+#define __pyx_n_s_send_initial_metadata_op __pyx_mstate_global->__pyx_n_s_send_initial_metadata_op
+#define __pyx_n_s_send_message __pyx_mstate_global->__pyx_n_s_send_message
+#define __pyx_n_s_send_message_2 __pyx_mstate_global->__pyx_n_s_send_message_2
+#define __pyx_n_s_send_message_op __pyx_mstate_global->__pyx_n_s_send_message_op
+#define __pyx_n_s_send_receive_close __pyx_mstate_global->__pyx_n_s_send_receive_close
+#define __pyx_n_s_send_serialized_message __pyx_mstate_global->__pyx_n_s_send_serialized_message
+#define __pyx_n_s_send_status_from_server __pyx_mstate_global->__pyx_n_s_send_status_from_server
+#define __pyx_n_s_server __pyx_mstate_global->__pyx_n_s_server
+#define __pyx_n_s_server_call_tracer __pyx_mstate_global->__pyx_n_s_server_call_tracer
+#define __pyx_n_s_server_certificate_config_ssl __pyx_mstate_global->__pyx_n_s_server_certificate_config_ssl
+#define __pyx_n_s_server_credentials __pyx_mstate_global->__pyx_n_s_server_credentials
+#define __pyx_n_s_server_credentials_alts __pyx_mstate_global->__pyx_n_s_server_credentials_alts
+#define __pyx_n_s_server_credentials_local __pyx_mstate_global->__pyx_n_s_server_credentials_local
+#define __pyx_n_s_server_credentials_ssl __pyx_mstate_global->__pyx_n_s_server_credentials_ssl
+#define __pyx_n_s_server_credentials_ssl_dynamic_c __pyx_mstate_global->__pyx_n_s_server_credentials_ssl_dynamic_c
+#define __pyx_n_s_server_id __pyx_mstate_global->__pyx_n_s_server_id
+#define __pyx_n_s_server_main_loop __pyx_mstate_global->__pyx_n_s_server_main_loop
+#define __pyx_kp_s_server_must_be_started_and_not_s __pyx_mstate_global->__pyx_kp_s_server_must_be_started_and_not_s
+#define __pyx_n_s_server_queue __pyx_mstate_global->__pyx_n_s_server_queue
+#define __pyx_kp_s_server_queue_must_be_a_registere __pyx_mstate_global->__pyx_kp_s_server_queue_must_be_a_registere
+#define __pyx_n_s_server_started __pyx_mstate_global->__pyx_n_s_server_started
+#define __pyx_n_s_service __pyx_mstate_global->__pyx_n_s_service
+#define __pyx_n_s_service_accounts __pyx_mstate_global->__pyx_n_s_service_accounts
+#define __pyx_n_s_servicer_context __pyx_mstate_global->__pyx_n_s_servicer_context
+#define __pyx_n_s_serving_task_crash_handler __pyx_mstate_global->__pyx_n_s_serving_task_crash_handler
+#define __pyx_n_s_setDaemon __pyx_mstate_global->__pyx_n_s_setDaemon
+#define __pyx_n_s_set_async_callback_func __pyx_mstate_global->__pyx_n_s_set_async_callback_func
+#define __pyx_n_s_set_census_context_on_call __pyx_mstate_global->__pyx_n_s_set_census_context_on_call
+#define __pyx_n_s_set_code __pyx_mstate_global->__pyx_n_s_set_code
+#define __pyx_n_s_set_compression __pyx_mstate_global->__pyx_n_s_set_compression
+#define __pyx_n_s_set_credentials __pyx_mstate_global->__pyx_n_s_set_credentials
+#define __pyx_n_s_set_details __pyx_mstate_global->__pyx_n_s_set_details
+#define __pyx_n_s_set_exception __pyx_mstate_global->__pyx_n_s_set_exception
+#define __pyx_n_s_set_instrumentation_context_on_c __pyx_mstate_global->__pyx_n_s_set_instrumentation_context_on_c
+#define __pyx_n_s_set_internal_error __pyx_mstate_global->__pyx_n_s_set_internal_error
+#define __pyx_n_s_set_name __pyx_mstate_global->__pyx_n_s_set_name
+#define __pyx_n_s_set_result __pyx_mstate_global->__pyx_n_s_set_result
+#define __pyx_n_s_set_server_call_tracer_factory __pyx_mstate_global->__pyx_n_s_set_server_call_tracer_factory
+#define __pyx_n_s_set_trailing_metadata __pyx_mstate_global->__pyx_n_s_set_trailing_metadata
+#define __pyx_n_s_setblocking __pyx_mstate_global->__pyx_n_s_setblocking
+#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate
+#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython
+#define __pyx_n_s_shield __pyx_mstate_global->__pyx_n_s_shield
+#define __pyx_n_s_shutdown __pyx_mstate_global->__pyx_n_s_shutdown
+#define __pyx_n_s_shutdown_await_next_greenlet __pyx_mstate_global->__pyx_n_s_shutdown_await_next_greenlet
+#define __pyx_n_s_shutdown_cq __pyx_mstate_global->__pyx_n_s_shutdown_cq
+#define __pyx_n_s_shutdown_grpc_aio __pyx_mstate_global->__pyx_n_s_shutdown_grpc_aio
+#define __pyx_n_s_shutting_down_server __pyx_mstate_global->__pyx_n_s_shutting_down_server
+#define __pyx_n_s_simplefilter __pyx_mstate_global->__pyx_n_s_simplefilter
+#define __pyx_n_s_sleep __pyx_mstate_global->__pyx_n_s_sleep
+#define __pyx_n_s_socket __pyx_mstate_global->__pyx_n_s_socket
+#define __pyx_n_s_socket_id __pyx_mstate_global->__pyx_n_s_socket_id
+#define __pyx_n_s_socketpair __pyx_mstate_global->__pyx_n_s_socketpair
+#define __pyx_n_s_span_id __pyx_mstate_global->__pyx_n_s_span_id
+#define __pyx_n_s_spawn __pyx_mstate_global->__pyx_n_s_spawn
+#define __pyx_n_s_spawn_callback_async __pyx_mstate_global->__pyx_n_s_spawn_callback_async
+#define __pyx_n_s_spawn_callback_in_thread __pyx_mstate_global->__pyx_n_s_spawn_callback_in_thread
+#define __pyx_n_s_spawn_greenlets __pyx_mstate_global->__pyx_n_s_spawn_greenlets
+#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec
+#define __pyx_kp_s_src_python_grpcio_grpc__cython __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_10 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_10
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_11 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_11
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_12 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_12
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_13 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_13
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_14 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_14
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_15 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_15
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_16 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_16
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_17 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_17
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_18 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_18
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_19 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_19
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_2 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_2
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_20 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_20
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_21 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_21
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_22 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_22
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_23 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_23
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_3 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_3
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_4 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_4
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_5 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_5
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_6 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_6
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_7 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_7
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_8 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_8
+#define __pyx_kp_s_src_python_grpcio_grpc__cython_9 __pyx_mstate_global->__pyx_kp_s_src_python_grpcio_grpc__cython_9
+#define __pyx_n_s_ssl_session_cache __pyx_mstate_global->__pyx_n_s_ssl_session_cache
+#define __pyx_n_s_ssl_target_name_override __pyx_mstate_global->__pyx_n_s_ssl_target_name_override
+#define __pyx_n_s_start __pyx_mstate_global->__pyx_n_s_start
+#define __pyx_n_s_start_batch __pyx_mstate_global->__pyx_n_s_start_batch
+#define __pyx_n_s_start_channel_id __pyx_mstate_global->__pyx_n_s_start_channel_id
+#define __pyx_n_s_start_client_batch __pyx_mstate_global->__pyx_n_s_start_client_batch
+#define __pyx_n_s_start_server_batch __pyx_mstate_global->__pyx_n_s_start_server_batch
+#define __pyx_n_s_start_server_id __pyx_mstate_global->__pyx_n_s_start_server_id
+#define __pyx_n_s_start_shutting_down __pyx_mstate_global->__pyx_n_s_start_shutting_down
+#define __pyx_n_s_start_socket_id __pyx_mstate_global->__pyx_n_s_start_socket_id
+#define __pyx_n_s_started_tag __pyx_mstate_global->__pyx_n_s_started_tag
+#define __pyx_n_s_started_tags __pyx_mstate_global->__pyx_n_s_started_tags
+#define __pyx_n_s_state __pyx_mstate_global->__pyx_n_s_state
+#define __pyx_n_s_status __pyx_mstate_global->__pyx_n_s_status
+#define __pyx_n_s_status_code __pyx_mstate_global->__pyx_n_s_status_code
+#define __pyx_n_s_status_task __pyx_mstate_global->__pyx_n_s_status_task
+#define __pyx_n_s_stored_ctx __pyx_mstate_global->__pyx_n_s_stored_ctx
+#define __pyx_n_s_str __pyx_mstate_global->__pyx_n_s_str
+#define __pyx_n_s_str_2 __pyx_mstate_global->__pyx_n_s_str_2
+#define __pyx_n_s_stream_handler __pyx_mstate_global->__pyx_n_s_stream_handler
+#define __pyx_n_s_stream_stream __pyx_mstate_global->__pyx_n_s_stream_stream
+#define __pyx_n_s_stream_unary __pyx_mstate_global->__pyx_n_s_stream_unary
+#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource
+#define __pyx_n_s_subchannel_id __pyx_mstate_global->__pyx_n_s_subchannel_id
+#define __pyx_n_s_success __pyx_mstate_global->__pyx_n_s_success
+#define __pyx_n_s_super __pyx_mstate_global->__pyx_n_s_super
+#define __pyx_n_s_sync_servicer_context __pyx_mstate_global->__pyx_n_s_sync_servicer_context
+#define __pyx_n_s_sys __pyx_mstate_global->__pyx_n_s_sys
+#define __pyx_n_s_t __pyx_mstate_global->__pyx_n_s_t
+#define __pyx_n_s_tag __pyx_mstate_global->__pyx_n_s_tag
+#define __pyx_n_s_target __pyx_mstate_global->__pyx_n_s_target
+#define __pyx_n_s_task __pyx_mstate_global->__pyx_n_s_task
+#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test
+#define __pyx_kp_s_the_server_has_already_started __pyx_mstate_global->__pyx_kp_s_the_server_has_already_started
+#define __pyx_kp_s_the_server_hasn_t_started_yet __pyx_mstate_global->__pyx_kp_s_the_server_hasn_t_started_yet
+#define __pyx_kp_s_the_server_must_be_shutting_down __pyx_mstate_global->__pyx_kp_s_the_server_must_be_shutting_down
+#define __pyx_n_s_thread __pyx_mstate_global->__pyx_n_s_thread
+#define __pyx_n_s_thread_pool __pyx_mstate_global->__pyx_n_s_thread_pool
+#define __pyx_n_s_threading __pyx_mstate_global->__pyx_n_s_threading
+#define __pyx_n_s_threadpool __pyx_mstate_global->__pyx_n_s_threadpool
+#define __pyx_n_s_throw __pyx_mstate_global->__pyx_n_s_throw
+#define __pyx_n_s_time __pyx_mstate_global->__pyx_n_s_time
+#define __pyx_n_s_time_remaining __pyx_mstate_global->__pyx_n_s_time_remaining
+#define __pyx_n_s_timeout __pyx_mstate_global->__pyx_n_s_timeout
+#define __pyx_n_s_timeout_secs __pyx_mstate_global->__pyx_n_s_timeout_secs
+#define __pyx_n_s_to_call __pyx_mstate_global->__pyx_n_s_to_call
+#define __pyx_n_s_to_channel_arg __pyx_mstate_global->__pyx_n_s_to_channel_arg
+#define __pyx_n_s_too_many_operations __pyx_mstate_global->__pyx_n_s_too_many_operations
+#define __pyx_n_s_trace_id __pyx_mstate_global->__pyx_n_s_trace_id
+#define __pyx_n_s_traceback __pyx_mstate_global->__pyx_n_s_traceback
+#define __pyx_n_s_tracing_enabled __pyx_mstate_global->__pyx_n_s_tracing_enabled
+#define __pyx_n_s_trailing_metadata __pyx_mstate_global->__pyx_n_s_trailing_metadata
+#define __pyx_n_s_transient_failure __pyx_mstate_global->__pyx_n_s_transient_failure
+#define __pyx_n_s_true __pyx_mstate_global->__pyx_n_s_true
+#define __pyx_n_s_try_to_connect __pyx_mstate_global->__pyx_n_s_try_to_connect
+#define __pyx_n_s_type __pyx_mstate_global->__pyx_n_s_type
+#define __pyx_n_s_typing __pyx_mstate_global->__pyx_n_s_typing
+#define __pyx_n_s_uds __pyx_mstate_global->__pyx_n_s_uds
+#define __pyx_n_s_unary_handler __pyx_mstate_global->__pyx_n_s_unary_handler
+#define __pyx_n_s_unary_stream __pyx_mstate_global->__pyx_n_s_unary_stream
+#define __pyx_n_s_unary_unary __pyx_mstate_global->__pyx_n_s_unary_unary
+#define __pyx_n_s_unauthenticated __pyx_mstate_global->__pyx_n_s_unauthenticated
+#define __pyx_n_s_unavailable __pyx_mstate_global->__pyx_n_s_unavailable
+#define __pyx_n_s_unimplemented __pyx_mstate_global->__pyx_n_s_unimplemented
+#define __pyx_n_s_uninstall_context __pyx_mstate_global->__pyx_n_s_uninstall_context
+#define __pyx_n_s_unknown __pyx_mstate_global->__pyx_n_s_unknown
+#define __pyx_n_s_unused_future __pyx_mstate_global->__pyx_n_s_unused_future
+#define __pyx_n_s_unused_task __pyx_mstate_global->__pyx_n_s_unused_task
+#define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update
+#define __pyx_n_s_upper __pyx_mstate_global->__pyx_n_s_upper
+#define __pyx_n_s_use_setstate __pyx_mstate_global->__pyx_n_s_use_setstate
+#define __pyx_n_s_used_mask __pyx_mstate_global->__pyx_n_s_used_mask
+#define __pyx_n_s_user_tag __pyx_mstate_global->__pyx_n_s_user_tag
+#define __pyx_n_s_utf8 __pyx_mstate_global->__pyx_n_s_utf8
+#define __pyx_kp_s_utf_8 __pyx_mstate_global->__pyx_kp_s_utf_8
+#define __pyx_n_s_value __pyx_mstate_global->__pyx_n_s_value
+#define __pyx_n_s_values __pyx_mstate_global->__pyx_n_s_values
+#define __pyx_n_s_wait __pyx_mstate_global->__pyx_n_s_wait
+#define __pyx_n_s_wait_for __pyx_mstate_global->__pyx_n_s_wait_for
+#define __pyx_n_s_wait_for_ready __pyx_mstate_global->__pyx_n_s_wait_for_ready
+#define __pyx_n_s_wait_for_ready_explicitly_set __pyx_mstate_global->__pyx_n_s_wait_for_ready_explicitly_set
+#define __pyx_n_s_wait_for_termination __pyx_mstate_global->__pyx_n_s_wait_for_termination
+#define __pyx_n_s_wait_time __pyx_mstate_global->__pyx_n_s_wait_time
+#define __pyx_n_s_warning __pyx_mstate_global->__pyx_n_s_warning
+#define __pyx_n_s_warnings __pyx_mstate_global->__pyx_n_s_warnings
+#define __pyx_n_s_watch_connectivity_state __pyx_mstate_global->__pyx_n_s_watch_connectivity_state
+#define __pyx_n_s_wrap __pyx_mstate_global->__pyx_n_s_wrap
+#define __pyx_n_s_wrapper __pyx_mstate_global->__pyx_n_s_wrapper
+#define __pyx_n_s_write __pyx_mstate_global->__pyx_n_s_write
+#define __pyx_n_s_write_flag __pyx_mstate_global->__pyx_n_s_write_flag
+#define __pyx_n_s_xds __pyx_mstate_global->__pyx_n_s_xds
+#define __pyx_n_s_xds_server_credentials __pyx_mstate_global->__pyx_n_s_xds_server_credentials
+#define __pyx_n_s_yes __pyx_mstate_global->__pyx_n_s_yes
+#define __pyx_n_s_yield_to_queue __pyx_mstate_global->__pyx_n_s_yield_to_queue
+#define __pyx_float_1_0 __pyx_mstate_global->__pyx_float_1_0
+#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0
+#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1
+#define __pyx_int_5 __pyx_mstate_global->__pyx_int_5
+#define __pyx_int_118587260 __pyx_mstate_global->__pyx_int_118587260
+#define __pyx_int_171381981 __pyx_mstate_global->__pyx_int_171381981
+#define __pyx_int_171651213 __pyx_mstate_global->__pyx_int_171651213
+#define __pyx_int_222419149 __pyx_mstate_global->__pyx_int_222419149
+#define __pyx_int_228825662 __pyx_mstate_global->__pyx_int_228825662
+#define __pyx_int_238750788 __pyx_mstate_global->__pyx_int_238750788
+#define __pyx_k__9 __pyx_mstate_global->__pyx_k__9
+#define __pyx_k__76 __pyx_mstate_global->__pyx_k__76
+#define __pyx_k__80 __pyx_mstate_global->__pyx_k__80
+#define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_
+#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4
+#define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8
+#define __pyx_slice__37 __pyx_mstate_global->__pyx_slice__37
+#define __pyx_tuple__10 __pyx_mstate_global->__pyx_tuple__10
+#define __pyx_tuple__11 __pyx_mstate_global->__pyx_tuple__11
+#define __pyx_tuple__12 __pyx_mstate_global->__pyx_tuple__12
+#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14
+#define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17
+#define __pyx_tuple__19 __pyx_mstate_global->__pyx_tuple__19
+#define __pyx_tuple__21 __pyx_mstate_global->__pyx_tuple__21
+#define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23
+#define __pyx_tuple__24 __pyx_mstate_global->__pyx_tuple__24
+#define __pyx_tuple__25 __pyx_mstate_global->__pyx_tuple__25
+#define __pyx_tuple__26 __pyx_mstate_global->__pyx_tuple__26
+#define __pyx_tuple__27 __pyx_mstate_global->__pyx_tuple__27
+#define __pyx_tuple__28 __pyx_mstate_global->__pyx_tuple__28
+#define __pyx_tuple__29 __pyx_mstate_global->__pyx_tuple__29
+#define __pyx_tuple__30 __pyx_mstate_global->__pyx_tuple__30
+#define __pyx_tuple__31 __pyx_mstate_global->__pyx_tuple__31
+#define __pyx_tuple__32 __pyx_mstate_global->__pyx_tuple__32
+#define __pyx_tuple__33 __pyx_mstate_global->__pyx_tuple__33
+#define __pyx_tuple__34 __pyx_mstate_global->__pyx_tuple__34
+#define __pyx_tuple__35 __pyx_mstate_global->__pyx_tuple__35
+#define __pyx_tuple__36 __pyx_mstate_global->__pyx_tuple__36
+#define __pyx_tuple__39 __pyx_mstate_global->__pyx_tuple__39
+#define __pyx_tuple__40 __pyx_mstate_global->__pyx_tuple__40
+#define __pyx_tuple__46 __pyx_mstate_global->__pyx_tuple__46
+#define __pyx_tuple__48 __pyx_mstate_global->__pyx_tuple__48
+#define __pyx_tuple__50 __pyx_mstate_global->__pyx_tuple__50
+#define __pyx_tuple__79 __pyx_mstate_global->__pyx_tuple__79
+#define __pyx_tuple__83 __pyx_mstate_global->__pyx_tuple__83
+#define __pyx_tuple__93 __pyx_mstate_global->__pyx_tuple__93
+#define __pyx_tuple__98 __pyx_mstate_global->__pyx_tuple__98
+#define __pyx_codeobj__2 __pyx_mstate_global->__pyx_codeobj__2
+#define __pyx_codeobj__3 __pyx_mstate_global->__pyx_codeobj__3
+#define __pyx_codeobj__5 __pyx_mstate_global->__pyx_codeobj__5
+#define __pyx_codeobj__6 __pyx_mstate_global->__pyx_codeobj__6
+#define __pyx_tuple__105 __pyx_mstate_global->__pyx_tuple__105
+#define __pyx_tuple__106 __pyx_mstate_global->__pyx_tuple__106
+#define __pyx_tuple__108 __pyx_mstate_global->__pyx_tuple__108
+#define __pyx_tuple__110 __pyx_mstate_global->__pyx_tuple__110
+#define __pyx_tuple__116 __pyx_mstate_global->__pyx_tuple__116
+#define __pyx_tuple__118 __pyx_mstate_global->__pyx_tuple__118
+#define __pyx_tuple__121 __pyx_mstate_global->__pyx_tuple__121
+#define __pyx_tuple__123 __pyx_mstate_global->__pyx_tuple__123
+#define __pyx_tuple__125 __pyx_mstate_global->__pyx_tuple__125
+#define __pyx_tuple__127 __pyx_mstate_global->__pyx_tuple__127
+#define __pyx_tuple__138 __pyx_mstate_global->__pyx_tuple__138
+#define __pyx_tuple__144 __pyx_mstate_global->__pyx_tuple__144
+#define __pyx_tuple__148 __pyx_mstate_global->__pyx_tuple__148
+#define __pyx_tuple__150 __pyx_mstate_global->__pyx_tuple__150
+#define __pyx_tuple__152 __pyx_mstate_global->__pyx_tuple__152
+#define __pyx_tuple__153 __pyx_mstate_global->__pyx_tuple__153
+#define __pyx_tuple__156 __pyx_mstate_global->__pyx_tuple__156
+#define __pyx_tuple__158 __pyx_mstate_global->__pyx_tuple__158
+#define __pyx_tuple__162 __pyx_mstate_global->__pyx_tuple__162
+#define __pyx_tuple__166 __pyx_mstate_global->__pyx_tuple__166
+#define __pyx_tuple__168 __pyx_mstate_global->__pyx_tuple__168
+#define __pyx_tuple__170 __pyx_mstate_global->__pyx_tuple__170
+#define __pyx_tuple__172 __pyx_mstate_global->__pyx_tuple__172
+#define __pyx_tuple__174 __pyx_mstate_global->__pyx_tuple__174
+#define __pyx_tuple__176 __pyx_mstate_global->__pyx_tuple__176
+#define __pyx_tuple__178 __pyx_mstate_global->__pyx_tuple__178
+#define __pyx_tuple__180 __pyx_mstate_global->__pyx_tuple__180
+#define __pyx_tuple__182 __pyx_mstate_global->__pyx_tuple__182
+#define __pyx_tuple__184 __pyx_mstate_global->__pyx_tuple__184
+#define __pyx_tuple__186 __pyx_mstate_global->__pyx_tuple__186
+#define __pyx_tuple__194 __pyx_mstate_global->__pyx_tuple__194
+#define __pyx_tuple__209 __pyx_mstate_global->__pyx_tuple__209
+#define __pyx_tuple__211 __pyx_mstate_global->__pyx_tuple__211
+#define __pyx_tuple__213 __pyx_mstate_global->__pyx_tuple__213
+#define __pyx_tuple__217 __pyx_mstate_global->__pyx_tuple__217
+#define __pyx_tuple__222 __pyx_mstate_global->__pyx_tuple__222
+#define __pyx_tuple__224 __pyx_mstate_global->__pyx_tuple__224
+#define __pyx_tuple__226 __pyx_mstate_global->__pyx_tuple__226
+#define __pyx_tuple__230 __pyx_mstate_global->__pyx_tuple__230
+#define __pyx_tuple__232 __pyx_mstate_global->__pyx_tuple__232
+#define __pyx_tuple__236 __pyx_mstate_global->__pyx_tuple__236
+#define __pyx_tuple__238 __pyx_mstate_global->__pyx_tuple__238
+#define __pyx_tuple__241 __pyx_mstate_global->__pyx_tuple__241
+#define __pyx_tuple__254 __pyx_mstate_global->__pyx_tuple__254
+#define __pyx_tuple__255 __pyx_mstate_global->__pyx_tuple__255
+#define __pyx_tuple__293 __pyx_mstate_global->__pyx_tuple__293
+#define __pyx_tuple__296 __pyx_mstate_global->__pyx_tuple__296
+#define __pyx_tuple__301 __pyx_mstate_global->__pyx_tuple__301
+#define __pyx_tuple__304 __pyx_mstate_global->__pyx_tuple__304
+#define __pyx_tuple__306 __pyx_mstate_global->__pyx_tuple__306
+#define __pyx_tuple__308 __pyx_mstate_global->__pyx_tuple__308
+#define __pyx_tuple__310 __pyx_mstate_global->__pyx_tuple__310
+#define __pyx_tuple__312 __pyx_mstate_global->__pyx_tuple__312
+#define __pyx_tuple__314 __pyx_mstate_global->__pyx_tuple__314
+#define __pyx_tuple__316 __pyx_mstate_global->__pyx_tuple__316
+#define __pyx_tuple__317 __pyx_mstate_global->__pyx_tuple__317
+#define __pyx_tuple__319 __pyx_mstate_global->__pyx_tuple__319
+#define __pyx_tuple__335 __pyx_mstate_global->__pyx_tuple__335
+#define __pyx_tuple__342 __pyx_mstate_global->__pyx_tuple__342
+#define __pyx_tuple__346 __pyx_mstate_global->__pyx_tuple__346
+#define __pyx_tuple__349 __pyx_mstate_global->__pyx_tuple__349
+#define __pyx_tuple__353 __pyx_mstate_global->__pyx_tuple__353
+#define __pyx_tuple__356 __pyx_mstate_global->__pyx_tuple__356
+#define __pyx_tuple__358 __pyx_mstate_global->__pyx_tuple__358
+#define __pyx_tuple__360 __pyx_mstate_global->__pyx_tuple__360
+#define __pyx_tuple__362 __pyx_mstate_global->__pyx_tuple__362
+#define __pyx_tuple__364 __pyx_mstate_global->__pyx_tuple__364
+#define __pyx_tuple__366 __pyx_mstate_global->__pyx_tuple__366
+#define __pyx_tuple__368 __pyx_mstate_global->__pyx_tuple__368
+#define __pyx_tuple__370 __pyx_mstate_global->__pyx_tuple__370
+#define __pyx_tuple__371 __pyx_mstate_global->__pyx_tuple__371
+#define __pyx_tuple__372 __pyx_mstate_global->__pyx_tuple__372
+#define __pyx_tuple__374 __pyx_mstate_global->__pyx_tuple__374
+#define __pyx_tuple__375 __pyx_mstate_global->__pyx_tuple__375
+#define __pyx_tuple__379 __pyx_mstate_global->__pyx_tuple__379
+#define __pyx_tuple__385 __pyx_mstate_global->__pyx_tuple__385
+#define __pyx_tuple__388 __pyx_mstate_global->__pyx_tuple__388
+#define __pyx_tuple__389 __pyx_mstate_global->__pyx_tuple__389
+#define __pyx_tuple__393 __pyx_mstate_global->__pyx_tuple__393
+#define __pyx_tuple__395 __pyx_mstate_global->__pyx_tuple__395
+#define __pyx_tuple__396 __pyx_mstate_global->__pyx_tuple__396
+#define __pyx_tuple__403 __pyx_mstate_global->__pyx_tuple__403
+#define __pyx_tuple__405 __pyx_mstate_global->__pyx_tuple__405
+#define __pyx_tuple__406 __pyx_mstate_global->__pyx_tuple__406
+#define __pyx_tuple__409 __pyx_mstate_global->__pyx_tuple__409
+#define __pyx_tuple__417 __pyx_mstate_global->__pyx_tuple__417
+#define __pyx_tuple__424 __pyx_mstate_global->__pyx_tuple__424
+#define __pyx_tuple__427 __pyx_mstate_global->__pyx_tuple__427
+#define __pyx_tuple__435 __pyx_mstate_global->__pyx_tuple__435
+#define __pyx_tuple__436 __pyx_mstate_global->__pyx_tuple__436
+#define __pyx_tuple__437 __pyx_mstate_global->__pyx_tuple__437
+#define __pyx_tuple__438 __pyx_mstate_global->__pyx_tuple__438
+#define __pyx_tuple__439 __pyx_mstate_global->__pyx_tuple__439
+#define __pyx_tuple__440 __pyx_mstate_global->__pyx_tuple__440
+#define __pyx_tuple__441 __pyx_mstate_global->__pyx_tuple__441
+#define __pyx_tuple__444 __pyx_mstate_global->__pyx_tuple__444
+#define __pyx_tuple__448 __pyx_mstate_global->__pyx_tuple__448
+#define __pyx_tuple__450 __pyx_mstate_global->__pyx_tuple__450
+#define __pyx_tuple__453 __pyx_mstate_global->__pyx_tuple__453
+#define __pyx_tuple__457 __pyx_mstate_global->__pyx_tuple__457
+#define __pyx_tuple__460 __pyx_mstate_global->__pyx_tuple__460
+#define __pyx_tuple__462 __pyx_mstate_global->__pyx_tuple__462
+#define __pyx_tuple__463 __pyx_mstate_global->__pyx_tuple__463
+#define __pyx_tuple__464 __pyx_mstate_global->__pyx_tuple__464
+#define __pyx_tuple__465 __pyx_mstate_global->__pyx_tuple__465
+#define __pyx_tuple__466 __pyx_mstate_global->__pyx_tuple__466
+#define __pyx_tuple__467 __pyx_mstate_global->__pyx_tuple__467
+#define __pyx_tuple__468 __pyx_mstate_global->__pyx_tuple__468
+#define __pyx_tuple__472 __pyx_mstate_global->__pyx_tuple__472
+#define __pyx_tuple__476 __pyx_mstate_global->__pyx_tuple__476
+#define __pyx_tuple__484 __pyx_mstate_global->__pyx_tuple__484
+#define __pyx_tuple__485 __pyx_mstate_global->__pyx_tuple__485
+#define __pyx_tuple__486 __pyx_mstate_global->__pyx_tuple__486
+#define __pyx_tuple__487 __pyx_mstate_global->__pyx_tuple__487
+#define __pyx_tuple__491 __pyx_mstate_global->__pyx_tuple__491
+#define __pyx_tuple__494 __pyx_mstate_global->__pyx_tuple__494
+#define __pyx_tuple__497 __pyx_mstate_global->__pyx_tuple__497
+#define __pyx_tuple__500 __pyx_mstate_global->__pyx_tuple__500
+#define __pyx_tuple__502 __pyx_mstate_global->__pyx_tuple__502
+#define __pyx_tuple__504 __pyx_mstate_global->__pyx_tuple__504
+#define __pyx_tuple__506 __pyx_mstate_global->__pyx_tuple__506
+#define __pyx_tuple__509 __pyx_mstate_global->__pyx_tuple__509
+#define __pyx_tuple__515 __pyx_mstate_global->__pyx_tuple__515
+#define __pyx_tuple__517 __pyx_mstate_global->__pyx_tuple__517
+#define __pyx_tuple__533 __pyx_mstate_global->__pyx_tuple__533
+#define __pyx_tuple__534 __pyx_mstate_global->__pyx_tuple__534
+#define __pyx_tuple__536 __pyx_mstate_global->__pyx_tuple__536
+#define __pyx_tuple__537 __pyx_mstate_global->__pyx_tuple__537
+#define __pyx_tuple__538 __pyx_mstate_global->__pyx_tuple__538
+#define __pyx_tuple__539 __pyx_mstate_global->__pyx_tuple__539
+#define __pyx_tuple__542 __pyx_mstate_global->__pyx_tuple__542
+#define __pyx_tuple__543 __pyx_mstate_global->__pyx_tuple__543
+#define __pyx_tuple__544 __pyx_mstate_global->__pyx_tuple__544
+#define __pyx_tuple__545 __pyx_mstate_global->__pyx_tuple__545
+#define __pyx_tuple__546 __pyx_mstate_global->__pyx_tuple__546
+#define __pyx_tuple__548 __pyx_mstate_global->__pyx_tuple__548
+#define __pyx_tuple__550 __pyx_mstate_global->__pyx_tuple__550
+#define __pyx_tuple__554 __pyx_mstate_global->__pyx_tuple__554
+#define __pyx_tuple__556 __pyx_mstate_global->__pyx_tuple__556
+#define __pyx_tuple__558 __pyx_mstate_global->__pyx_tuple__558
+#define __pyx_tuple__560 __pyx_mstate_global->__pyx_tuple__560
+#define __pyx_tuple__561 __pyx_mstate_global->__pyx_tuple__561
+#define __pyx_tuple__562 __pyx_mstate_global->__pyx_tuple__562
+#define __pyx_tuple__564 __pyx_mstate_global->__pyx_tuple__564
+#define __pyx_tuple__565 __pyx_mstate_global->__pyx_tuple__565
+#define __pyx_tuple__566 __pyx_mstate_global->__pyx_tuple__566
+#define __pyx_tuple__570 __pyx_mstate_global->__pyx_tuple__570
+#define __pyx_codeobj__13 __pyx_mstate_global->__pyx_codeobj__13
+#define __pyx_codeobj__15 __pyx_mstate_global->__pyx_codeobj__15
+#define __pyx_codeobj__16 __pyx_mstate_global->__pyx_codeobj__16
+#define __pyx_codeobj__18 __pyx_mstate_global->__pyx_codeobj__18
+#define __pyx_codeobj__20 __pyx_mstate_global->__pyx_codeobj__20
+#define __pyx_codeobj__22 __pyx_mstate_global->__pyx_codeobj__22
+#define __pyx_codeobj__41 __pyx_mstate_global->__pyx_codeobj__41
+#define __pyx_codeobj__42 __pyx_mstate_global->__pyx_codeobj__42
+#define __pyx_codeobj__43 __pyx_mstate_global->__pyx_codeobj__43
+#define __pyx_codeobj__44 __pyx_mstate_global->__pyx_codeobj__44
+#define __pyx_codeobj__45 __pyx_mstate_global->__pyx_codeobj__45
+#define __pyx_codeobj__47 __pyx_mstate_global->__pyx_codeobj__47
+#define __pyx_codeobj__51 __pyx_mstate_global->__pyx_codeobj__51
+#define __pyx_codeobj__52 __pyx_mstate_global->__pyx_codeobj__52
+#define __pyx_codeobj__53 __pyx_mstate_global->__pyx_codeobj__53
+#define __pyx_codeobj__54 __pyx_mstate_global->__pyx_codeobj__54
+#define __pyx_codeobj__55 __pyx_mstate_global->__pyx_codeobj__55
+#define __pyx_codeobj__56 __pyx_mstate_global->__pyx_codeobj__56
+#define __pyx_codeobj__59 __pyx_mstate_global->__pyx_codeobj__59
+#define __pyx_codeobj__60 __pyx_mstate_global->__pyx_codeobj__60
+#define __pyx_codeobj__61 __pyx_mstate_global->__pyx_codeobj__61
+#define __pyx_codeobj__62 __pyx_mstate_global->__pyx_codeobj__62
+#define __pyx_codeobj__63 __pyx_mstate_global->__pyx_codeobj__63
+#define __pyx_codeobj__64 __pyx_mstate_global->__pyx_codeobj__64
+#define __pyx_codeobj__65 __pyx_mstate_global->__pyx_codeobj__65
+#define __pyx_codeobj__66 __pyx_mstate_global->__pyx_codeobj__66
+#define __pyx_codeobj__67 __pyx_mstate_global->__pyx_codeobj__67
+#define __pyx_codeobj__68 __pyx_mstate_global->__pyx_codeobj__68
+#define __pyx_codeobj__72 __pyx_mstate_global->__pyx_codeobj__72
+#define __pyx_codeobj__73 __pyx_mstate_global->__pyx_codeobj__73
+#define __pyx_codeobj__74 __pyx_mstate_global->__pyx_codeobj__74
+#define __pyx_codeobj__75 __pyx_mstate_global->__pyx_codeobj__75
+#define __pyx_codeobj__77 __pyx_mstate_global->__pyx_codeobj__77
+#define __pyx_codeobj__78 __pyx_mstate_global->__pyx_codeobj__78
+#define __pyx_codeobj__81 __pyx_mstate_global->__pyx_codeobj__81
+#define __pyx_codeobj__82 __pyx_mstate_global->__pyx_codeobj__82
+#define __pyx_codeobj__84 __pyx_mstate_global->__pyx_codeobj__84
+#define __pyx_codeobj__85 __pyx_mstate_global->__pyx_codeobj__85
+#define __pyx_codeobj__86 __pyx_mstate_global->__pyx_codeobj__86
+#define __pyx_codeobj__87 __pyx_mstate_global->__pyx_codeobj__87
+#define __pyx_codeobj__88 __pyx_mstate_global->__pyx_codeobj__88
+#define __pyx_codeobj__89 __pyx_mstate_global->__pyx_codeobj__89
+#define __pyx_codeobj__90 __pyx_mstate_global->__pyx_codeobj__90
+#define __pyx_codeobj__91 __pyx_mstate_global->__pyx_codeobj__91
+#define __pyx_codeobj__92 __pyx_mstate_global->__pyx_codeobj__92
+#define __pyx_codeobj__94 __pyx_mstate_global->__pyx_codeobj__94
+#define __pyx_codeobj__95 __pyx_mstate_global->__pyx_codeobj__95
+#define __pyx_codeobj__96 __pyx_mstate_global->__pyx_codeobj__96
+#define __pyx_codeobj__97 __pyx_mstate_global->__pyx_codeobj__97
+#define __pyx_codeobj__99 __pyx_mstate_global->__pyx_codeobj__99
+#define __pyx_codeobj__100 __pyx_mstate_global->__pyx_codeobj__100
+#define __pyx_codeobj__101 __pyx_mstate_global->__pyx_codeobj__101
+#define __pyx_codeobj__102 __pyx_mstate_global->__pyx_codeobj__102
+#define __pyx_codeobj__103 __pyx_mstate_global->__pyx_codeobj__103
+#define __pyx_codeobj__104 __pyx_mstate_global->__pyx_codeobj__104
+#define __pyx_codeobj__109 __pyx_mstate_global->__pyx_codeobj__109
+#define __pyx_codeobj__111 __pyx_mstate_global->__pyx_codeobj__111
+#define __pyx_codeobj__112 __pyx_mstate_global->__pyx_codeobj__112
+#define __pyx_codeobj__113 __pyx_mstate_global->__pyx_codeobj__113
+#define __pyx_codeobj__114 __pyx_mstate_global->__pyx_codeobj__114
+#define __pyx_codeobj__115 __pyx_mstate_global->__pyx_codeobj__115
+#define __pyx_codeobj__117 __pyx_mstate_global->__pyx_codeobj__117
+#define __pyx_codeobj__119 __pyx_mstate_global->__pyx_codeobj__119
+#define __pyx_codeobj__120 __pyx_mstate_global->__pyx_codeobj__120
+#define __pyx_codeobj__122 __pyx_mstate_global->__pyx_codeobj__122
+#define __pyx_codeobj__124 __pyx_mstate_global->__pyx_codeobj__124
+#define __pyx_codeobj__126 __pyx_mstate_global->__pyx_codeobj__126
+#define __pyx_codeobj__128 __pyx_mstate_global->__pyx_codeobj__128
+#define __pyx_codeobj__129 __pyx_mstate_global->__pyx_codeobj__129
+#define __pyx_codeobj__130 __pyx_mstate_global->__pyx_codeobj__130
+#define __pyx_codeobj__131 __pyx_mstate_global->__pyx_codeobj__131
+#define __pyx_codeobj__132 __pyx_mstate_global->__pyx_codeobj__132
+#define __pyx_codeobj__133 __pyx_mstate_global->__pyx_codeobj__133
+#define __pyx_codeobj__134 __pyx_mstate_global->__pyx_codeobj__134
+#define __pyx_codeobj__135 __pyx_mstate_global->__pyx_codeobj__135
+#define __pyx_codeobj__136 __pyx_mstate_global->__pyx_codeobj__136
+#define __pyx_codeobj__137 __pyx_mstate_global->__pyx_codeobj__137
+#define __pyx_codeobj__139 __pyx_mstate_global->__pyx_codeobj__139
+#define __pyx_codeobj__140 __pyx_mstate_global->__pyx_codeobj__140
+#define __pyx_codeobj__141 __pyx_mstate_global->__pyx_codeobj__141
+#define __pyx_codeobj__142 __pyx_mstate_global->__pyx_codeobj__142
+#define __pyx_codeobj__143 __pyx_mstate_global->__pyx_codeobj__143
+#define __pyx_codeobj__145 __pyx_mstate_global->__pyx_codeobj__145
+#define __pyx_codeobj__146 __pyx_mstate_global->__pyx_codeobj__146
+#define __pyx_codeobj__147 __pyx_mstate_global->__pyx_codeobj__147
+#define __pyx_codeobj__149 __pyx_mstate_global->__pyx_codeobj__149
+#define __pyx_codeobj__151 __pyx_mstate_global->__pyx_codeobj__151
+#define __pyx_codeobj__154 __pyx_mstate_global->__pyx_codeobj__154
+#define __pyx_codeobj__155 __pyx_mstate_global->__pyx_codeobj__155
+#define __pyx_codeobj__157 __pyx_mstate_global->__pyx_codeobj__157
+#define __pyx_codeobj__159 __pyx_mstate_global->__pyx_codeobj__159
+#define __pyx_codeobj__160 __pyx_mstate_global->__pyx_codeobj__160
+#define __pyx_codeobj__161 __pyx_mstate_global->__pyx_codeobj__161
+#define __pyx_codeobj__163 __pyx_mstate_global->__pyx_codeobj__163
+#define __pyx_codeobj__164 __pyx_mstate_global->__pyx_codeobj__164
+#define __pyx_codeobj__165 __pyx_mstate_global->__pyx_codeobj__165
+#define __pyx_codeobj__167 __pyx_mstate_global->__pyx_codeobj__167
+#define __pyx_codeobj__169 __pyx_mstate_global->__pyx_codeobj__169
+#define __pyx_codeobj__171 __pyx_mstate_global->__pyx_codeobj__171
+#define __pyx_codeobj__173 __pyx_mstate_global->__pyx_codeobj__173
+#define __pyx_codeobj__175 __pyx_mstate_global->__pyx_codeobj__175
+#define __pyx_codeobj__177 __pyx_mstate_global->__pyx_codeobj__177
+#define __pyx_codeobj__179 __pyx_mstate_global->__pyx_codeobj__179
+#define __pyx_codeobj__181 __pyx_mstate_global->__pyx_codeobj__181
+#define __pyx_codeobj__183 __pyx_mstate_global->__pyx_codeobj__183
+#define __pyx_codeobj__185 __pyx_mstate_global->__pyx_codeobj__185
+#define __pyx_codeobj__187 __pyx_mstate_global->__pyx_codeobj__187
+#define __pyx_codeobj__188 __pyx_mstate_global->__pyx_codeobj__188
+#define __pyx_codeobj__189 __pyx_mstate_global->__pyx_codeobj__189
+#define __pyx_codeobj__190 __pyx_mstate_global->__pyx_codeobj__190
+#define __pyx_codeobj__191 __pyx_mstate_global->__pyx_codeobj__191
+#define __pyx_codeobj__192 __pyx_mstate_global->__pyx_codeobj__192
+#define __pyx_codeobj__193 __pyx_mstate_global->__pyx_codeobj__193
+#define __pyx_codeobj__195 __pyx_mstate_global->__pyx_codeobj__195
+#define __pyx_codeobj__196 __pyx_mstate_global->__pyx_codeobj__196
+#define __pyx_codeobj__197 __pyx_mstate_global->__pyx_codeobj__197
+#define __pyx_codeobj__198 __pyx_mstate_global->__pyx_codeobj__198
+#define __pyx_codeobj__199 __pyx_mstate_global->__pyx_codeobj__199
+#define __pyx_codeobj__200 __pyx_mstate_global->__pyx_codeobj__200
+#define __pyx_codeobj__201 __pyx_mstate_global->__pyx_codeobj__201
+#define __pyx_codeobj__202 __pyx_mstate_global->__pyx_codeobj__202
+#define __pyx_codeobj__203 __pyx_mstate_global->__pyx_codeobj__203
+#define __pyx_codeobj__204 __pyx_mstate_global->__pyx_codeobj__204
+#define __pyx_codeobj__205 __pyx_mstate_global->__pyx_codeobj__205
+#define __pyx_codeobj__206 __pyx_mstate_global->__pyx_codeobj__206
+#define __pyx_codeobj__207 __pyx_mstate_global->__pyx_codeobj__207
+#define __pyx_codeobj__208 __pyx_mstate_global->__pyx_codeobj__208
+#define __pyx_codeobj__210 __pyx_mstate_global->__pyx_codeobj__210
+#define __pyx_codeobj__212 __pyx_mstate_global->__pyx_codeobj__212
+#define __pyx_codeobj__214 __pyx_mstate_global->__pyx_codeobj__214
+#define __pyx_codeobj__215 __pyx_mstate_global->__pyx_codeobj__215
+#define __pyx_codeobj__216 __pyx_mstate_global->__pyx_codeobj__216
+#define __pyx_codeobj__218 __pyx_mstate_global->__pyx_codeobj__218
+#define __pyx_codeobj__219 __pyx_mstate_global->__pyx_codeobj__219
+#define __pyx_codeobj__220 __pyx_mstate_global->__pyx_codeobj__220
+#define __pyx_codeobj__221 __pyx_mstate_global->__pyx_codeobj__221
+#define __pyx_codeobj__223 __pyx_mstate_global->__pyx_codeobj__223
+#define __pyx_codeobj__225 __pyx_mstate_global->__pyx_codeobj__225
+#define __pyx_codeobj__227 __pyx_mstate_global->__pyx_codeobj__227
+#define __pyx_codeobj__228 __pyx_mstate_global->__pyx_codeobj__228
+#define __pyx_codeobj__229 __pyx_mstate_global->__pyx_codeobj__229
+#define __pyx_codeobj__231 __pyx_mstate_global->__pyx_codeobj__231
+#define __pyx_codeobj__233 __pyx_mstate_global->__pyx_codeobj__233
+#define __pyx_codeobj__234 __pyx_mstate_global->__pyx_codeobj__234
+#define __pyx_codeobj__235 __pyx_mstate_global->__pyx_codeobj__235
+#define __pyx_codeobj__237 __pyx_mstate_global->__pyx_codeobj__237
+#define __pyx_codeobj__239 __pyx_mstate_global->__pyx_codeobj__239
+#define __pyx_codeobj__240 __pyx_mstate_global->__pyx_codeobj__240
+#define __pyx_codeobj__242 __pyx_mstate_global->__pyx_codeobj__242
+#define __pyx_codeobj__243 __pyx_mstate_global->__pyx_codeobj__243
+#define __pyx_codeobj__244 __pyx_mstate_global->__pyx_codeobj__244
+#define __pyx_codeobj__245 __pyx_mstate_global->__pyx_codeobj__245
+#define __pyx_codeobj__246 __pyx_mstate_global->__pyx_codeobj__246
+#define __pyx_codeobj__247 __pyx_mstate_global->__pyx_codeobj__247
+#define __pyx_codeobj__248 __pyx_mstate_global->__pyx_codeobj__248
+#define __pyx_codeobj__249 __pyx_mstate_global->__pyx_codeobj__249
+#define __pyx_codeobj__250 __pyx_mstate_global->__pyx_codeobj__250
+#define __pyx_codeobj__251 __pyx_mstate_global->__pyx_codeobj__251
+#define __pyx_codeobj__252 __pyx_mstate_global->__pyx_codeobj__252
+#define __pyx_codeobj__253 __pyx_mstate_global->__pyx_codeobj__253
+#define __pyx_codeobj__256 __pyx_mstate_global->__pyx_codeobj__256
+#define __pyx_codeobj__257 __pyx_mstate_global->__pyx_codeobj__257
+#define __pyx_codeobj__258 __pyx_mstate_global->__pyx_codeobj__258
+#define __pyx_codeobj__259 __pyx_mstate_global->__pyx_codeobj__259
+#define __pyx_codeobj__260 __pyx_mstate_global->__pyx_codeobj__260
+#define __pyx_codeobj__261 __pyx_mstate_global->__pyx_codeobj__261
+#define __pyx_codeobj__262 __pyx_mstate_global->__pyx_codeobj__262
+#define __pyx_codeobj__263 __pyx_mstate_global->__pyx_codeobj__263
+#define __pyx_codeobj__264 __pyx_mstate_global->__pyx_codeobj__264
+#define __pyx_codeobj__265 __pyx_mstate_global->__pyx_codeobj__265
+#define __pyx_codeobj__266 __pyx_mstate_global->__pyx_codeobj__266
+#define __pyx_codeobj__267 __pyx_mstate_global->__pyx_codeobj__267
+#define __pyx_codeobj__268 __pyx_mstate_global->__pyx_codeobj__268
+#define __pyx_codeobj__269 __pyx_mstate_global->__pyx_codeobj__269
+#define __pyx_codeobj__270 __pyx_mstate_global->__pyx_codeobj__270
+#define __pyx_codeobj__271 __pyx_mstate_global->__pyx_codeobj__271
+#define __pyx_codeobj__272 __pyx_mstate_global->__pyx_codeobj__272
+#define __pyx_codeobj__273 __pyx_mstate_global->__pyx_codeobj__273
+#define __pyx_codeobj__274 __pyx_mstate_global->__pyx_codeobj__274
+#define __pyx_codeobj__275 __pyx_mstate_global->__pyx_codeobj__275
+#define __pyx_codeobj__276 __pyx_mstate_global->__pyx_codeobj__276
+#define __pyx_codeobj__277 __pyx_mstate_global->__pyx_codeobj__277
+#define __pyx_codeobj__278 __pyx_mstate_global->__pyx_codeobj__278
+#define __pyx_codeobj__279 __pyx_mstate_global->__pyx_codeobj__279
+#define __pyx_codeobj__280 __pyx_mstate_global->__pyx_codeobj__280
+#define __pyx_codeobj__281 __pyx_mstate_global->__pyx_codeobj__281
+#define __pyx_codeobj__282 __pyx_mstate_global->__pyx_codeobj__282
+#define __pyx_codeobj__283 __pyx_mstate_global->__pyx_codeobj__283
+#define __pyx_codeobj__284 __pyx_mstate_global->__pyx_codeobj__284
+#define __pyx_codeobj__285 __pyx_mstate_global->__pyx_codeobj__285
+#define __pyx_codeobj__286 __pyx_mstate_global->__pyx_codeobj__286
+#define __pyx_codeobj__287 __pyx_mstate_global->__pyx_codeobj__287
+#define __pyx_codeobj__288 __pyx_mstate_global->__pyx_codeobj__288
+#define __pyx_codeobj__289 __pyx_mstate_global->__pyx_codeobj__289
+#define __pyx_codeobj__290 __pyx_mstate_global->__pyx_codeobj__290
+#define __pyx_codeobj__291 __pyx_mstate_global->__pyx_codeobj__291
+#define __pyx_codeobj__292 __pyx_mstate_global->__pyx_codeobj__292
+#define __pyx_codeobj__294 __pyx_mstate_global->__pyx_codeobj__294
+#define __pyx_codeobj__295 __pyx_mstate_global->__pyx_codeobj__295
+#define __pyx_codeobj__297 __pyx_mstate_global->__pyx_codeobj__297
+#define __pyx_codeobj__298 __pyx_mstate_global->__pyx_codeobj__298
+#define __pyx_codeobj__299 __pyx_mstate_global->__pyx_codeobj__299
+#define __pyx_codeobj__300 __pyx_mstate_global->__pyx_codeobj__300
+#define __pyx_codeobj__302 __pyx_mstate_global->__pyx_codeobj__302
+#define __pyx_codeobj__303 __pyx_mstate_global->__pyx_codeobj__303
+#define __pyx_codeobj__305 __pyx_mstate_global->__pyx_codeobj__305
+#define __pyx_codeobj__307 __pyx_mstate_global->__pyx_codeobj__307
+#define __pyx_codeobj__309 __pyx_mstate_global->__pyx_codeobj__309
+#define __pyx_codeobj__311 __pyx_mstate_global->__pyx_codeobj__311
+#define __pyx_codeobj__313 __pyx_mstate_global->__pyx_codeobj__313
+#define __pyx_codeobj__315 __pyx_mstate_global->__pyx_codeobj__315
+#define __pyx_codeobj__318 __pyx_mstate_global->__pyx_codeobj__318
+#define __pyx_codeobj__320 __pyx_mstate_global->__pyx_codeobj__320
+#define __pyx_codeobj__321 __pyx_mstate_global->__pyx_codeobj__321
+#define __pyx_codeobj__322 __pyx_mstate_global->__pyx_codeobj__322
+#define __pyx_codeobj__323 __pyx_mstate_global->__pyx_codeobj__323
+#define __pyx_codeobj__324 __pyx_mstate_global->__pyx_codeobj__324
+#define __pyx_codeobj__325 __pyx_mstate_global->__pyx_codeobj__325
+#define __pyx_codeobj__326 __pyx_mstate_global->__pyx_codeobj__326
+#define __pyx_codeobj__327 __pyx_mstate_global->__pyx_codeobj__327
+#define __pyx_codeobj__328 __pyx_mstate_global->__pyx_codeobj__328
+#define __pyx_codeobj__329 __pyx_mstate_global->__pyx_codeobj__329
+#define __pyx_codeobj__330 __pyx_mstate_global->__pyx_codeobj__330
+#define __pyx_codeobj__331 __pyx_mstate_global->__pyx_codeobj__331
+#define __pyx_codeobj__332 __pyx_mstate_global->__pyx_codeobj__332
+#define __pyx_codeobj__333 __pyx_mstate_global->__pyx_codeobj__333
+#define __pyx_codeobj__334 __pyx_mstate_global->__pyx_codeobj__334
+#define __pyx_codeobj__336 __pyx_mstate_global->__pyx_codeobj__336
+#define __pyx_codeobj__337 __pyx_mstate_global->__pyx_codeobj__337
+#define __pyx_codeobj__338 __pyx_mstate_global->__pyx_codeobj__338
+#define __pyx_codeobj__339 __pyx_mstate_global->__pyx_codeobj__339
+#define __pyx_codeobj__340 __pyx_mstate_global->__pyx_codeobj__340
+#define __pyx_codeobj__341 __pyx_mstate_global->__pyx_codeobj__341
+#define __pyx_codeobj__343 __pyx_mstate_global->__pyx_codeobj__343
+#define __pyx_codeobj__344 __pyx_mstate_global->__pyx_codeobj__344
+#define __pyx_codeobj__345 __pyx_mstate_global->__pyx_codeobj__345
+#define __pyx_codeobj__347 __pyx_mstate_global->__pyx_codeobj__347
+#define __pyx_codeobj__348 __pyx_mstate_global->__pyx_codeobj__348
+#define __pyx_codeobj__350 __pyx_mstate_global->__pyx_codeobj__350
+#define __pyx_codeobj__351 __pyx_mstate_global->__pyx_codeobj__351
+#define __pyx_codeobj__352 __pyx_mstate_global->__pyx_codeobj__352
+#define __pyx_codeobj__354 __pyx_mstate_global->__pyx_codeobj__354
+#define __pyx_codeobj__355 __pyx_mstate_global->__pyx_codeobj__355
+#define __pyx_codeobj__357 __pyx_mstate_global->__pyx_codeobj__357
+#define __pyx_codeobj__359 __pyx_mstate_global->__pyx_codeobj__359
+#define __pyx_codeobj__361 __pyx_mstate_global->__pyx_codeobj__361
+#define __pyx_codeobj__363 __pyx_mstate_global->__pyx_codeobj__363
+#define __pyx_codeobj__365 __pyx_mstate_global->__pyx_codeobj__365
+#define __pyx_codeobj__367 __pyx_mstate_global->__pyx_codeobj__367
+#define __pyx_codeobj__369 __pyx_mstate_global->__pyx_codeobj__369
+#define __pyx_codeobj__373 __pyx_mstate_global->__pyx_codeobj__373
+#define __pyx_codeobj__376 __pyx_mstate_global->__pyx_codeobj__376
+#define __pyx_codeobj__377 __pyx_mstate_global->__pyx_codeobj__377
+#define __pyx_codeobj__378 __pyx_mstate_global->__pyx_codeobj__378
+#define __pyx_codeobj__380 __pyx_mstate_global->__pyx_codeobj__380
+#define __pyx_codeobj__381 __pyx_mstate_global->__pyx_codeobj__381
+#define __pyx_codeobj__382 __pyx_mstate_global->__pyx_codeobj__382
+#define __pyx_codeobj__383 __pyx_mstate_global->__pyx_codeobj__383
+#define __pyx_codeobj__384 __pyx_mstate_global->__pyx_codeobj__384
+#define __pyx_codeobj__386 __pyx_mstate_global->__pyx_codeobj__386
+#define __pyx_codeobj__387 __pyx_mstate_global->__pyx_codeobj__387
+#define __pyx_codeobj__390 __pyx_mstate_global->__pyx_codeobj__390
+#define __pyx_codeobj__391 __pyx_mstate_global->__pyx_codeobj__391
+#define __pyx_codeobj__392 __pyx_mstate_global->__pyx_codeobj__392
+#define __pyx_codeobj__394 __pyx_mstate_global->__pyx_codeobj__394
+#define __pyx_codeobj__397 __pyx_mstate_global->__pyx_codeobj__397
+#define __pyx_codeobj__398 __pyx_mstate_global->__pyx_codeobj__398
+#define __pyx_codeobj__399 __pyx_mstate_global->__pyx_codeobj__399
+#define __pyx_codeobj__400 __pyx_mstate_global->__pyx_codeobj__400
+#define __pyx_codeobj__401 __pyx_mstate_global->__pyx_codeobj__401
+#define __pyx_codeobj__402 __pyx_mstate_global->__pyx_codeobj__402
+#define __pyx_codeobj__404 __pyx_mstate_global->__pyx_codeobj__404
+#define __pyx_codeobj__407 __pyx_mstate_global->__pyx_codeobj__407
+#define __pyx_codeobj__408 __pyx_mstate_global->__pyx_codeobj__408
+#define __pyx_codeobj__410 __pyx_mstate_global->__pyx_codeobj__410
+#define __pyx_codeobj__411 __pyx_mstate_global->__pyx_codeobj__411
+#define __pyx_codeobj__412 __pyx_mstate_global->__pyx_codeobj__412
+#define __pyx_codeobj__413 __pyx_mstate_global->__pyx_codeobj__413
+#define __pyx_codeobj__414 __pyx_mstate_global->__pyx_codeobj__414
+#define __pyx_codeobj__415 __pyx_mstate_global->__pyx_codeobj__415
+#define __pyx_codeobj__416 __pyx_mstate_global->__pyx_codeobj__416
+#define __pyx_codeobj__418 __pyx_mstate_global->__pyx_codeobj__418
+#define __pyx_codeobj__419 __pyx_mstate_global->__pyx_codeobj__419
+#define __pyx_codeobj__420 __pyx_mstate_global->__pyx_codeobj__420
+#define __pyx_codeobj__421 __pyx_mstate_global->__pyx_codeobj__421
+#define __pyx_codeobj__422 __pyx_mstate_global->__pyx_codeobj__422
+#define __pyx_codeobj__423 __pyx_mstate_global->__pyx_codeobj__423
+#define __pyx_codeobj__425 __pyx_mstate_global->__pyx_codeobj__425
+#define __pyx_codeobj__426 __pyx_mstate_global->__pyx_codeobj__426
+#define __pyx_codeobj__428 __pyx_mstate_global->__pyx_codeobj__428
+#define __pyx_codeobj__429 __pyx_mstate_global->__pyx_codeobj__429
+#define __pyx_codeobj__430 __pyx_mstate_global->__pyx_codeobj__430
+#define __pyx_codeobj__431 __pyx_mstate_global->__pyx_codeobj__431
+#define __pyx_codeobj__432 __pyx_mstate_global->__pyx_codeobj__432
+#define __pyx_codeobj__433 __pyx_mstate_global->__pyx_codeobj__433
+#define __pyx_codeobj__434 __pyx_mstate_global->__pyx_codeobj__434
+#define __pyx_codeobj__442 __pyx_mstate_global->__pyx_codeobj__442
+#define __pyx_codeobj__443 __pyx_mstate_global->__pyx_codeobj__443
+#define __pyx_codeobj__445 __pyx_mstate_global->__pyx_codeobj__445
+#define __pyx_codeobj__446 __pyx_mstate_global->__pyx_codeobj__446
+#define __pyx_codeobj__447 __pyx_mstate_global->__pyx_codeobj__447
+#define __pyx_codeobj__449 __pyx_mstate_global->__pyx_codeobj__449
+#define __pyx_codeobj__451 __pyx_mstate_global->__pyx_codeobj__451
+#define __pyx_codeobj__452 __pyx_mstate_global->__pyx_codeobj__452
+#define __pyx_codeobj__454 __pyx_mstate_global->__pyx_codeobj__454
+#define __pyx_codeobj__455 __pyx_mstate_global->__pyx_codeobj__455
+#define __pyx_codeobj__456 __pyx_mstate_global->__pyx_codeobj__456
+#define __pyx_codeobj__458 __pyx_mstate_global->__pyx_codeobj__458
+#define __pyx_codeobj__459 __pyx_mstate_global->__pyx_codeobj__459
+#define __pyx_codeobj__461 __pyx_mstate_global->__pyx_codeobj__461
+#define __pyx_codeobj__469 __pyx_mstate_global->__pyx_codeobj__469
+#define __pyx_codeobj__470 __pyx_mstate_global->__pyx_codeobj__470
+#define __pyx_codeobj__471 __pyx_mstate_global->__pyx_codeobj__471
+#define __pyx_codeobj__473 __pyx_mstate_global->__pyx_codeobj__473
+#define __pyx_codeobj__474 __pyx_mstate_global->__pyx_codeobj__474
+#define __pyx_codeobj__475 __pyx_mstate_global->__pyx_codeobj__475
+#define __pyx_codeobj__477 __pyx_mstate_global->__pyx_codeobj__477
+#define __pyx_codeobj__478 __pyx_mstate_global->__pyx_codeobj__478
+#define __pyx_codeobj__479 __pyx_mstate_global->__pyx_codeobj__479
+#define __pyx_codeobj__480 __pyx_mstate_global->__pyx_codeobj__480
+#define __pyx_codeobj__481 __pyx_mstate_global->__pyx_codeobj__481
+#define __pyx_codeobj__482 __pyx_mstate_global->__pyx_codeobj__482
+#define __pyx_codeobj__483 __pyx_mstate_global->__pyx_codeobj__483
+#define __pyx_codeobj__488 __pyx_mstate_global->__pyx_codeobj__488
+#define __pyx_codeobj__489 __pyx_mstate_global->__pyx_codeobj__489
+#define __pyx_codeobj__490 __pyx_mstate_global->__pyx_codeobj__490
+#define __pyx_codeobj__492 __pyx_mstate_global->__pyx_codeobj__492
+#define __pyx_codeobj__493 __pyx_mstate_global->__pyx_codeobj__493
+#define __pyx_codeobj__495 __pyx_mstate_global->__pyx_codeobj__495
+#define __pyx_codeobj__496 __pyx_mstate_global->__pyx_codeobj__496
+#define __pyx_codeobj__498 __pyx_mstate_global->__pyx_codeobj__498
+#define __pyx_codeobj__499 __pyx_mstate_global->__pyx_codeobj__499
+#define __pyx_codeobj__501 __pyx_mstate_global->__pyx_codeobj__501
+#define __pyx_codeobj__503 __pyx_mstate_global->__pyx_codeobj__503
+#define __pyx_codeobj__505 __pyx_mstate_global->__pyx_codeobj__505
+#define __pyx_codeobj__507 __pyx_mstate_global->__pyx_codeobj__507
+#define __pyx_codeobj__508 __pyx_mstate_global->__pyx_codeobj__508
+#define __pyx_codeobj__510 __pyx_mstate_global->__pyx_codeobj__510
+#define __pyx_codeobj__511 __pyx_mstate_global->__pyx_codeobj__511
+#define __pyx_codeobj__512 __pyx_mstate_global->__pyx_codeobj__512
+#define __pyx_codeobj__513 __pyx_mstate_global->__pyx_codeobj__513
+#define __pyx_codeobj__514 __pyx_mstate_global->__pyx_codeobj__514
+#define __pyx_codeobj__516 __pyx_mstate_global->__pyx_codeobj__516
+#define __pyx_codeobj__518 __pyx_mstate_global->__pyx_codeobj__518
+#define __pyx_codeobj__519 __pyx_mstate_global->__pyx_codeobj__519
+#define __pyx_codeobj__520 __pyx_mstate_global->__pyx_codeobj__520
+#define __pyx_codeobj__521 __pyx_mstate_global->__pyx_codeobj__521
+#define __pyx_codeobj__522 __pyx_mstate_global->__pyx_codeobj__522
+#define __pyx_codeobj__523 __pyx_mstate_global->__pyx_codeobj__523
+#define __pyx_codeobj__524 __pyx_mstate_global->__pyx_codeobj__524
+#define __pyx_codeobj__525 __pyx_mstate_global->__pyx_codeobj__525
+#define __pyx_codeobj__526 __pyx_mstate_global->__pyx_codeobj__526
+#define __pyx_codeobj__527 __pyx_mstate_global->__pyx_codeobj__527
+#define __pyx_codeobj__528 __pyx_mstate_global->__pyx_codeobj__528
+#define __pyx_codeobj__529 __pyx_mstate_global->__pyx_codeobj__529
+#define __pyx_codeobj__530 __pyx_mstate_global->__pyx_codeobj__530
+#define __pyx_codeobj__531 __pyx_mstate_global->__pyx_codeobj__531
+#define __pyx_codeobj__532 __pyx_mstate_global->__pyx_codeobj__532
+#define __pyx_codeobj__535 __pyx_mstate_global->__pyx_codeobj__535
+#define __pyx_codeobj__540 __pyx_mstate_global->__pyx_codeobj__540
+#define __pyx_codeobj__541 __pyx_mstate_global->__pyx_codeobj__541
+#define __pyx_codeobj__547 __pyx_mstate_global->__pyx_codeobj__547
+#define __pyx_codeobj__549 __pyx_mstate_global->__pyx_codeobj__549
+#define __pyx_codeobj__551 __pyx_mstate_global->__pyx_codeobj__551
+#define __pyx_codeobj__552 __pyx_mstate_global->__pyx_codeobj__552
+#define __pyx_codeobj__553 __pyx_mstate_global->__pyx_codeobj__553
+#define __pyx_codeobj__555 __pyx_mstate_global->__pyx_codeobj__555
+#define __pyx_codeobj__557 __pyx_mstate_global->__pyx_codeobj__557
+#define __pyx_codeobj__559 __pyx_mstate_global->__pyx_codeobj__559
+#define __pyx_codeobj__563 __pyx_mstate_global->__pyx_codeobj__563
+#define __pyx_codeobj__567 __pyx_mstate_global->__pyx_codeobj__567
+#define __pyx_codeobj__568 __pyx_mstate_global->__pyx_codeobj__568
+#define __pyx_codeobj__569 __pyx_mstate_global->__pyx_codeobj__569
+#define __pyx_codeobj__571 __pyx_mstate_global->__pyx_codeobj__571
+#define __pyx_codeobj__572 __pyx_mstate_global->__pyx_codeobj__572
+#define __pyx_codeobj__573 __pyx_mstate_global->__pyx_codeobj__573
+#define __pyx_codeobj__574 __pyx_mstate_global->__pyx_codeobj__574
+#define __pyx_codeobj__575 __pyx_mstate_global->__pyx_codeobj__575
+/* #### Code section: module_code ### */
+
+/* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(object (*f)(_LatentEventArg) ):
+ *     def wrap(_LatentEventArg latent_event_arg):             # <<<<<<<<<<<<<<
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ *         return f(latent_event_arg)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_1wrap(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_wrap, "wrap(latent_event_arg: '_LatentEventArg')");
+static PyMethodDef __pyx_mdef_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_1wrap = {"wrap", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_1wrap, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_wrap};
+static PyObject *__pyx_pw_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_1wrap(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *__pyx_v_latent_event_arg = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("wrap (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_latent_event_arg,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_latent_event_arg)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 67, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "wrap") < 0)) __PYX_ERR(10, 67, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_latent_event_arg = ((struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("wrap", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 67, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg.wrap", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_latent_event_arg), __pyx_ptype_7_cython_6cygrpc__LatentEventArg, 1, "latent_event_arg", 0))) __PYX_ERR(10, 67, __pyx_L1_error)
+  __pyx_r = __pyx_pf_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_wrap(__pyx_self, __pyx_v_latent_event_arg);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_wrap(PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *__pyx_v_latent_event_arg) {
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg *__pyx_cur_scope;
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg *__pyx_outer_scope;
+  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("wrap", 1);
+  __pyx_outer_scope = (struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "cfunc.to_py":69
+ *     def wrap(_LatentEventArg latent_event_arg):
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ *         return f(latent_event_arg)             # <<<<<<<<<<<<<<
+ *     return wrap
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_f(__pyx_v_latent_event_arg); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(object (*f)(_LatentEventArg) ):
+ *     def wrap(_LatentEventArg latent_event_arg):             # <<<<<<<<<<<<<<
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ *         return f(latent_event_arg)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg.wrap", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(object (*f)(_LatentEventArg) ):             # <<<<<<<<<<<<<<
+ *     def wrap(_LatentEventArg latent_event_arg):
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ */
+
+static PyObject *__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(PyObject *(*__pyx_v_f)(struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *)) {
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg *__pyx_cur_scope;
+  PyObject *__pyx_v_wrap = 0;
+  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("__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg", 0);
+  __pyx_cur_scope = (struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg *)__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(10, 66, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_f = __pyx_v_f;
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(object (*f)(_LatentEventArg) ):
+ *     def wrap(_LatentEventArg latent_event_arg):             # <<<<<<<<<<<<<<
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ *         return f(latent_event_arg)
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_11cfunc_dot_to_py_91__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_1wrap, 0, __pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cfunc_to_py, __pyx_d, ((PyObject *)__pyx_codeobj__2)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_wrap = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "cfunc.to_py":70
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ *         return f(latent_event_arg)
+ *     return wrap             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_wrap);
+  __pyx_r = __pyx_v_wrap;
+  goto __pyx_L0;
+
+  /* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(object (*f)(_LatentEventArg) ):             # <<<<<<<<<<<<<<
+ *     def wrap(_LatentEventArg latent_event_arg):
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_wrap);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "string.to_py":31
+ * 
+ * @cname("__pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyObject_FromStringAndSize(s.data(), s.size())
+ * cdef extern from *:
+ */
+
+static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string(std::string const &__pyx_v_s) {
+  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("__pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string", 1);
+
+  /* "string.to_py":32
+ * @cname("__pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string(const string& s):
+ *     return __Pyx_PyObject_FromStringAndSize(s.data(), s.size())             # <<<<<<<<<<<<<<
+ * cdef extern from *:
+ *     cdef object __Pyx_PyUnicode_FromStringAndSize(const char*, size_t)
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyObject_FromStringAndSize(__pyx_v_s.data(), __pyx_v_s.size()); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 32, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "string.to_py":31
+ * 
+ * @cname("__pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyObject_FromStringAndSize(s.data(), s.size())
+ * cdef extern from *:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("string.to_py.__pyx_convert_PyObject_string_to_py_6libcpp_6string_std__in_string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "string.to_py":37
+ * 
+ * @cname("__pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyUnicode_FromStringAndSize(s.data(), s.size())
+ * cdef extern from *:
+ */
+
+static CYTHON_INLINE PyObject *__pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string(std::string const &__pyx_v_s) {
+  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("__pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string", 1);
+
+  /* "string.to_py":38
+ * @cname("__pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string(const string& s):
+ *     return __Pyx_PyUnicode_FromStringAndSize(s.data(), s.size())             # <<<<<<<<<<<<<<
+ * cdef extern from *:
+ *     cdef object __Pyx_PyStr_FromStringAndSize(const char*, size_t)
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyUnicode_FromStringAndSize(__pyx_v_s.data(), __pyx_v_s.size()); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 38, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "string.to_py":37
+ * 
+ * @cname("__pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyUnicode_FromStringAndSize(s.data(), s.size())
+ * cdef extern from *:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("string.to_py.__pyx_convert_PyUnicode_string_to_py_6libcpp_6string_std__in_string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "string.to_py":43
+ * 
+ * @cname("__pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyStr_FromStringAndSize(s.data(), s.size())
+ * cdef extern from *:
+ */
+
+static CYTHON_INLINE PyObject *__pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string(std::string const &__pyx_v_s) {
+  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("__pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string", 1);
+
+  /* "string.to_py":44
+ * @cname("__pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string(const string& s):
+ *     return __Pyx_PyStr_FromStringAndSize(s.data(), s.size())             # <<<<<<<<<<<<<<
+ * cdef extern from *:
+ *     cdef object __Pyx_PyBytes_FromStringAndSize(const char*, size_t)
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyStr_FromStringAndSize(__pyx_v_s.data(), __pyx_v_s.size()); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 44, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "string.to_py":43
+ * 
+ * @cname("__pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyStr_FromStringAndSize(s.data(), s.size())
+ * cdef extern from *:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("string.to_py.__pyx_convert_PyStr_string_to_py_6libcpp_6string_std__in_string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "string.to_py":49
+ * 
+ * @cname("__pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyBytes_FromStringAndSize(s.data(), s.size())
+ * cdef extern from *:
+ */
+
+static CYTHON_INLINE PyObject *__pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string(std::string const &__pyx_v_s) {
+  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("__pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string", 1);
+
+  /* "string.to_py":50
+ * @cname("__pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string(const string& s):
+ *     return __Pyx_PyBytes_FromStringAndSize(s.data(), s.size())             # <<<<<<<<<<<<<<
+ * cdef extern from *:
+ *     cdef object __Pyx_PyByteArray_FromStringAndSize(const char*, size_t)
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_s.data(), __pyx_v_s.size()); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "string.to_py":49
+ * 
+ * @cname("__pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyBytes_FromStringAndSize(s.data(), s.size())
+ * cdef extern from *:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("string.to_py.__pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "string.to_py":55
+ * 
+ * @cname("__pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyByteArray_FromStringAndSize(s.data(), s.size())
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string(std::string const &__pyx_v_s) {
+  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("__pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string", 1);
+
+  /* "string.to_py":56
+ * @cname("__pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string(const string& s):
+ *     return __Pyx_PyByteArray_FromStringAndSize(s.data(), s.size())             # <<<<<<<<<<<<<<
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyByteArray_FromStringAndSize(__pyx_v_s.data(), __pyx_v_s.size()); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 56, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "string.to_py":55
+ * 
+ * @cname("__pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string")
+ * cdef inline object __pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string(const string& s):             # <<<<<<<<<<<<<<
+ *     return __Pyx_PyByteArray_FromStringAndSize(s.data(), s.size())
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("string.to_py.__pyx_convert_PyByteArray_string_to_py_6libcpp_6string_std__in_string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(object (*f)() ):
+ *     def wrap():             # <<<<<<<<<<<<<<
+ *         """wrap()"""
+ *         return f()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__1wrap(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+PyDoc_STRVAR(__pyx_doc_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__wrap, "wrap()");
+static PyMethodDef __pyx_mdef_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__1wrap = {"wrap", (PyCFunction)__pyx_pw_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__1wrap, METH_NOARGS, __pyx_doc_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__wrap};
+static PyObject *__pyx_pw_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__1wrap(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("wrap (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__wrap(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__wrap(PyObject *__pyx_self) {
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ *__pyx_cur_scope;
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ *__pyx_outer_scope;
+  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("wrap", 1);
+  __pyx_outer_scope = (struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "cfunc.to_py":69
+ *     def wrap():
+ *         """wrap()"""
+ *         return f()             # <<<<<<<<<<<<<<
+ *     return wrap
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_f(); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(object (*f)() ):
+ *     def wrap():             # <<<<<<<<<<<<<<
+ *         """wrap()"""
+ *         return f()
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_.wrap", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(object (*f)() ):             # <<<<<<<<<<<<<<
+ *     def wrap():
+ *         """wrap()"""
+ */
+
+static PyObject *__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(PyObject *(*__pyx_v_f)(void)) {
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ *__pyx_cur_scope;
+  PyObject *__pyx_v_wrap = 0;
+  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("__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_", 0);
+  __pyx_cur_scope = (struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ *)__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(10, 66, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_f = __pyx_v_f;
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(object (*f)() ):
+ *     def wrap():             # <<<<<<<<<<<<<<
+ *         """wrap()"""
+ *         return f()
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_11cfunc_dot_to_py_58__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__1wrap, 0, __pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_2, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cfunc_to_py, __pyx_d, ((PyObject *)__pyx_codeobj__3)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_wrap = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "cfunc.to_py":70
+ *         """wrap()"""
+ *         return f()
+ *     return wrap             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_wrap);
+  __pyx_r = __pyx_v_wrap;
+  goto __pyx_L0;
+
+  /* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(object (*f)() ):             # <<<<<<<<<<<<<<
+ *     def wrap():
+ *         """wrap()"""
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_wrap);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(object (*f)(object, tuple) ):
+ *     def wrap(object cb, tuple args):             # <<<<<<<<<<<<<<
+ *         """wrap(cb, args: tuple)"""
+ *         return f(cb, args)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_1wrap(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_wrap, "wrap(cb, args: tuple)");
+static PyMethodDef __pyx_mdef_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_1wrap = {"wrap", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_1wrap, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_wrap};
+static PyObject *__pyx_pw_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_1wrap(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_cb = 0;
+  PyObject *__pyx_v_args = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("wrap (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_cb,&__pyx_n_s_args,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cb)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 67, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 67, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("wrap", 1, 2, 2, 1); __PYX_ERR(10, 67, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "wrap") < 0)) __PYX_ERR(10, 67, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_cb = values[0];
+    __pyx_v_args = ((PyObject*)values[1]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("wrap", 1, 2, 2, __pyx_nargs); __PYX_ERR(10, 67, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args.wrap", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyTuple_Type), 1, "args", 1))) __PYX_ERR(10, 67, __pyx_L1_error)
+  __pyx_r = __pyx_pf_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_wrap(__pyx_self, __pyx_v_cb, __pyx_v_args);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_wrap(PyObject *__pyx_self, PyObject *__pyx_v_cb, PyObject *__pyx_v_args) {
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args *__pyx_cur_scope;
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args *__pyx_outer_scope;
+  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("wrap", 1);
+  __pyx_outer_scope = (struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "cfunc.to_py":69
+ *     def wrap(object cb, tuple args):
+ *         """wrap(cb, args: tuple)"""
+ *         return f(cb, args)             # <<<<<<<<<<<<<<
+ *     return wrap
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_f(__pyx_v_cb, __pyx_v_args); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(object (*f)(object, tuple) ):
+ *     def wrap(object cb, tuple args):             # <<<<<<<<<<<<<<
+ *         """wrap(cb, args: tuple)"""
+ *         return f(cb, args)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args.wrap", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(object (*f)(object, tuple) ):             # <<<<<<<<<<<<<<
+ *     def wrap(object cb, tuple args):
+ *         """wrap(cb, args: tuple)"""
+ */
+
+static PyObject *__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(PyObject *(*__pyx_v_f)(PyObject *, PyObject *)) {
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args *__pyx_cur_scope;
+  PyObject *__pyx_v_wrap = 0;
+  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("__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args", 0);
+  __pyx_cur_scope = (struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args *)__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(10, 66, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_f = __pyx_v_f;
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(object (*f)(object, tuple) ):
+ *     def wrap(object cb, tuple args):             # <<<<<<<<<<<<<<
+ *         """wrap(cb, args: tuple)"""
+ *         return f(cb, args)
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_11cfunc_dot_to_py_86__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_1wrap, 0, __pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_3, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cfunc_to_py, __pyx_d, ((PyObject *)__pyx_codeobj__5)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_wrap = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "cfunc.to_py":70
+ *         """wrap(cb, args: tuple)"""
+ *         return f(cb, args)
+ *     return wrap             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_wrap);
+  __pyx_r = __pyx_v_wrap;
+  goto __pyx_L0;
+
+  /* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(object (*f)(object, tuple) ):             # <<<<<<<<<<<<<<
+ *     def wrap(object cb, tuple args):
+ *         """wrap(cb, args: tuple)"""
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_wrap);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(void (*f)() except *):
+ *     def wrap():             # <<<<<<<<<<<<<<
+ *         """wrap() -> 'void'"""
+ *         f()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__1wrap(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+PyDoc_STRVAR(__pyx_doc_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__wrap, "wrap() -> 'void'");
+static PyMethodDef __pyx_mdef_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__1wrap = {"wrap", (PyCFunction)__pyx_pw_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__1wrap, METH_NOARGS, __pyx_doc_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__wrap};
+static PyObject *__pyx_pw_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__1wrap(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("wrap (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__wrap(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__wrap(PyObject *__pyx_self) {
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ *__pyx_cur_scope;
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ *__pyx_outer_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("wrap", 1);
+  __pyx_outer_scope = (struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "cfunc.to_py":69
+ *     def wrap():
+ *         """wrap() -> 'void'"""
+ *         f()             # <<<<<<<<<<<<<<
+ *     return wrap
+ * 
+ */
+  __pyx_cur_scope->__pyx_v_f(); if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 69, __pyx_L1_error)
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(void (*f)() except *):
+ *     def wrap():             # <<<<<<<<<<<<<<
+ *         """wrap() -> 'void'"""
+ *         f()
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_.wrap", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(void (*f)() except *):             # <<<<<<<<<<<<<<
+ *     def wrap():
+ *         """wrap() -> 'void'"""
+ */
+
+static PyObject *__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(void (*__pyx_v_f)(void)) {
+  struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ *__pyx_cur_scope;
+  PyObject *__pyx_v_wrap = 0;
+  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("__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_", 0);
+  __pyx_cur_scope = (struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ *)__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(10, 66, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_f = __pyx_v_f;
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(void (*f)() except *):
+ *     def wrap():             # <<<<<<<<<<<<<<
+ *         """wrap() -> 'void'"""
+ *         f()
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_11cfunc_dot_to_py_77__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__1wrap, 0, __pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_voi, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cfunc_to_py, __pyx_d, ((PyObject *)__pyx_codeobj__6)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_wrap = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "cfunc.to_py":70
+ *         """wrap() -> 'void'"""
+ *         f()
+ *     return wrap             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_wrap);
+  __pyx_r = __pyx_v_wrap;
+  goto __pyx_L0;
+
+  /* "cfunc.to_py":66
+ * 
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(void (*f)() except *):             # <<<<<<<<<<<<<<
+ *     def wrap():
+ *         """wrap() -> 'void'"""
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("cfunc.to_py.__Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_wrap);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cpython/complex.pxd":19
+ * 
+ *         @property
+ *         cdef inline double real(self) noexcept:             # <<<<<<<<<<<<<<
+ *             return self.cval.real
+ * 
+ */
+
+static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4real_real(PyComplexObject *__pyx_v_self) {
+  double __pyx_r;
+
+  /* "cpython/complex.pxd":20
+ *         @property
+ *         cdef inline double real(self) noexcept:
+ *             return self.cval.real             # <<<<<<<<<<<<<<
+ * 
+ *         @property
+ */
+  __pyx_r = __pyx_v_self->cval.real;
+  goto __pyx_L0;
+
+  /* "cpython/complex.pxd":19
+ * 
+ *         @property
+ *         cdef inline double real(self) noexcept:             # <<<<<<<<<<<<<<
+ *             return self.cval.real
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "cpython/complex.pxd":23
+ * 
+ *         @property
+ *         cdef inline double imag(self) noexcept:             # <<<<<<<<<<<<<<
+ *             return self.cval.imag
+ * 
+ */
+
+static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4imag_imag(PyComplexObject *__pyx_v_self) {
+  double __pyx_r;
+
+  /* "cpython/complex.pxd":24
+ *         @property
+ *         cdef inline double imag(self) noexcept:
+ *             return self.cval.imag             # <<<<<<<<<<<<<<
+ * 
+ *     # PyTypeObject PyComplex_Type
+ */
+  __pyx_r = __pyx_v_self->cval.imag;
+  goto __pyx_L0;
+
+  /* "cpython/complex.pxd":23
+ * 
+ *         @property
+ *         cdef inline double imag(self) noexcept:             # <<<<<<<<<<<<<<
+ *             return self.cval.imag
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "cpython/contextvars.pxd":112
+ * 
+ * 
+ * cdef inline object get_value(var, default_value=None):             # <<<<<<<<<<<<<<
+ *     """Return a new reference to the value of the context variable,
+ *     or the default value of the context variable,
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_7cpython_11contextvars_get_value(PyObject *__pyx_v_var, struct __pyx_opt_args_7cpython_11contextvars_get_value *__pyx_optional_args) {
+  PyObject *__pyx_v_default_value = ((PyObject *)Py_None);
+  PyObject *__pyx_v_value;
+  PyObject *__pyx_v_pyvalue = NULL;
+  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("get_value", 1);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_default_value = __pyx_optional_args->default_value;
+    }
+  }
+
+  /* "cpython/contextvars.pxd":117
+ *     or None if no such value or default was found.
+ *     """
+ *     cdef PyObject *value = NULL             # <<<<<<<<<<<<<<
+ *     PyContextVar_Get(var, NULL, &value)
+ *     if value is NULL:
+ */
+  __pyx_v_value = NULL;
+
+  /* "cpython/contextvars.pxd":118
+ *     """
+ *     cdef PyObject *value = NULL
+ *     PyContextVar_Get(var, NULL, &value)             # <<<<<<<<<<<<<<
+ *     if value is NULL:
+ *         # context variable does not have a default
+ */
+  __pyx_t_1 = PyContextVar_Get(__pyx_v_var, NULL, (&__pyx_v_value)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(11, 118, __pyx_L1_error)
+
+  /* "cpython/contextvars.pxd":119
+ *     cdef PyObject *value = NULL
+ *     PyContextVar_Get(var, NULL, &value)
+ *     if value is NULL:             # <<<<<<<<<<<<<<
+ *         # context variable does not have a default
+ *         pyvalue = default_value
+ */
+  __pyx_t_2 = (__pyx_v_value == NULL);
+  if (__pyx_t_2) {
+
+    /* "cpython/contextvars.pxd":121
+ *     if value is NULL:
+ *         # context variable does not have a default
+ *         pyvalue = default_value             # <<<<<<<<<<<<<<
+ *     else:
+ *         # value or default value of context variable
+ */
+    __Pyx_INCREF(__pyx_v_default_value);
+    __pyx_v_pyvalue = __pyx_v_default_value;
+
+    /* "cpython/contextvars.pxd":119
+ *     cdef PyObject *value = NULL
+ *     PyContextVar_Get(var, NULL, &value)
+ *     if value is NULL:             # <<<<<<<<<<<<<<
+ *         # context variable does not have a default
+ *         pyvalue = default_value
+ */
+    goto __pyx_L3;
+  }
+
+  /* "cpython/contextvars.pxd":124
+ *     else:
+ *         # value or default value of context variable
+ *         pyvalue = <object>value             # <<<<<<<<<<<<<<
+ *         Py_XDECREF(value)  # PyContextVar_Get() returned an owned reference as 'PyObject*'
+ *     return pyvalue
+ */
+  /*else*/ {
+    __pyx_t_3 = ((PyObject *)__pyx_v_value);
+    __Pyx_INCREF(__pyx_t_3);
+    __pyx_v_pyvalue = __pyx_t_3;
+    __pyx_t_3 = 0;
+
+    /* "cpython/contextvars.pxd":125
+ *         # value or default value of context variable
+ *         pyvalue = <object>value
+ *         Py_XDECREF(value)  # PyContextVar_Get() returned an owned reference as 'PyObject*'             # <<<<<<<<<<<<<<
+ *     return pyvalue
+ * 
+ */
+    Py_XDECREF(__pyx_v_value);
+  }
+  __pyx_L3:;
+
+  /* "cpython/contextvars.pxd":126
+ *         pyvalue = <object>value
+ *         Py_XDECREF(value)  # PyContextVar_Get() returned an owned reference as 'PyObject*'
+ *     return pyvalue             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_pyvalue);
+  __pyx_r = __pyx_v_pyvalue;
+  goto __pyx_L0;
+
+  /* "cpython/contextvars.pxd":112
+ * 
+ * 
+ * cdef inline object get_value(var, default_value=None):             # <<<<<<<<<<<<<<
+ *     """Return a new reference to the value of the context variable,
+ *     or the default value of the context variable,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("cpython.contextvars.get_value", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_pyvalue);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "cpython/contextvars.pxd":129
+ * 
+ * 
+ * cdef inline object get_value_no_default(var, default_value=None):             # <<<<<<<<<<<<<<
+ *     """Return a new reference to the value of the context variable,
+ *     or the provided default value if no such value was found.
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_7cpython_11contextvars_get_value_no_default(PyObject *__pyx_v_var, struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default *__pyx_optional_args) {
+  PyObject *__pyx_v_default_value = ((PyObject *)Py_None);
+  PyObject *__pyx_v_value;
+  PyObject *__pyx_v_pyvalue = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_value_no_default", 1);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_default_value = __pyx_optional_args->default_value;
+    }
+  }
+
+  /* "cpython/contextvars.pxd":135
+ *     Ignores the default value of the context variable, if any.
+ *     """
+ *     cdef PyObject *value = NULL             # <<<<<<<<<<<<<<
+ *     PyContextVar_Get(var, <PyObject*>default_value, &value)
+ *     # value of context variable or 'default_value'
+ */
+  __pyx_v_value = NULL;
+
+  /* "cpython/contextvars.pxd":136
+ *     """
+ *     cdef PyObject *value = NULL
+ *     PyContextVar_Get(var, <PyObject*>default_value, &value)             # <<<<<<<<<<<<<<
+ *     # value of context variable or 'default_value'
+ *     pyvalue = <object>value
+ */
+  __pyx_t_1 = PyContextVar_Get(__pyx_v_var, ((PyObject *)__pyx_v_default_value), (&__pyx_v_value)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(11, 136, __pyx_L1_error)
+
+  /* "cpython/contextvars.pxd":138
+ *     PyContextVar_Get(var, <PyObject*>default_value, &value)
+ *     # value of context variable or 'default_value'
+ *     pyvalue = <object>value             # <<<<<<<<<<<<<<
+ *     Py_XDECREF(value)  # PyContextVar_Get() returned an owned reference as 'PyObject*'
+ *     return pyvalue
+ */
+  __pyx_t_2 = ((PyObject *)__pyx_v_value);
+  __Pyx_INCREF(__pyx_t_2);
+  __pyx_v_pyvalue = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "cpython/contextvars.pxd":139
+ *     # value of context variable or 'default_value'
+ *     pyvalue = <object>value
+ *     Py_XDECREF(value)  # PyContextVar_Get() returned an owned reference as 'PyObject*'             # <<<<<<<<<<<<<<
+ *     return pyvalue
+ */
+  Py_XDECREF(__pyx_v_value);
+
+  /* "cpython/contextvars.pxd":140
+ *     pyvalue = <object>value
+ *     Py_XDECREF(value)  # PyContextVar_Get() returned an owned reference as 'PyObject*'
+ *     return pyvalue             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_pyvalue);
+  __pyx_r = __pyx_v_pyvalue;
+  goto __pyx_L0;
+
+  /* "cpython/contextvars.pxd":129
+ * 
+ * 
+ * cdef inline object get_value_no_default(var, default_value=None):             # <<<<<<<<<<<<<<
+ *     """Return a new reference to the value of the context variable,
+ *     or the provided default value if no such value was found.
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("cpython.contextvars.get_value_no_default", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_pyvalue);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":18
+ * # This function will ascii encode unicode string inputs if necessary.
+ * # In Python3, unicode strings are the default str type.
+ * cdef bytes str_to_bytes(object s):             # <<<<<<<<<<<<<<
+ *   if s is None or isinstance(s, bytes):
+ *     return s
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_str_to_bytes(PyObject *__pyx_v_s) {
+  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;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("str_to_bytes", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":19
+ * # In Python3, unicode strings are the default str type.
+ * cdef bytes str_to_bytes(object s):
+ *   if s is None or isinstance(s, bytes):             # <<<<<<<<<<<<<<
+ *     return s
+ *   elif isinstance(s, unicode):
+ */
+  __pyx_t_2 = (__pyx_v_s == Py_None);
+  if (!__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_2 = PyBytes_Check(__pyx_v_s); 
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L4_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":20
+ * cdef bytes str_to_bytes(object s):
+ *   if s is None or isinstance(s, bytes):
+ *     return s             # <<<<<<<<<<<<<<
+ *   elif isinstance(s, unicode):
+ *     return s.encode('ascii')
+ */
+    __Pyx_XDECREF(__pyx_r);
+    if (!(likely(PyBytes_CheckExact(__pyx_v_s))||((__pyx_v_s) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_s))) __PYX_ERR(2, 20, __pyx_L1_error)
+    __Pyx_INCREF(__pyx_v_s);
+    __pyx_r = ((PyObject*)__pyx_v_s);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":19
+ * # In Python3, unicode strings are the default str type.
+ * cdef bytes str_to_bytes(object s):
+ *   if s is None or isinstance(s, bytes):             # <<<<<<<<<<<<<<
+ *     return s
+ *   elif isinstance(s, unicode):
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":21
+ *   if s is None or isinstance(s, bytes):
+ *     return s
+ *   elif isinstance(s, unicode):             # <<<<<<<<<<<<<<
+ *     return s.encode('ascii')
+ *   else:
+ */
+  __pyx_t_1 = PyUnicode_Check(__pyx_v_s); 
+  if (likely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":22
+ *     return s
+ *   elif isinstance(s, unicode):
+ *     return s.encode('ascii')             # <<<<<<<<<<<<<<
+ *   else:
+ *     raise TypeError('Expected bytes, str, or unicode, not {}'.format(type(s)))
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_s, __pyx_n_s_encode); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 22, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_n_s_ascii};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 22, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(2, 22, __pyx_L1_error)
+    __pyx_r = ((PyObject*)__pyx_t_3);
+    __pyx_t_3 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":21
+ *   if s is None or isinstance(s, bytes):
+ *     return s
+ *   elif isinstance(s, unicode):             # <<<<<<<<<<<<<<
+ *     return s.encode('ascii')
+ *   else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":24
+ *     return s.encode('ascii')
+ *   else:
+ *     raise TypeError('Expected bytes, str, or unicode, not {}'.format(type(s)))             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Expected_bytes_str_or_unicode_no, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 24, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_5, ((PyObject *)Py_TYPE(__pyx_v_s))};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 24, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 24, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __PYX_ERR(2, 24, __pyx_L1_error)
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":18
+ * # This function will ascii encode unicode string inputs if necessary.
+ * # In Python3, unicode strings are the default str type.
+ * cdef bytes str_to_bytes(object s):             # <<<<<<<<<<<<<<
+ *   if s is None or isinstance(s, bytes):
+ *     return s
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc.str_to_bytes", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":32
+ * # parameter rather than "object"), but would it be nice for our users? Right
+ * # now we haven't yet heard from enough users to know one way or another.
+ * cdef bytes _encode(object string_or_none):             # <<<<<<<<<<<<<<
+ *   if string_or_none is None:
+ *     return b''
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__encode(PyObject *__pyx_v_string_or_none) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_encode", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":33
+ * # now we haven't yet heard from enough users to know one way or another.
+ * cdef bytes _encode(object string_or_none):
+ *   if string_or_none is None:             # <<<<<<<<<<<<<<
+ *     return b''
+ *   elif isinstance(string_or_none, (bytes,)):
+ */
+  __pyx_t_1 = (__pyx_v_string_or_none == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":34
+ * cdef bytes _encode(object string_or_none):
+ *   if string_or_none is None:
+ *     return b''             # <<<<<<<<<<<<<<
+ *   elif isinstance(string_or_none, (bytes,)):
+ *     return <bytes>string_or_none
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(__pyx_kp_b__7);
+    __pyx_r = __pyx_kp_b__7;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":33
+ * # now we haven't yet heard from enough users to know one way or another.
+ * cdef bytes _encode(object string_or_none):
+ *   if string_or_none is None:             # <<<<<<<<<<<<<<
+ *     return b''
+ *   elif isinstance(string_or_none, (bytes,)):
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":35
+ *   if string_or_none is None:
+ *     return b''
+ *   elif isinstance(string_or_none, (bytes,)):             # <<<<<<<<<<<<<<
+ *     return <bytes>string_or_none
+ *   elif isinstance(string_or_none, (unicode,)):
+ */
+  __pyx_t_1 = PyBytes_Check(__pyx_v_string_or_none); 
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":36
+ *     return b''
+ *   elif isinstance(string_or_none, (bytes,)):
+ *     return <bytes>string_or_none             # <<<<<<<<<<<<<<
+ *   elif isinstance(string_or_none, (unicode,)):
+ *     return string_or_none.encode('utf8')
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(((PyObject*)__pyx_v_string_or_none));
+    __pyx_r = ((PyObject*)__pyx_v_string_or_none);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":35
+ *   if string_or_none is None:
+ *     return b''
+ *   elif isinstance(string_or_none, (bytes,)):             # <<<<<<<<<<<<<<
+ *     return <bytes>string_or_none
+ *   elif isinstance(string_or_none, (unicode,)):
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":37
+ *   elif isinstance(string_or_none, (bytes,)):
+ *     return <bytes>string_or_none
+ *   elif isinstance(string_or_none, (unicode,)):             # <<<<<<<<<<<<<<
+ *     return string_or_none.encode('utf8')
+ *   else:
+ */
+  __pyx_t_1 = PyUnicode_Check(__pyx_v_string_or_none); 
+  if (likely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":38
+ *     return <bytes>string_or_none
+ *   elif isinstance(string_or_none, (unicode,)):
+ *     return string_or_none.encode('utf8')             # <<<<<<<<<<<<<<
+ *   else:
+ *     raise TypeError('Expected str, not {}'.format(type(string_or_none)))
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_string_or_none, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 38, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_n_s_utf8};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 38, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    if (!(likely(PyBytes_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_2))) __PYX_ERR(2, 38, __pyx_L1_error)
+    __pyx_r = ((PyObject*)__pyx_t_2);
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":37
+ *   elif isinstance(string_or_none, (bytes,)):
+ *     return <bytes>string_or_none
+ *   elif isinstance(string_or_none, (unicode,)):             # <<<<<<<<<<<<<<
+ *     return string_or_none.encode('utf8')
+ *   else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":40
+ *     return string_or_none.encode('utf8')
+ *   else:
+ *     raise TypeError('Expected str, not {}'.format(type(string_or_none)))             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Expected_str_not, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 40, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, ((PyObject *)Py_TYPE(__pyx_v_string_or_none))};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 40, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 40, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __PYX_ERR(2, 40, __pyx_L1_error)
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":32
+ * # parameter rather than "object"), but would it be nice for our users? Right
+ * # now we haven't yet heard from enough users to know one way or another.
+ * cdef bytes _encode(object string_or_none):             # <<<<<<<<<<<<<<
+ *   if string_or_none is None:
+ *     return b''
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._encode", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":43
+ * 
+ * 
+ * cdef str _decode(bytes bytestring):             # <<<<<<<<<<<<<<
+ *     if isinstance(bytestring, (str,)):
+ *         return <str>bytestring
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__decode(PyObject *__pyx_v_bytestring) {
+  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;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  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;
+  unsigned int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_decode", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":44
+ * 
+ * cdef str _decode(bytes bytestring):
+ *     if isinstance(bytestring, (str,)):             # <<<<<<<<<<<<<<
+ *         return <str>bytestring
+ *     else:
+ */
+  __pyx_t_1 = PyString_Check(__pyx_v_bytestring); 
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":45
+ * cdef str _decode(bytes bytestring):
+ *     if isinstance(bytestring, (str,)):
+ *         return <str>bytestring             # <<<<<<<<<<<<<<
+ *     else:
+ *         try:
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(((PyObject*)__pyx_v_bytestring));
+    __pyx_r = ((PyObject*)__pyx_v_bytestring);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":44
+ * 
+ * cdef str _decode(bytes bytestring):
+ *     if isinstance(bytestring, (str,)):             # <<<<<<<<<<<<<<
+ *         return <str>bytestring
+ *     else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":47
+ *         return <str>bytestring
+ *     else:
+ *         try:             # <<<<<<<<<<<<<<
+ *             return bytestring.decode('utf8')
+ *         except UnicodeDecodeError:
+ */
+  /*else*/ {
+    {
+      __Pyx_PyThreadState_declare
+      __Pyx_PyThreadState_assign
+      __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4);
+      __Pyx_XGOTREF(__pyx_t_2);
+      __Pyx_XGOTREF(__pyx_t_3);
+      __Pyx_XGOTREF(__pyx_t_4);
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":48
+ *     else:
+ *         try:
+ *             return bytestring.decode('utf8')             # <<<<<<<<<<<<<<
+ *         except UnicodeDecodeError:
+ *             _LOGGER.exception('Invalid encoding on %s', bytestring)
+ */
+        __Pyx_XDECREF(__pyx_r);
+        if (unlikely(__pyx_v_bytestring == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode");
+          __PYX_ERR(2, 48, __pyx_L4_error)
+        }
+        __pyx_t_5 = __Pyx_decode_bytes(__pyx_v_bytestring, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 48, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_5);
+        if (!(likely(PyString_CheckExact(__pyx_t_5)) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_5))) __PYX_ERR(2, 48, __pyx_L4_error)
+        __pyx_r = ((PyObject*)__pyx_t_5);
+        __pyx_t_5 = 0;
+        goto __pyx_L8_try_return;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":47
+ *         return <str>bytestring
+ *     else:
+ *         try:             # <<<<<<<<<<<<<<
+ *             return bytestring.decode('utf8')
+ *         except UnicodeDecodeError:
+ */
+      }
+      __pyx_L4_error:;
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":49
+ *         try:
+ *             return bytestring.decode('utf8')
+ *         except UnicodeDecodeError:             # <<<<<<<<<<<<<<
+ *             _LOGGER.exception('Invalid encoding on %s', bytestring)
+ *             return bytestring.decode('latin1')
+ */
+      __pyx_t_6 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_UnicodeDecodeError);
+      if (__pyx_t_6) {
+        __Pyx_AddTraceback("_cython.cygrpc._decode", __pyx_clineno, __pyx_lineno, __pyx_filename);
+        if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(2, 49, __pyx_L6_except_error)
+        __Pyx_XGOTREF(__pyx_t_5);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":50
+ *             return bytestring.decode('utf8')
+ *         except UnicodeDecodeError:
+ *             _LOGGER.exception('Invalid encoding on %s', bytestring)             # <<<<<<<<<<<<<<
+ *             return bytestring.decode('latin1')
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 50, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_exception); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 50, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __pyx_t_10 = NULL;
+        __pyx_t_12 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_11))) {
+          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11);
+          if (likely(__pyx_t_10)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
+            __Pyx_INCREF(__pyx_t_10);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_11, function);
+            __pyx_t_12 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[3] = {__pyx_t_10, __pyx_kp_s_Invalid_encoding_on_s, __pyx_v_bytestring};
+          __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_12, 2+__pyx_t_12);
+          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 50, __pyx_L6_except_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":51
+ *         except UnicodeDecodeError:
+ *             _LOGGER.exception('Invalid encoding on %s', bytestring)
+ *             return bytestring.decode('latin1')             # <<<<<<<<<<<<<<
+ */
+        __Pyx_XDECREF(__pyx_r);
+        if (unlikely(__pyx_v_bytestring == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode");
+          __PYX_ERR(2, 51, __pyx_L6_except_error)
+        }
+        __pyx_t_9 = __Pyx_decode_bytes(__pyx_v_bytestring, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 51, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_9);
+        if (!(likely(PyString_CheckExact(__pyx_t_9)) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_9))) __PYX_ERR(2, 51, __pyx_L6_except_error)
+        __pyx_r = ((PyObject*)__pyx_t_9);
+        __pyx_t_9 = 0;
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L7_except_return;
+      }
+      goto __pyx_L6_except_error;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":47
+ *         return <str>bytestring
+ *     else:
+ *         try:             # <<<<<<<<<<<<<<
+ *             return bytestring.decode('utf8')
+ *         except UnicodeDecodeError:
+ */
+      __pyx_L6_except_error:;
+      __Pyx_XGIVEREF(__pyx_t_2);
+      __Pyx_XGIVEREF(__pyx_t_3);
+      __Pyx_XGIVEREF(__pyx_t_4);
+      __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4);
+      goto __pyx_L1_error;
+      __pyx_L8_try_return:;
+      __Pyx_XGIVEREF(__pyx_t_2);
+      __Pyx_XGIVEREF(__pyx_t_3);
+      __Pyx_XGIVEREF(__pyx_t_4);
+      __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4);
+      goto __pyx_L0;
+      __pyx_L7_except_return:;
+      __Pyx_XGIVEREF(__pyx_t_2);
+      __Pyx_XGIVEREF(__pyx_t_3);
+      __Pyx_XGIVEREF(__pyx_t_4);
+      __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4);
+      goto __pyx_L0;
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_string.pyx.pxi":43
+ * 
+ * 
+ * cdef str _decode(bytes bytestring):             # <<<<<<<<<<<<<<
+ *     if isinstance(bytestring, (str,)):
+ *         return <str>bytestring
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_5);
+  __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("_cython.cygrpc._decode", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_GrpcArgWrapper_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15_GrpcArgWrapper_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_GrpcArgWrapper_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_GrpcArgWrapper_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_GrpcArgWrapper___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_GrpcArgWrapper___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self_arg_cannot_be_converted_to, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._GrpcArgWrapper.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_GrpcArgWrapper_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15_GrpcArgWrapper_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_GrpcArgWrapper_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_GrpcArgWrapper_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._GrpcArgWrapper.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_GrpcArgWrapper_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_GrpcArgWrapper_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self_arg_cannot_be_converted_to, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._GrpcArgWrapper.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":21
+ * 
+ * 
+ * cdef tuple _wrap_grpc_arg(grpc_arg arg):             # <<<<<<<<<<<<<<
+ *   wrapped = _GrpcArgWrapper()
+ *   wrapped.arg = arg
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__wrap_grpc_arg(grpc_arg __pyx_v_arg) {
+  struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *__pyx_v_wrapped = NULL;
+  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("_wrap_grpc_arg", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":22
+ * 
+ * cdef tuple _wrap_grpc_arg(grpc_arg arg):
+ *   wrapped = _GrpcArgWrapper()             # <<<<<<<<<<<<<<
+ *   wrapped.arg = arg
+ *   return ("grpc.python._cygrpc._GrpcArgWrapper", wrapped)
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper)); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_wrapped = ((struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":23
+ * cdef tuple _wrap_grpc_arg(grpc_arg arg):
+ *   wrapped = _GrpcArgWrapper()
+ *   wrapped.arg = arg             # <<<<<<<<<<<<<<
+ *   return ("grpc.python._cygrpc._GrpcArgWrapper", wrapped)
+ * 
+ */
+  __pyx_v_wrapped->arg = __pyx_v_arg;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":24
+ *   wrapped = _GrpcArgWrapper()
+ *   wrapped.arg = arg
+ *   return ("grpc.python._cygrpc._GrpcArgWrapper", wrapped)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap);
+  __Pyx_GIVEREF(__pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap)) __PYX_ERR(3, 24, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_wrapped);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_wrapped);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_wrapped))) __PYX_ERR(3, 24, __pyx_L1_error);
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":21
+ * 
+ * 
+ * cdef tuple _wrap_grpc_arg(grpc_arg arg):             # <<<<<<<<<<<<<<
+ *   wrapped = _GrpcArgWrapper()
+ *   wrapped.arg = arg
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._wrap_grpc_arg", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_wrapped);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":27
+ * 
+ * 
+ * cdef grpc_arg _unwrap_grpc_arg(tuple wrapped_arg):             # <<<<<<<<<<<<<<
+ *   cdef _GrpcArgWrapper wrapped = wrapped_arg[1]
+ *   return wrapped.arg
+ */
+
+static grpc_arg __pyx_f_7_cython_6cygrpc__unwrap_grpc_arg(PyObject *__pyx_v_wrapped_arg) {
+  struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *__pyx_v_wrapped = 0;
+  grpc_arg __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_unwrap_grpc_arg", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":28
+ * 
+ * cdef grpc_arg _unwrap_grpc_arg(tuple wrapped_arg):
+ *   cdef _GrpcArgWrapper wrapped = wrapped_arg[1]             # <<<<<<<<<<<<<<
+ *   return wrapped.arg
+ * 
+ */
+  if (unlikely(__pyx_v_wrapped_arg == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(3, 28, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v_wrapped_arg, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper))))) __PYX_ERR(3, 28, __pyx_L1_error)
+  __pyx_v_wrapped = ((struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":29
+ * cdef grpc_arg _unwrap_grpc_arg(tuple wrapped_arg):
+ *   cdef _GrpcArgWrapper wrapped = wrapped_arg[1]
+ *   return wrapped.arg             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_wrapped->arg;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":27
+ * 
+ * 
+ * cdef grpc_arg _unwrap_grpc_arg(tuple wrapped_arg):             # <<<<<<<<<<<<<<
+ *   cdef _GrpcArgWrapper wrapped = wrapped_arg[1]
+ *   return wrapped.arg
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._unwrap_grpc_arg", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_pretend_to_initialize(&__pyx_r);
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_wrapped);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":34
+ * cdef class _ChannelArg:
+ * 
+ *   cdef void c(self, argument, references) except *:             # <<<<<<<<<<<<<<
+ *     key, value = argument
+ *     cdef bytes encoded_key = _encode(key)
+ */
+
+static void __pyx_f_7_cython_6cygrpc_11_ChannelArg_c(struct __pyx_obj_7_cython_6cygrpc__ChannelArg *__pyx_v_self, PyObject *__pyx_v_argument, PyObject *__pyx_v_references) {
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_value = NULL;
+  PyObject *__pyx_v_encoded_key = 0;
+  PyObject *__pyx_v_encoded_value = 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_t_6;
+  char *__pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_t_9;
+  grpc_arg __pyx_t_10;
+  __pyx_t_7_cython_6cygrpc_intptr_t __pyx_t_11;
+  unsigned int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":35
+ * 
+ *   cdef void c(self, argument, references) except *:
+ *     key, value = argument             # <<<<<<<<<<<<<<
+ *     cdef bytes encoded_key = _encode(key)
+ *     if encoded_key is not key:
+ */
+  if ((likely(PyTuple_CheckExact(__pyx_v_argument))) || (PyList_CheckExact(__pyx_v_argument))) {
+    PyObject* sequence = __pyx_v_argument;
+    Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+    if (unlikely(size != 2)) {
+      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+      __PYX_ERR(3, 35, __pyx_L1_error)
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    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_ERR(3, 35, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 35, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    #endif
+  } else {
+    Py_ssize_t index = -1;
+    __pyx_t_3 = PyObject_GetIter(__pyx_v_argument); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 35, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_3);
+    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_ERR(3, 35, __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_ERR(3, 35, __pyx_L1_error)
+    __pyx_L4_unpacking_done:;
+  }
+  __pyx_v_key = __pyx_t_1;
+  __pyx_t_1 = 0;
+  __pyx_v_value = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":36
+ *   cdef void c(self, argument, references) except *:
+ *     key, value = argument
+ *     cdef bytes encoded_key = _encode(key)             # <<<<<<<<<<<<<<
+ *     if encoded_key is not key:
+ *       references.append(encoded_key)
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__encode(__pyx_v_key); if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_v_encoded_key = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":37
+ *     key, value = argument
+ *     cdef bytes encoded_key = _encode(key)
+ *     if encoded_key is not key:             # <<<<<<<<<<<<<<
+ *       references.append(encoded_key)
+ *     self.c_argument.key = encoded_key
+ */
+  __pyx_t_5 = (__pyx_v_encoded_key != ((PyObject*)__pyx_v_key));
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":38
+ *     cdef bytes encoded_key = _encode(key)
+ *     if encoded_key is not key:
+ *       references.append(encoded_key)             # <<<<<<<<<<<<<<
+ *     self.c_argument.key = encoded_key
+ *     if isinstance(value, int):
+ */
+    __pyx_t_6 = __Pyx_PyObject_Append(__pyx_v_references, __pyx_v_encoded_key); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(3, 38, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":37
+ *     key, value = argument
+ *     cdef bytes encoded_key = _encode(key)
+ *     if encoded_key is not key:             # <<<<<<<<<<<<<<
+ *       references.append(encoded_key)
+ *     self.c_argument.key = encoded_key
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":39
+ *     if encoded_key is not key:
+ *       references.append(encoded_key)
+ *     self.c_argument.key = encoded_key             # <<<<<<<<<<<<<<
+ *     if isinstance(value, int):
+ *       self.c_argument.type = GRPC_ARG_INTEGER
+ */
+  if (unlikely(__pyx_v_encoded_key == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+    __PYX_ERR(3, 39, __pyx_L1_error)
+  }
+  __pyx_t_7 = __Pyx_PyBytes_AsWritableString(__pyx_v_encoded_key); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(3, 39, __pyx_L1_error)
+  __pyx_v_self->c_argument.key = __pyx_t_7;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":40
+ *       references.append(encoded_key)
+ *     self.c_argument.key = encoded_key
+ *     if isinstance(value, int):             # <<<<<<<<<<<<<<
+ *       self.c_argument.type = GRPC_ARG_INTEGER
+ *       self.c_argument.value.integer = value
+ */
+  __pyx_t_5 = PyInt_Check(__pyx_v_value); 
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":41
+ *     self.c_argument.key = encoded_key
+ *     if isinstance(value, int):
+ *       self.c_argument.type = GRPC_ARG_INTEGER             # <<<<<<<<<<<<<<
+ *       self.c_argument.value.integer = value
+ *     elif isinstance(value, (bytes, str, unicode,)):
+ */
+    __pyx_v_self->c_argument.type = GRPC_ARG_INTEGER;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":42
+ *     if isinstance(value, int):
+ *       self.c_argument.type = GRPC_ARG_INTEGER
+ *       self.c_argument.value.integer = value             # <<<<<<<<<<<<<<
+ *     elif isinstance(value, (bytes, str, unicode,)):
+ *       self.c_argument.type = GRPC_ARG_STRING
+ */
+    __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_v_value); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(3, 42, __pyx_L1_error)
+    __pyx_v_self->c_argument.value.integer = __pyx_t_8;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":40
+ *       references.append(encoded_key)
+ *     self.c_argument.key = encoded_key
+ *     if isinstance(value, int):             # <<<<<<<<<<<<<<
+ *       self.c_argument.type = GRPC_ARG_INTEGER
+ *       self.c_argument.value.integer = value
+ */
+    goto __pyx_L6;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":43
+ *       self.c_argument.type = GRPC_ARG_INTEGER
+ *       self.c_argument.value.integer = value
+ *     elif isinstance(value, (bytes, str, unicode,)):             # <<<<<<<<<<<<<<
+ *       self.c_argument.type = GRPC_ARG_STRING
+ *       encoded_value = _encode(value)
+ */
+  __pyx_t_9 = PyBytes_Check(__pyx_v_value); 
+  if (!__pyx_t_9) {
+  } else {
+    __pyx_t_5 = __pyx_t_9;
+    goto __pyx_L7_bool_binop_done;
+  }
+  __pyx_t_9 = PyString_Check(__pyx_v_value); 
+  if (!__pyx_t_9) {
+  } else {
+    __pyx_t_5 = __pyx_t_9;
+    goto __pyx_L7_bool_binop_done;
+  }
+  __pyx_t_9 = PyUnicode_Check(__pyx_v_value); 
+  __pyx_t_5 = __pyx_t_9;
+  __pyx_L7_bool_binop_done:;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":44
+ *       self.c_argument.value.integer = value
+ *     elif isinstance(value, (bytes, str, unicode,)):
+ *       self.c_argument.type = GRPC_ARG_STRING             # <<<<<<<<<<<<<<
+ *       encoded_value = _encode(value)
+ *       if encoded_value is not value:
+ */
+    __pyx_v_self->c_argument.type = GRPC_ARG_STRING;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":45
+ *     elif isinstance(value, (bytes, str, unicode,)):
+ *       self.c_argument.type = GRPC_ARG_STRING
+ *       encoded_value = _encode(value)             # <<<<<<<<<<<<<<
+ *       if encoded_value is not value:
+ *         references.append(encoded_value)
+ */
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc__encode(__pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 45, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_v_encoded_value = ((PyObject*)__pyx_t_2);
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":46
+ *       self.c_argument.type = GRPC_ARG_STRING
+ *       encoded_value = _encode(value)
+ *       if encoded_value is not value:             # <<<<<<<<<<<<<<
+ *         references.append(encoded_value)
+ *       self.c_argument.value.string = encoded_value
+ */
+    __pyx_t_5 = (__pyx_v_encoded_value != ((PyObject*)__pyx_v_value));
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":47
+ *       encoded_value = _encode(value)
+ *       if encoded_value is not value:
+ *         references.append(encoded_value)             # <<<<<<<<<<<<<<
+ *       self.c_argument.value.string = encoded_value
+ *     elif isinstance(value, _GrpcArgWrapper):
+ */
+      __pyx_t_6 = __Pyx_PyObject_Append(__pyx_v_references, __pyx_v_encoded_value); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(3, 47, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":46
+ *       self.c_argument.type = GRPC_ARG_STRING
+ *       encoded_value = _encode(value)
+ *       if encoded_value is not value:             # <<<<<<<<<<<<<<
+ *         references.append(encoded_value)
+ *       self.c_argument.value.string = encoded_value
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":48
+ *       if encoded_value is not value:
+ *         references.append(encoded_value)
+ *       self.c_argument.value.string = encoded_value             # <<<<<<<<<<<<<<
+ *     elif isinstance(value, _GrpcArgWrapper):
+ *       self.c_argument = (<_GrpcArgWrapper>value).arg
+ */
+    if (unlikely(__pyx_v_encoded_value == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+      __PYX_ERR(3, 48, __pyx_L1_error)
+    }
+    __pyx_t_7 = __Pyx_PyBytes_AsWritableString(__pyx_v_encoded_value); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(3, 48, __pyx_L1_error)
+    __pyx_v_self->c_argument.value.string = __pyx_t_7;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":43
+ *       self.c_argument.type = GRPC_ARG_INTEGER
+ *       self.c_argument.value.integer = value
+ *     elif isinstance(value, (bytes, str, unicode,)):             # <<<<<<<<<<<<<<
+ *       self.c_argument.type = GRPC_ARG_STRING
+ *       encoded_value = _encode(value)
+ */
+    goto __pyx_L6;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":49
+ *         references.append(encoded_value)
+ *       self.c_argument.value.string = encoded_value
+ *     elif isinstance(value, _GrpcArgWrapper):             # <<<<<<<<<<<<<<
+ *       self.c_argument = (<_GrpcArgWrapper>value).arg
+ *     elif hasattr(value, '__int__'):
+ */
+  __pyx_t_5 = __Pyx_TypeCheck(__pyx_v_value, __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper); 
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":50
+ *       self.c_argument.value.string = encoded_value
+ *     elif isinstance(value, _GrpcArgWrapper):
+ *       self.c_argument = (<_GrpcArgWrapper>value).arg             # <<<<<<<<<<<<<<
+ *     elif hasattr(value, '__int__'):
+ *       # Pointer objects must override __int__() to return
+ */
+    __pyx_t_10 = ((struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *)__pyx_v_value)->arg;
+    __pyx_v_self->c_argument = __pyx_t_10;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":49
+ *         references.append(encoded_value)
+ *       self.c_argument.value.string = encoded_value
+ *     elif isinstance(value, _GrpcArgWrapper):             # <<<<<<<<<<<<<<
+ *       self.c_argument = (<_GrpcArgWrapper>value).arg
+ *     elif hasattr(value, '__int__'):
+ */
+    goto __pyx_L6;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":51
+ *     elif isinstance(value, _GrpcArgWrapper):
+ *       self.c_argument = (<_GrpcArgWrapper>value).arg
+ *     elif hasattr(value, '__int__'):             # <<<<<<<<<<<<<<
+ *       # Pointer objects must override __int__() to return
+ *       # the underlying C address (Python ints are word size). The
+ */
+  __pyx_t_5 = __Pyx_HasAttr(__pyx_v_value, __pyx_n_s_int); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(3, 51, __pyx_L1_error)
+  if (likely(__pyx_t_5)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":56
+ *       # lifecycle of the pointer is fixed to the lifecycle of the
+ *       # python object wrapping it.
+ *       self.c_argument.type = GRPC_ARG_POINTER             # <<<<<<<<<<<<<<
+ *       self.c_argument.value.pointer.vtable = &default_vtable
+ *       self.c_argument.value.pointer.address = <void*>(<intptr_t>int(value))
+ */
+    __pyx_v_self->c_argument.type = GRPC_ARG_POINTER;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":57
+ *       # python object wrapping it.
+ *       self.c_argument.type = GRPC_ARG_POINTER
+ *       self.c_argument.value.pointer.vtable = &default_vtable             # <<<<<<<<<<<<<<
+ *       self.c_argument.value.pointer.address = <void*>(<intptr_t>int(value))
+ *     else:
+ */
+    __pyx_v_self->c_argument.value.pointer.vtable = (&__pyx_v_7_cython_6cygrpc_default_vtable);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":58
+ *       self.c_argument.type = GRPC_ARG_POINTER
+ *       self.c_argument.value.pointer.vtable = &default_vtable
+ *       self.c_argument.value.pointer.address = <void*>(<intptr_t>int(value))             # <<<<<<<<<<<<<<
+ *     else:
+ *       raise TypeError(
+ */
+    __pyx_t_2 = __Pyx_PyNumber_Int(__pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 58, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_11 = PyInt_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(3, 58, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_v_self->c_argument.value.pointer.p = ((void *)((__pyx_t_7_cython_6cygrpc_intptr_t)__pyx_t_11));
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":51
+ *     elif isinstance(value, _GrpcArgWrapper):
+ *       self.c_argument = (<_GrpcArgWrapper>value).arg
+ *     elif hasattr(value, '__int__'):             # <<<<<<<<<<<<<<
+ *       # Pointer objects must override __int__() to return
+ *       # the underlying C address (Python ints are word size). The
+ */
+    goto __pyx_L6;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":60
+ *       self.c_argument.value.pointer.address = <void*>(<intptr_t>int(value))
+ *     else:
+ *       raise TypeError(             # <<<<<<<<<<<<<<
+ *           'Expected int, bytes, or behavior, got {}'.format(type(value)))
+ * 
+ */
+  /*else*/ {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":61
+ *     else:
+ *       raise TypeError(
+ *           'Expected int, bytes, or behavior, got {}'.format(type(value)))             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Expected_int_bytes_or_behavior_g, __pyx_n_s_format); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 61, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = NULL;
+    __pyx_t_12 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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_12 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, ((PyObject *)Py_TYPE(__pyx_v_value))};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 61, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":60
+ *       self.c_argument.value.pointer.address = <void*>(<intptr_t>int(value))
+ *     else:
+ *       raise TypeError(             # <<<<<<<<<<<<<<
+ *           'Expected int, bytes, or behavior, got {}'.format(type(value)))
+ * 
+ */
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 60, __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_ERR(3, 60, __pyx_L1_error)
+  }
+  __pyx_L6:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":34
+ * cdef class _ChannelArg:
+ * 
+ *   cdef void c(self, argument, references) except *:             # <<<<<<<<<<<<<<
+ *     key, value = argument
+ *     cdef bytes encoded_key = _encode(key)
+ */
+
+  /* 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_AddTraceback("_cython.cygrpc._ChannelArg.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_key);
+  __Pyx_XDECREF(__pyx_v_value);
+  __Pyx_XDECREF(__pyx_v_encoded_key);
+  __Pyx_XDECREF(__pyx_v_encoded_value);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_11_ChannelArg_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_11_ChannelArg_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11_ChannelArg_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_11_ChannelArg_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_11_ChannelArg___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__ChannelArg *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_11_ChannelArg___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelArg *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self_c_argument_cannot_be_conver, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelArg.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_11_ChannelArg_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_11_ChannelArg_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11_ChannelArg_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_11_ChannelArg_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelArg.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_11_ChannelArg_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__ChannelArg *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_11_ChannelArg_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelArg *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self_c_argument_cannot_be_conver, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelArg.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":66
+ * cdef class _ChannelArgs:
+ * 
+ *   def __cinit__(self, arguments):             # <<<<<<<<<<<<<<
+ *     self._arguments = () if arguments is None else tuple(arguments)
+ *     self._channel_args = []
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_12_ChannelArgs_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_12_ChannelArgs_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_arguments = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_arguments,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arguments)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(3, 66, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(3, 66, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_arguments = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(3, 66, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelArgs.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12_ChannelArgs___cinit__(((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_v_self), __pyx_v_arguments);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_12_ChannelArgs___cinit__(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self, PyObject *__pyx_v_arguments) {
+  PyObject *__pyx_v_index = NULL;
+  PyObject *__pyx_v_argument = NULL;
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArg *__pyx_v_channel_arg = NULL;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  grpc_arg __pyx_t_6;
+  Py_ssize_t __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":67
+ * 
+ *   def __cinit__(self, arguments):
+ *     self._arguments = () if arguments is None else tuple(arguments)             # <<<<<<<<<<<<<<
+ *     self._channel_args = []
+ *     self._references = []
+ */
+  __pyx_t_2 = (__pyx_v_arguments == Py_None);
+  if (__pyx_t_2) {
+    __Pyx_INCREF(__pyx_empty_tuple);
+    __pyx_t_1 = __pyx_empty_tuple;
+  } else {
+    __pyx_t_3 = __Pyx_PySequence_Tuple(__pyx_v_arguments); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 67, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __pyx_t_3;
+    __pyx_t_3 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_arguments);
+  __Pyx_DECREF(__pyx_v_self->_arguments);
+  __pyx_v_self->_arguments = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":68
+ *   def __cinit__(self, arguments):
+ *     self._arguments = () if arguments is None else tuple(arguments)
+ *     self._channel_args = []             # <<<<<<<<<<<<<<
+ *     self._references = []
+ *     self._c_arguments.arguments_length = len(self._arguments)
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 68, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_channel_args);
+  __Pyx_DECREF(__pyx_v_self->_channel_args);
+  __pyx_v_self->_channel_args = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":69
+ *     self._arguments = () if arguments is None else tuple(arguments)
+ *     self._channel_args = []
+ *     self._references = []             # <<<<<<<<<<<<<<
+ *     self._c_arguments.arguments_length = len(self._arguments)
+ *     if self._c_arguments.arguments_length != 0:
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_references);
+  __Pyx_DECREF(__pyx_v_self->_references);
+  __pyx_v_self->_references = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":70
+ *     self._channel_args = []
+ *     self._references = []
+ *     self._c_arguments.arguments_length = len(self._arguments)             # <<<<<<<<<<<<<<
+ *     if self._c_arguments.arguments_length != 0:
+ *       self._c_arguments.arguments = <grpc_arg *>gpr_malloc(
+ */
+  __pyx_t_1 = __pyx_v_self->_arguments;
+  __Pyx_INCREF(__pyx_t_1);
+  if (unlikely(__pyx_t_1 == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+    __PYX_ERR(3, 70, __pyx_L1_error)
+  }
+  __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(3, 70, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_self->_c_arguments.num_args = __pyx_t_4;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":71
+ *     self._references = []
+ *     self._c_arguments.arguments_length = len(self._arguments)
+ *     if self._c_arguments.arguments_length != 0:             # <<<<<<<<<<<<<<
+ *       self._c_arguments.arguments = <grpc_arg *>gpr_malloc(
+ *           self._c_arguments.arguments_length * sizeof(grpc_arg))
+ */
+  __pyx_t_2 = (__pyx_v_self->_c_arguments.num_args != 0);
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":72
+ *     self._c_arguments.arguments_length = len(self._arguments)
+ *     if self._c_arguments.arguments_length != 0:
+ *       self._c_arguments.arguments = <grpc_arg *>gpr_malloc(             # <<<<<<<<<<<<<<
+ *           self._c_arguments.arguments_length * sizeof(grpc_arg))
+ *       for index, argument in enumerate(self._arguments):
+ */
+    __pyx_v_self->_c_arguments.args = ((grpc_arg *)gpr_malloc((__pyx_v_self->_c_arguments.num_args * (sizeof(grpc_arg)))));
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":74
+ *       self._c_arguments.arguments = <grpc_arg *>gpr_malloc(
+ *           self._c_arguments.arguments_length * sizeof(grpc_arg))
+ *       for index, argument in enumerate(self._arguments):             # <<<<<<<<<<<<<<
+ *         channel_arg = _ChannelArg()
+ *         channel_arg.c(argument, self._references)
+ */
+    __Pyx_INCREF(__pyx_int_0);
+    __pyx_t_1 = __pyx_int_0;
+    __pyx_t_3 = __pyx_v_self->_arguments; __Pyx_INCREF(__pyx_t_3);
+    __pyx_t_4 = 0;
+    for (;;) {
+      {
+        Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_3);
+        #if !CYTHON_ASSUME_SAFE_MACROS
+        if (unlikely((__pyx_temp < 0))) __PYX_ERR(3, 74, __pyx_L1_error)
+        #endif
+        if (__pyx_t_4 >= __pyx_temp) break;
+      }
+      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_5); __pyx_t_4++; if (unlikely((0 < 0))) __PYX_ERR(3, 74, __pyx_L1_error)
+      #else
+      __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 74, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      #endif
+      __Pyx_XDECREF_SET(__pyx_v_argument, __pyx_t_5);
+      __pyx_t_5 = 0;
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_1);
+      __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 74, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_1);
+      __pyx_t_1 = __pyx_t_5;
+      __pyx_t_5 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":75
+ *           self._c_arguments.arguments_length * sizeof(grpc_arg))
+ *       for index, argument in enumerate(self._arguments):
+ *         channel_arg = _ChannelArg()             # <<<<<<<<<<<<<<
+ *         channel_arg.c(argument, self._references)
+ *         self._c_arguments.arguments[index] = channel_arg.c_argument
+ */
+      __pyx_t_5 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ChannelArg)); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 75, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_XDECREF_SET(__pyx_v_channel_arg, ((struct __pyx_obj_7_cython_6cygrpc__ChannelArg *)__pyx_t_5));
+      __pyx_t_5 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":76
+ *       for index, argument in enumerate(self._arguments):
+ *         channel_arg = _ChannelArg()
+ *         channel_arg.c(argument, self._references)             # <<<<<<<<<<<<<<
+ *         self._c_arguments.arguments[index] = channel_arg.c_argument
+ *         self._channel_args.append(channel_arg)
+ */
+      __pyx_t_5 = __pyx_v_self->_references;
+      __Pyx_INCREF(__pyx_t_5);
+      ((struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArg *)__pyx_v_channel_arg->__pyx_vtab)->c(__pyx_v_channel_arg, __pyx_v_argument, __pyx_t_5); if (unlikely(PyErr_Occurred())) __PYX_ERR(3, 76, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":77
+ *         channel_arg = _ChannelArg()
+ *         channel_arg.c(argument, self._references)
+ *         self._c_arguments.arguments[index] = channel_arg.c_argument             # <<<<<<<<<<<<<<
+ *         self._channel_args.append(channel_arg)
+ * 
+ */
+      __pyx_t_6 = __pyx_v_channel_arg->c_argument;
+      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(3, 77, __pyx_L1_error)
+      (__pyx_v_self->_c_arguments.args[__pyx_t_7]) = __pyx_t_6;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":78
+ *         channel_arg.c(argument, self._references)
+ *         self._c_arguments.arguments[index] = channel_arg.c_argument
+ *         self._channel_args.append(channel_arg)             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_args *c_args(self) except *:
+ */
+      if (unlikely(__pyx_v_self->_channel_args == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+        __PYX_ERR(3, 78, __pyx_L1_error)
+      }
+      __pyx_t_8 = __Pyx_PyList_Append(__pyx_v_self->_channel_args, ((PyObject *)__pyx_v_channel_arg)); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(3, 78, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":74
+ *       self._c_arguments.arguments = <grpc_arg *>gpr_malloc(
+ *           self._c_arguments.arguments_length * sizeof(grpc_arg))
+ *       for index, argument in enumerate(self._arguments):             # <<<<<<<<<<<<<<
+ *         channel_arg = _ChannelArg()
+ *         channel_arg.c(argument, self._references)
+ */
+    }
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":71
+ *     self._references = []
+ *     self._c_arguments.arguments_length = len(self._arguments)
+ *     if self._c_arguments.arguments_length != 0:             # <<<<<<<<<<<<<<
+ *       self._c_arguments.arguments = <grpc_arg *>gpr_malloc(
+ *           self._c_arguments.arguments_length * sizeof(grpc_arg))
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":66
+ * cdef class _ChannelArgs:
+ * 
+ *   def __cinit__(self, arguments):             # <<<<<<<<<<<<<<
+ *     self._arguments = () if arguments is None else tuple(arguments)
+ *     self._channel_args = []
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelArgs.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_index);
+  __Pyx_XDECREF(__pyx_v_argument);
+  __Pyx_XDECREF((PyObject *)__pyx_v_channel_arg);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":80
+ *         self._channel_args.append(channel_arg)
+ * 
+ *   cdef grpc_channel_args *c_args(self) except *:             # <<<<<<<<<<<<<<
+ *     return &self._c_arguments
+ * 
+ */
+
+static grpc_channel_args *__pyx_f_7_cython_6cygrpc_12_ChannelArgs_c_args(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self) {
+  grpc_channel_args *__pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":81
+ * 
+ *   cdef grpc_channel_args *c_args(self) except *:
+ *     return &self._c_arguments             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+  __pyx_r = (&__pyx_v_self->_c_arguments);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":80
+ *         self._channel_args.append(channel_arg)
+ * 
+ *   cdef grpc_channel_args *c_args(self) except *:             # <<<<<<<<<<<<<<
+ *     return &self._c_arguments
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":83
+ *     return &self._c_arguments
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self._c_arguments.arguments != NULL:
+ *       gpr_free(self._c_arguments.arguments)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_12_ChannelArgs_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_12_ChannelArgs_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_12_ChannelArgs_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_12_ChannelArgs_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":84
+ * 
+ *   def __dealloc__(self):
+ *     if self._c_arguments.arguments != NULL:             # <<<<<<<<<<<<<<
+ *       gpr_free(self._c_arguments.arguments)
+ */
+  __pyx_t_1 = (__pyx_v_self->_c_arguments.args != NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":85
+ *   def __dealloc__(self):
+ *     if self._c_arguments.arguments != NULL:
+ *       gpr_free(self._c_arguments.arguments)             # <<<<<<<<<<<<<<
+ */
+    gpr_free(__pyx_v_self->_c_arguments.args);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":84
+ * 
+ *   def __dealloc__(self):
+ *     if self._c_arguments.arguments != NULL:             # <<<<<<<<<<<<<<
+ *       gpr_free(self._c_arguments.arguments)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pyx.pxi":83
+ *     return &self._c_arguments
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self._c_arguments.arguments != NULL:
+ *       gpr_free(self._c_arguments.arguments)
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pxd.pxi":31
+ * cdef class _ChannelArgs:
+ * 
+ *   cdef readonly tuple _arguments             # <<<<<<<<<<<<<<
+ *   cdef list _channel_args
+ *   cdef readonly list _references
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_10_arguments_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_10_arguments_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12_ChannelArgs_10_arguments___get__(((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12_ChannelArgs_10_arguments___get__(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_arguments);
+  __pyx_r = __pyx_v_self->_arguments;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/arguments.pxd.pxi":33
+ *   cdef readonly tuple _arguments
+ *   cdef list _channel_args
+ *   cdef readonly list _references             # <<<<<<<<<<<<<<
+ *   cdef grpc_channel_args _c_arguments
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_11_references_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_11_references_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12_ChannelArgs_11_references___get__(((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12_ChannelArgs_11_references___get__(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_references);
+  __pyx_r = __pyx_v_self->_references;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_12_ChannelArgs_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12_ChannelArgs_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12_ChannelArgs_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelArgs.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_12_ChannelArgs_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelArgs.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12_ChannelArgs_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12_ChannelArgs_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelArgs.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":18
+ * cdef class Call:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     # Create an *empty* call
+ *     fork_handlers_and_grpc_init()
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_4Call_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_4Call_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call___cinit__(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_4Call___cinit__(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":20
+ *   def __cinit__(self):
+ *     # Create an *empty* call
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     self.c_call = NULL
+ *     self.references = []
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 20, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":21
+ *     # Create an *empty* call
+ *     fork_handlers_and_grpc_init()
+ *     self.c_call = NULL             # <<<<<<<<<<<<<<
+ *     self.references = []
+ * 
+ */
+  __pyx_v_self->c_call = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":22
+ *     fork_handlers_and_grpc_init()
+ *     self.c_call = NULL
+ *     self.references = []             # <<<<<<<<<<<<<<
+ * 
+ *   def _start_batch(self, operations, tag, retain_self):
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->references);
+  __Pyx_DECREF(__pyx_v_self->references);
+  __pyx_v_self->references = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":18
+ * cdef class Call:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     # Create an *empty* call
+ *     fork_handlers_and_grpc_init()
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.Call.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":24
+ *     self.references = []
+ * 
+ *   def _start_batch(self, operations, tag, retain_self):             # <<<<<<<<<<<<<<
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_3_start_batch(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_3_start_batch = {"_start_batch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_3_start_batch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_3_start_batch(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_operations = 0;
+  PyObject *__pyx_v_tag = 0;
+  PyObject *__pyx_v_retain_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_start_batch (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_operations,&__pyx_n_s_tag,&__pyx_n_s_retain_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operations)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 24, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 24, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_start_batch", 1, 3, 3, 1); __PYX_ERR(4, 24, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_retain_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 24, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_start_batch", 1, 3, 3, 2); __PYX_ERR(4, 24, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_start_batch") < 0)) __PYX_ERR(4, 24, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_operations = values[0];
+    __pyx_v_tag = values[1];
+    __pyx_v_retain_self = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_start_batch", 1, 3, 3, __pyx_nargs); __PYX_ERR(4, 24, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Call._start_batch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_2_start_batch(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self), __pyx_v_operations, __pyx_v_tag, __pyx_v_retain_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_2_start_batch(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag, PyObject *__pyx_v_retain_self) {
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_batch_operation_tag = 0;
+  grpc_call_error __pyx_v_error;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_start_batch", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":25
+ * 
+ *   def _start_batch(self, operations, tag, retain_self):
+ *     if not self.is_valid:             # <<<<<<<<<<<<<<
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_valid); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 25, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(4, 25, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = (!__pyx_t_2);
+  if (unlikely(__pyx_t_3)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":26
+ *   def _start_batch(self, operations, tag, retain_self):
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")             # <<<<<<<<<<<<<<
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(
+ *         tag, operations, self if retain_self else None)
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 26, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(4, 26, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":25
+ * 
+ *   def _start_batch(self, operations, tag, retain_self):
+ *     if not self.is_valid:             # <<<<<<<<<<<<<<
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":28
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(
+ *         tag, operations, self if retain_self else None)             # <<<<<<<<<<<<<<
+ *     batch_operation_tag.prepare()
+ *     cpython.Py_INCREF(batch_operation_tag)
+ */
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_retain_self); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(4, 28, __pyx_L1_error)
+  if (__pyx_t_3) {
+    __Pyx_INCREF((PyObject *)__pyx_v_self);
+    __pyx_t_1 = ((PyObject *)__pyx_v_self);
+  } else {
+    __Pyx_INCREF(Py_None);
+    __pyx_t_1 = Py_None;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":27
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(             # <<<<<<<<<<<<<<
+ *         tag, operations, self if retain_self else None)
+ *     batch_operation_tag.prepare()
+ */
+  __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(4, 27, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_INCREF(__pyx_v_tag);
+  __Pyx_GIVEREF(__pyx_v_tag);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_tag)) __PYX_ERR(4, 27, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_operations);
+  __Pyx_GIVEREF(__pyx_v_operations);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_operations)) __PYX_ERR(4, 27, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1)) __PYX_ERR(4, 27, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__BatchOperationTag), __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 27, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_v_batch_operation_tag = ((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":29
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(
+ *         tag, operations, self if retain_self else None)
+ *     batch_operation_tag.prepare()             # <<<<<<<<<<<<<<
+ *     cpython.Py_INCREF(batch_operation_tag)
+ *     cdef grpc_call_error error
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_batch_operation_tag->__pyx_base.__pyx_vtab)->prepare(__pyx_v_batch_operation_tag); if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 29, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":30
+ *         tag, operations, self if retain_self else None)
+ *     batch_operation_tag.prepare()
+ *     cpython.Py_INCREF(batch_operation_tag)             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_error error
+ *     with nogil:
+ */
+  Py_INCREF(((PyObject *)__pyx_v_batch_operation_tag));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":32
+ *     cpython.Py_INCREF(batch_operation_tag)
+ *     cdef grpc_call_error error
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       error = grpc_call_start_batch(
+ *           self.c_call, batch_operation_tag.c_ops, batch_operation_tag.c_nops,
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":33
+ *     cdef grpc_call_error error
+ *     with nogil:
+ *       error = grpc_call_start_batch(             # <<<<<<<<<<<<<<
+ *           self.c_call, batch_operation_tag.c_ops, batch_operation_tag.c_nops,
+ *           <cpython.PyObject *>batch_operation_tag, NULL)
+ */
+        __pyx_v_error = grpc_call_start_batch(__pyx_v_self->c_call, __pyx_v_batch_operation_tag->c_ops, __pyx_v_batch_operation_tag->c_nops, ((PyObject *)__pyx_v_batch_operation_tag), NULL);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":32
+ *     cpython.Py_INCREF(batch_operation_tag)
+ *     cdef grpc_call_error error
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       error = grpc_call_start_batch(
+ *           self.c_call, batch_operation_tag.c_ops, batch_operation_tag.c_nops,
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L6;
+        }
+        __pyx_L6:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":36
+ *           self.c_call, batch_operation_tag.c_ops, batch_operation_tag.c_nops,
+ *           <cpython.PyObject *>batch_operation_tag, NULL)
+ *     return error             # <<<<<<<<<<<<<<
+ * 
+ *   def start_client_batch(self, operations, tag):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_error); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":24
+ *     self.references = []
+ * 
+ *   def _start_batch(self, operations, tag, retain_self):             # <<<<<<<<<<<<<<
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.Call._start_batch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_batch_operation_tag);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":38
+ *     return error
+ * 
+ *   def start_client_batch(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     # We don't reference this call in the operations tag because
+ *     # it should be cancelled when it goes out of scope
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_5start_client_batch(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_5start_client_batch = {"start_client_batch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_5start_client_batch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_5start_client_batch(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_operations = 0;
+  PyObject *__pyx_v_tag = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("start_client_batch (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_operations,&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operations)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 38, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 38, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("start_client_batch", 1, 2, 2, 1); __PYX_ERR(4, 38, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "start_client_batch") < 0)) __PYX_ERR(4, 38, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_operations = values[0];
+    __pyx_v_tag = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("start_client_batch", 1, 2, 2, __pyx_nargs); __PYX_ERR(4, 38, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Call.start_client_batch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_4start_client_batch(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self), __pyx_v_operations, __pyx_v_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_4start_client_batch(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("start_client_batch", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":41
+ *     # We don't reference this call in the operations tag because
+ *     # it should be cancelled when it goes out of scope
+ *     return self._start_batch(operations, tag, False)             # <<<<<<<<<<<<<<
+ * 
+ *   def start_server_batch(self, operations, tag):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_start_batch); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_3, __pyx_v_operations, __pyx_v_tag, Py_False};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 41, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":38
+ *     return error
+ * 
+ *   def start_client_batch(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     # We don't reference this call in the operations tag because
+ *     # it should be cancelled when it goes out of scope
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.Call.start_client_batch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":43
+ *     return self._start_batch(operations, tag, False)
+ * 
+ *   def start_server_batch(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return self._start_batch(operations, tag, True)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_7start_server_batch(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_7start_server_batch = {"start_server_batch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_7start_server_batch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_7start_server_batch(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_operations = 0;
+  PyObject *__pyx_v_tag = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("start_server_batch (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_operations,&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operations)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 43, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 43, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("start_server_batch", 1, 2, 2, 1); __PYX_ERR(4, 43, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "start_server_batch") < 0)) __PYX_ERR(4, 43, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_operations = values[0];
+    __pyx_v_tag = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("start_server_batch", 1, 2, 2, __pyx_nargs); __PYX_ERR(4, 43, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Call.start_server_batch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_6start_server_batch(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self), __pyx_v_operations, __pyx_v_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_6start_server_batch(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("start_server_batch", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":44
+ * 
+ *   def start_server_batch(self, operations, tag):
+ *     return self._start_batch(operations, tag, True)             # <<<<<<<<<<<<<<
+ * 
+ *   def cancel(
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_start_batch); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 44, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_3, __pyx_v_operations, __pyx_v_tag, Py_True};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 44, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":43
+ *     return self._start_batch(operations, tag, False)
+ * 
+ *   def start_server_batch(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return self._start_batch(operations, tag, True)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.Call.start_server_batch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":46
+ *     return self._start_batch(operations, tag, True)
+ * 
+ *   def cancel(             # <<<<<<<<<<<<<<
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_9cancel(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_9cancel = {"cancel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_9cancel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_9cancel(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_status_code __pyx_v_error_code;
+  PyObject *__pyx_v_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancel (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_error_code,&__pyx_n_s_details,0};
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":48
+ *   def cancel(
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):             # <<<<<<<<<<<<<<
+ *     details = str_to_bytes(details)
+ *     if not self.is_valid:
+ */
+    values[1] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_error_code);
+          if (value) { values[0] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 46, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details);
+          if (value) { values[1] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 46, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cancel") < 0)) __PYX_ERR(4, 46, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    if (values[0]) {
+      __pyx_v_error_code = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 47, __pyx_L3_error)
+    } else {
+      __pyx_v_error_code = __pyx_k__9;
+    }
+    __pyx_v_details = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("cancel", 0, 0, 2, __pyx_nargs); __PYX_ERR(4, 46, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Call.cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_8cancel(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self), __pyx_v_error_code, __pyx_v_details);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":46
+ *     return self._start_batch(operations, tag, True)
+ * 
+ *   def cancel(             # <<<<<<<<<<<<<<
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):
+ */
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_8cancel(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, grpc_status_code __pyx_v_error_code, PyObject *__pyx_v_details) {
+  grpc_call_error __pyx_v_result;
+  char *__pyx_v_c_details;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  char *__pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("cancel", 0);
+  __Pyx_INCREF(__pyx_v_details);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":49
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):
+ *     details = str_to_bytes(details)             # <<<<<<<<<<<<<<
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_str_to_bytes(__pyx_v_details); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 49, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF_SET(__pyx_v_details, __pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":50
+ *       details=None):
+ *     details = str_to_bytes(details)
+ *     if not self.is_valid:             # <<<<<<<<<<<<<<
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE):
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_valid); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(4, 50, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = (!__pyx_t_2);
+  if (unlikely(__pyx_t_3)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":51
+ *     details = str_to_bytes(details)
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")             # <<<<<<<<<<<<<<
+ *     if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE):
+ *       raise ValueError("if error_code is specified, so must details "
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 51, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(4, 51, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":50
+ *       details=None):
+ *     details = str_to_bytes(details)
+ *     if not self.is_valid:             # <<<<<<<<<<<<<<
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE):
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":52
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE):             # <<<<<<<<<<<<<<
+ *       raise ValueError("if error_code is specified, so must details "
+ *                        "(and vice-versa)")
+ */
+  __pyx_t_3 = (__pyx_v_details == Py_None);
+  __pyx_t_2 = (__pyx_t_3 != (__pyx_v_error_code == GRPC_STATUS__DO_NOT_USE));
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":53
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE):
+ *       raise ValueError("if error_code is specified, so must details "             # <<<<<<<<<<<<<<
+ *                        "(and vice-versa)")
+ *     cdef grpc_call_error result
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 53, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(4, 53, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":52
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE):             # <<<<<<<<<<<<<<
+ *       raise ValueError("if error_code is specified, so must details "
+ *                        "(and vice-versa)")
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":56
+ *                        "(and vice-versa)")
+ *     cdef grpc_call_error result
+ *     cdef char *c_details = NULL             # <<<<<<<<<<<<<<
+ *     if error_code != GRPC_STATUS__DO_NOT_USE:
+ *       self.references.append(details)
+ */
+  __pyx_v_c_details = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":57
+ *     cdef grpc_call_error result
+ *     cdef char *c_details = NULL
+ *     if error_code != GRPC_STATUS__DO_NOT_USE:             # <<<<<<<<<<<<<<
+ *       self.references.append(details)
+ *       c_details = details
+ */
+  __pyx_t_2 = (__pyx_v_error_code != GRPC_STATUS__DO_NOT_USE);
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":58
+ *     cdef char *c_details = NULL
+ *     if error_code != GRPC_STATUS__DO_NOT_USE:
+ *       self.references.append(details)             # <<<<<<<<<<<<<<
+ *       c_details = details
+ *       with nogil:
+ */
+    if (unlikely(__pyx_v_self->references == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+      __PYX_ERR(4, 58, __pyx_L1_error)
+    }
+    __pyx_t_4 = __Pyx_PyList_Append(__pyx_v_self->references, __pyx_v_details); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(4, 58, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":59
+ *     if error_code != GRPC_STATUS__DO_NOT_USE:
+ *       self.references.append(details)
+ *       c_details = details             # <<<<<<<<<<<<<<
+ *       with nogil:
+ *         result = grpc_call_cancel_with_status(
+ */
+    __pyx_t_5 = __Pyx_PyObject_AsWritableString(__pyx_v_details); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) __PYX_ERR(4, 59, __pyx_L1_error)
+    __pyx_v_c_details = __pyx_t_5;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":60
+ *       self.references.append(details)
+ *       c_details = details
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         result = grpc_call_cancel_with_status(
+ *             self.c_call, error_code, c_details, NULL)
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":61
+ *       c_details = details
+ *       with nogil:
+ *         result = grpc_call_cancel_with_status(             # <<<<<<<<<<<<<<
+ *             self.c_call, error_code, c_details, NULL)
+ *       return result
+ */
+          __pyx_v_result = grpc_call_cancel_with_status(__pyx_v_self->c_call, __pyx_v_error_code, __pyx_v_c_details, NULL);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":60
+ *       self.references.append(details)
+ *       c_details = details
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         result = grpc_call_cancel_with_status(
+ *             self.c_call, error_code, c_details, NULL)
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L8;
+          }
+          __pyx_L8:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":63
+ *         result = grpc_call_cancel_with_status(
+ *             self.c_call, error_code, c_details, NULL)
+ *       return result             # <<<<<<<<<<<<<<
+ *     else:
+ *       with nogil:
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_1 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_result); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 63, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":57
+ *     cdef grpc_call_error result
+ *     cdef char *c_details = NULL
+ *     if error_code != GRPC_STATUS__DO_NOT_USE:             # <<<<<<<<<<<<<<
+ *       self.references.append(details)
+ *       c_details = details
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":65
+ *       return result
+ *     else:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         result = grpc_call_cancel(self.c_call, NULL)
+ *       return result
+ */
+  /*else*/ {
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":66
+ *     else:
+ *       with nogil:
+ *         result = grpc_call_cancel(self.c_call, NULL)             # <<<<<<<<<<<<<<
+ *       return result
+ * 
+ */
+          __pyx_v_result = grpc_call_cancel(__pyx_v_self->c_call, NULL);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":65
+ *       return result
+ *     else:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         result = grpc_call_cancel(self.c_call, NULL)
+ *       return result
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L11;
+          }
+          __pyx_L11:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":67
+ *       with nogil:
+ *         result = grpc_call_cancel(self.c_call, NULL)
+ *       return result             # <<<<<<<<<<<<<<
+ * 
+ *   def set_credentials(self, CallCredentials call_credentials not None):
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_1 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_result); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 67, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":46
+ *     return self._start_batch(operations, tag, True)
+ * 
+ *   def cancel(             # <<<<<<<<<<<<<<
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.Call.cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_details);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":69
+ *       return result
+ * 
+ *   def set_credentials(self, CallCredentials call_credentials not None):             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_credentials *c_call_credentials = call_credentials.c()
+ *     cdef grpc_call_error call_error = grpc_call_set_credentials(
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_11set_credentials(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_11set_credentials = {"set_credentials", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_11set_credentials, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_11set_credentials(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_credentials = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_credentials (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call_credentials,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 69, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_credentials") < 0)) __PYX_ERR(4, 69, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_call_credentials = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_credentials", 1, 1, 1, __pyx_nargs); __PYX_ERR(4, 69, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Call.set_credentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_credentials), __pyx_ptype_7_cython_6cygrpc_CallCredentials, 0, "call_credentials", 0))) __PYX_ERR(4, 69, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_10set_credentials(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self), __pyx_v_call_credentials);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_10set_credentials(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_credentials) {
+  grpc_call_credentials *__pyx_v_c_call_credentials;
+  grpc_call_error __pyx_v_call_error;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  grpc_call_credentials *__pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("set_credentials", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":70
+ * 
+ *   def set_credentials(self, CallCredentials call_credentials not None):
+ *     cdef grpc_call_credentials *c_call_credentials = call_credentials.c()             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_error call_error = grpc_call_set_credentials(
+ *         self.c_call, c_call_credentials)
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials *)__pyx_v_call_credentials->__pyx_vtab)->c(__pyx_v_call_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 70, __pyx_L1_error)
+  __pyx_v_c_call_credentials = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":71
+ *   def set_credentials(self, CallCredentials call_credentials not None):
+ *     cdef grpc_call_credentials *c_call_credentials = call_credentials.c()
+ *     cdef grpc_call_error call_error = grpc_call_set_credentials(             # <<<<<<<<<<<<<<
+ *         self.c_call, c_call_credentials)
+ *     grpc_call_credentials_release(c_call_credentials)
+ */
+  __pyx_v_call_error = grpc_call_set_credentials(__pyx_v_self->c_call, __pyx_v_c_call_credentials);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":73
+ *     cdef grpc_call_error call_error = grpc_call_set_credentials(
+ *         self.c_call, c_call_credentials)
+ *     grpc_call_credentials_release(c_call_credentials)             # <<<<<<<<<<<<<<
+ *     return call_error
+ * 
+ */
+  grpc_call_credentials_release(__pyx_v_c_call_credentials);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":74
+ *         self.c_call, c_call_credentials)
+ *     grpc_call_credentials_release(c_call_credentials)
+ *     return call_error             # <<<<<<<<<<<<<<
+ * 
+ *   def peer(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 74, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":69
+ *       return result
+ * 
+ *   def set_credentials(self, CallCredentials call_credentials not None):             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_credentials *c_call_credentials = call_credentials.c()
+ *     cdef grpc_call_error call_error = grpc_call_set_credentials(
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.Call.set_credentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":76
+ *     return call_error
+ * 
+ *   def peer(self):             # <<<<<<<<<<<<<<
+ *     cdef char *peer = NULL
+ *     with nogil:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_13peer(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_13peer = {"peer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_13peer, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_13peer(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("peer", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "peer", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_12peer(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_12peer(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self) {
+  char *__pyx_v_peer;
+  PyObject *__pyx_v_result = 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("peer", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":77
+ * 
+ *   def peer(self):
+ *     cdef char *peer = NULL             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       peer = grpc_call_get_peer(self.c_call)
+ */
+  __pyx_v_peer = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":78
+ *   def peer(self):
+ *     cdef char *peer = NULL
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       peer = grpc_call_get_peer(self.c_call)
+ *     result = <bytes>peer
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":79
+ *     cdef char *peer = NULL
+ *     with nogil:
+ *       peer = grpc_call_get_peer(self.c_call)             # <<<<<<<<<<<<<<
+ *     result = <bytes>peer
+ *     with nogil:
+ */
+        __pyx_v_peer = grpc_call_get_peer(__pyx_v_self->c_call);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":78
+ *   def peer(self):
+ *     cdef char *peer = NULL
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       peer = grpc_call_get_peer(self.c_call)
+ *     result = <bytes>peer
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":80
+ *     with nogil:
+ *       peer = grpc_call_get_peer(self.c_call)
+ *     result = <bytes>peer             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       gpr_free(peer)
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_peer); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __pyx_t_1;
+  __Pyx_INCREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_result = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":81
+ *       peer = grpc_call_get_peer(self.c_call)
+ *     result = <bytes>peer
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       gpr_free(peer)
+ *     return result
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":82
+ *     result = <bytes>peer
+ *     with nogil:
+ *       gpr_free(peer)             # <<<<<<<<<<<<<<
+ *     return result
+ * 
+ */
+        gpr_free(__pyx_v_peer);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":81
+ *       peer = grpc_call_get_peer(self.c_call)
+ *     result = <bytes>peer
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       gpr_free(peer)
+ *     return result
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L8;
+        }
+        __pyx_L8:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":83
+ *     with nogil:
+ *       gpr_free(peer)
+ *     return result             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_result);
+  __pyx_r = __pyx_v_result;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":76
+ *     return call_error
+ * 
+ *   def peer(self):             # <<<<<<<<<<<<<<
+ *     cdef char *peer = NULL
+ *     with nogil:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.Call.peer", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_result);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":85
+ *     return result
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       if self.c_call != NULL:
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_4Call_15__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_4Call_15__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_4Call_14__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_4Call_14__dealloc__(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":86
+ * 
+ *   def __dealloc__(self):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       if self.c_call != NULL:
+ *         grpc_call_unref(self.c_call)
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":87
+ *   def __dealloc__(self):
+ *     with nogil:
+ *       if self.c_call != NULL:             # <<<<<<<<<<<<<<
+ *         grpc_call_unref(self.c_call)
+ *       grpc_shutdown()
+ */
+        __pyx_t_1 = (__pyx_v_self->c_call != NULL);
+        if (__pyx_t_1) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":88
+ *     with nogil:
+ *       if self.c_call != NULL:
+ *         grpc_call_unref(self.c_call)             # <<<<<<<<<<<<<<
+ *       grpc_shutdown()
+ * 
+ */
+          grpc_call_unref(__pyx_v_self->c_call);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":87
+ *   def __dealloc__(self):
+ *     with nogil:
+ *       if self.c_call != NULL:             # <<<<<<<<<<<<<<
+ *         grpc_call_unref(self.c_call)
+ *       grpc_shutdown()
+ */
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":89
+ *       if self.c_call != NULL:
+ *         grpc_call_unref(self.c_call)
+ *       grpc_shutdown()             # <<<<<<<<<<<<<<
+ * 
+ *   # The object *should* always be valid from Python. Used for debugging.
+ */
+        grpc_shutdown();
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":86
+ * 
+ *   def __dealloc__(self):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       if self.c_call != NULL:
+ *         grpc_call_unref(self.c_call)
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":85
+ *     return result
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       if self.c_call != NULL:
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":92
+ * 
+ *   # The object *should* always be valid from Python. Used for debugging.
+ *   @property             # <<<<<<<<<<<<<<
+ *   def is_valid(self):
+ *     return self.c_call != NULL
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_8is_valid_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_8is_valid_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_8is_valid___get__(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_8is_valid___get__(struct __pyx_obj_7_cython_6cygrpc_Call *__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("__get__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":94
+ *   @property
+ *   def is_valid(self):
+ *     return self.c_call != NULL             # <<<<<<<<<<<<<<
+ * 
+ *   def _custom_op_on_c_call(self, int op):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_self->c_call != NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 94, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":92
+ * 
+ *   # The object *should* always be valid from Python. Used for debugging.
+ *   @property             # <<<<<<<<<<<<<<
+ *   def is_valid(self):
+ *     return self.c_call != NULL
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.Call.is_valid.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":96
+ *     return self.c_call != NULL
+ * 
+ *   def _custom_op_on_c_call(self, int op):             # <<<<<<<<<<<<<<
+ *     return _custom_op_on_c_call(op, self.c_call)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_17_custom_op_on_c_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_17_custom_op_on_c_call = {"_custom_op_on_c_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_17_custom_op_on_c_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_17_custom_op_on_c_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  int __pyx_v_op;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_custom_op_on_c_call (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_op,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_op)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 96, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_custom_op_on_c_call") < 0)) __PYX_ERR(4, 96, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_op = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_op == (int)-1) && PyErr_Occurred())) __PYX_ERR(4, 96, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_custom_op_on_c_call", 1, 1, 1, __pyx_nargs); __PYX_ERR(4, 96, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Call._custom_op_on_c_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_16_custom_op_on_c_call(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self), __pyx_v_op);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_16_custom_op_on_c_call(struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, int __pyx_v_op) {
+  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("_custom_op_on_c_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":97
+ * 
+ *   def _custom_op_on_c_call(self, int op):
+ *     return _custom_op_on_c_call(op, self.c_call)             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__custom_op_on_c_call(__pyx_v_op, __pyx_v_self->c_call); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 97, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":96
+ *     return self.c_call != NULL
+ * 
+ *   def _custom_op_on_c_call(self, int op):             # <<<<<<<<<<<<<<
+ *     return _custom_op_on_c_call(op, self.c_call)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.Call._custom_op_on_c_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_19__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_19__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_19__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_19__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_18__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_18__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.Call.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_21__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4Call_21__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_21__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4Call_21__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Call.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4Call_20__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4Call_20__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.Call.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":22
+ * 
+ * 
+ * cdef str _call_error_metadata(metadata):             # <<<<<<<<<<<<<<
+ *   return 'metadata was invalid: %s' % metadata
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__call_error_metadata(PyObject *__pyx_v_metadata) {
+  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("_call_error_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":23
+ * 
+ * cdef str _call_error_metadata(metadata):
+ *   return 'metadata was invalid: %s' % metadata             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyString_FormatSafe(__pyx_kp_s_metadata_was_invalid_s, __pyx_v_metadata); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 23, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(PyString_CheckExact(__pyx_t_1)) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(12, 23, __pyx_L1_error)
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":22
+ * 
+ * 
+ * cdef str _call_error_metadata(metadata):             # <<<<<<<<<<<<<<
+ *   return 'metadata was invalid: %s' % metadata
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._call_error_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":26
+ * 
+ * 
+ * cdef str _call_error_no_metadata(c_call_error):             # <<<<<<<<<<<<<<
+ *   return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__call_error_no_metadata(PyObject *__pyx_v_c_call_error) {
+  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("_call_error_no_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":27
+ * 
+ * cdef str _call_error_no_metadata(c_call_error):
+ *   return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 27, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyNumber_Remainder(__pyx_t_1, __pyx_v_c_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 27, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_2))) __PYX_ERR(12, 27, __pyx_L1_error)
+  __pyx_r = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":26
+ * 
+ * 
+ * cdef str _call_error_no_metadata(c_call_error):             # <<<<<<<<<<<<<<
+ *   return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._call_error_no_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":30
+ * 
+ * 
+ * cdef str _call_error(c_call_error, metadata):             # <<<<<<<<<<<<<<
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:
+ *     return _call_error_metadata(metadata)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__call_error(PyObject *__pyx_v_c_call_error, PyObject *__pyx_v_metadata) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_call_error", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":31
+ * 
+ * cdef str _call_error(c_call_error, metadata):
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:             # <<<<<<<<<<<<<<
+ *     return _call_error_metadata(metadata)
+ *   else:
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_INVALID_METADATA); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 31, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyObject_RichCompare(__pyx_v_c_call_error, __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 31, __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_ERR(12, 31, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":32
+ * cdef str _call_error(c_call_error, metadata):
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:
+ *     return _call_error_metadata(metadata)             # <<<<<<<<<<<<<<
+ *   else:
+ *     return _call_error_no_metadata(c_call_error)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc__call_error_metadata(__pyx_v_metadata); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 32, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_r = ((PyObject*)__pyx_t_2);
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":31
+ * 
+ * cdef str _call_error(c_call_error, metadata):
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:             # <<<<<<<<<<<<<<
+ *     return _call_error_metadata(metadata)
+ *   else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":34
+ *     return _call_error_metadata(metadata)
+ *   else:
+ *     return _call_error_no_metadata(c_call_error)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc__call_error_no_metadata(__pyx_v_c_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 34, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_r = ((PyObject*)__pyx_t_2);
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":30
+ * 
+ * 
+ * cdef str _call_error(c_call_error, metadata):             # <<<<<<<<<<<<<<
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:
+ *     return _call_error_metadata(metadata)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._call_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":37
+ * 
+ * 
+ * cdef _check_call_error_no_metadata(c_call_error):             # <<<<<<<<<<<<<<
+ *   if c_call_error != GRPC_CALL_OK:
+ *     return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__check_call_error_no_metadata(PyObject *__pyx_v_c_call_error) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_check_call_error_no_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":38
+ * 
+ * cdef _check_call_error_no_metadata(c_call_error):
+ *   if c_call_error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *     return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error
+ *   else:
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_OK); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 38, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyObject_RichCompare(__pyx_v_c_call_error, __pyx_t_1, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 38, __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_ERR(12, 38, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":39
+ * cdef _check_call_error_no_metadata(c_call_error):
+ *   if c_call_error != GRPC_CALL_OK:
+ *     return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error             # <<<<<<<<<<<<<<
+ *   else:
+ *     return None
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 39, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyNumber_Remainder(__pyx_t_2, __pyx_v_c_call_error); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 39, __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;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":38
+ * 
+ * cdef _check_call_error_no_metadata(c_call_error):
+ *   if c_call_error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *     return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error
+ *   else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":41
+ *     return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error
+ *   else:
+ *     return None             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":37
+ * 
+ * 
+ * cdef _check_call_error_no_metadata(c_call_error):             # <<<<<<<<<<<<<<
+ *   if c_call_error != GRPC_CALL_OK:
+ *     return _INTERNAL_CALL_ERROR_MESSAGE_FORMAT % c_call_error
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._check_call_error_no_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":44
+ * 
+ * 
+ * cdef _check_and_raise_call_error_no_metadata(c_call_error):             # <<<<<<<<<<<<<<
+ *   error = _check_call_error_no_metadata(c_call_error)
+ *   if error is not None:
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__check_and_raise_call_error_no_metadata(PyObject *__pyx_v_c_call_error) {
+  PyObject *__pyx_v_error = NULL;
+  PyObject *__pyx_r = NULL;
+  __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("_check_and_raise_call_error_no_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":45
+ * 
+ * cdef _check_and_raise_call_error_no_metadata(c_call_error):
+ *   error = _check_call_error_no_metadata(c_call_error)             # <<<<<<<<<<<<<<
+ *   if error is not None:
+ *     raise ValueError(error)
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__check_call_error_no_metadata(__pyx_v_c_call_error); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 45, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_error = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":46
+ * cdef _check_and_raise_call_error_no_metadata(c_call_error):
+ *   error = _check_call_error_no_metadata(c_call_error)
+ *   if error is not None:             # <<<<<<<<<<<<<<
+ *     raise ValueError(error)
+ * 
+ */
+  __pyx_t_2 = (__pyx_v_error != Py_None);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":47
+ *   error = _check_call_error_no_metadata(c_call_error)
+ *   if error is not None:
+ *     raise ValueError(error)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_v_error); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 47, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(12, 47, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":46
+ * cdef _check_and_raise_call_error_no_metadata(c_call_error):
+ *   error = _check_call_error_no_metadata(c_call_error)
+ *   if error is not None:             # <<<<<<<<<<<<<<
+ *     raise ValueError(error)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":44
+ * 
+ * 
+ * cdef _check_and_raise_call_error_no_metadata(c_call_error):             # <<<<<<<<<<<<<<
+ *   error = _check_call_error_no_metadata(c_call_error)
+ *   if error is not None:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._check_and_raise_call_error_no_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_error);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":50
+ * 
+ * 
+ * cdef _check_call_error(c_call_error, metadata):             # <<<<<<<<<<<<<<
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:
+ *     return _call_error_metadata(metadata)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__check_call_error(PyObject *__pyx_v_c_call_error, PyObject *__pyx_v_metadata) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_check_call_error", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":51
+ * 
+ * cdef _check_call_error(c_call_error, metadata):
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:             # <<<<<<<<<<<<<<
+ *     return _call_error_metadata(metadata)
+ *   else:
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_INVALID_METADATA); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 51, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyObject_RichCompare(__pyx_v_c_call_error, __pyx_t_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 51, __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_ERR(12, 51, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":52
+ * cdef _check_call_error(c_call_error, metadata):
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:
+ *     return _call_error_metadata(metadata)             # <<<<<<<<<<<<<<
+ *   else:
+ *     return _check_call_error_no_metadata(c_call_error)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc__call_error_metadata(__pyx_v_metadata); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 52, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":51
+ * 
+ * cdef _check_call_error(c_call_error, metadata):
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:             # <<<<<<<<<<<<<<
+ *     return _call_error_metadata(metadata)
+ *   else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":54
+ *     return _call_error_metadata(metadata)
+ *   else:
+ *     return _check_call_error_no_metadata(c_call_error)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc__check_call_error_no_metadata(__pyx_v_c_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 54, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":50
+ * 
+ * 
+ * cdef _check_call_error(c_call_error, metadata):             # <<<<<<<<<<<<<<
+ *   if c_call_error == GRPC_CALL_ERROR_INVALID_METADATA:
+ *     return _call_error_metadata(metadata)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._check_call_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":57
+ * 
+ * 
+ * cdef void _raise_call_error_no_metadata(c_call_error) except *:             # <<<<<<<<<<<<<<
+ *   raise ValueError(_call_error_no_metadata(c_call_error))
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc__raise_call_error_no_metadata(PyObject *__pyx_v_c_call_error) {
+  __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("_raise_call_error_no_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":58
+ * 
+ * cdef void _raise_call_error_no_metadata(c_call_error) except *:
+ *   raise ValueError(_call_error_no_metadata(c_call_error))             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__call_error_no_metadata(__pyx_v_c_call_error); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 58, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 58, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __PYX_ERR(12, 58, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":57
+ * 
+ * 
+ * cdef void _raise_call_error_no_metadata(c_call_error) except *:             # <<<<<<<<<<<<<<
+ *   raise ValueError(_call_error_no_metadata(c_call_error))
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._raise_call_error_no_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":61
+ * 
+ * 
+ * cdef void _raise_call_error(c_call_error, metadata) except *:             # <<<<<<<<<<<<<<
+ *   raise ValueError(_call_error(c_call_error, metadata))
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc__raise_call_error(PyObject *__pyx_v_c_call_error, PyObject *__pyx_v_metadata) {
+  __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("_raise_call_error", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":62
+ * 
+ * cdef void _raise_call_error(c_call_error, metadata) except *:
+ *   raise ValueError(_call_error(c_call_error, metadata))             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__call_error(__pyx_v_c_call_error, __pyx_v_metadata); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __PYX_ERR(12, 62, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":61
+ * 
+ * 
+ * cdef void _raise_call_error(c_call_error, metadata) except *:             # <<<<<<<<<<<<<<
+ *   raise ValueError(_call_error(c_call_error, metadata))
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._raise_call_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":65
+ * 
+ * 
+ * cdef _destroy_c_completion_queue(grpc_completion_queue *c_completion_queue):             # <<<<<<<<<<<<<<
+ *   grpc_completion_queue_shutdown(c_completion_queue)
+ *   grpc_completion_queue_destroy(c_completion_queue)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__destroy_c_completion_queue(grpc_completion_queue *__pyx_v_c_completion_queue) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_destroy_c_completion_queue", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":66
+ * 
+ * cdef _destroy_c_completion_queue(grpc_completion_queue *c_completion_queue):
+ *   grpc_completion_queue_shutdown(c_completion_queue)             # <<<<<<<<<<<<<<
+ *   grpc_completion_queue_destroy(c_completion_queue)
+ * 
+ */
+  grpc_completion_queue_shutdown(__pyx_v_c_completion_queue);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":67
+ * cdef _destroy_c_completion_queue(grpc_completion_queue *c_completion_queue):
+ *   grpc_completion_queue_shutdown(c_completion_queue)
+ *   grpc_completion_queue_destroy(c_completion_queue)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  grpc_completion_queue_destroy(__pyx_v_c_completion_queue);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":65
+ * 
+ * 
+ * cdef _destroy_c_completion_queue(grpc_completion_queue *c_completion_queue):             # <<<<<<<<<<<<<<
+ *   grpc_completion_queue_shutdown(c_completion_queue)
+ *   grpc_completion_queue_destroy(c_completion_queue)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":72
+ * cdef class _CallState:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     self.due = set()
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_10_CallState_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_10_CallState_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10_CallState___cinit__(((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_10_CallState___cinit__(struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":73
+ * 
+ *   def __cinit__(self):
+ *     self.due = set()             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void maybe_delete_call_tracer(self) except *:
+ */
+  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->due);
+  __Pyx_DECREF(__pyx_v_self->due);
+  __pyx_v_self->due = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":72
+ * cdef class _CallState:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     self.due = set()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._CallState.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":75
+ *     self.due = set()
+ * 
+ *   cdef void maybe_delete_call_tracer(self) except *:             # <<<<<<<<<<<<<<
+ *     if not self.call_tracer_capsule:
+ *       return
+ */
+
+static void __pyx_f_7_cython_6cygrpc_10_CallState_maybe_delete_call_tracer(struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self) {
+  __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;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("maybe_delete_call_tracer", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":76
+ * 
+ *   cdef void maybe_delete_call_tracer(self) except *:
+ *     if not self.call_tracer_capsule:             # <<<<<<<<<<<<<<
+ *       return
+ *     _observability.delete_call_tracer(self.call_tracer_capsule)
+ */
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->call_tracer_capsule); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(12, 76, __pyx_L1_error)
+  __pyx_t_2 = (!__pyx_t_1);
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":77
+ *   cdef void maybe_delete_call_tracer(self) except *:
+ *     if not self.call_tracer_capsule:
+ *       return             # <<<<<<<<<<<<<<
+ *     _observability.delete_call_tracer(self.call_tracer_capsule)
+ * 
+ */
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":76
+ * 
+ *   cdef void maybe_delete_call_tracer(self) except *:
+ *     if not self.call_tracer_capsule:             # <<<<<<<<<<<<<<
+ *       return
+ *     _observability.delete_call_tracer(self.call_tracer_capsule)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":78
+ *     if not self.call_tracer_capsule:
+ *       return
+ *     _observability.delete_call_tracer(self.call_tracer_capsule)             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void maybe_set_client_call_tracer_on_call(self, bytes method_name, bytes target) except *:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_observability); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_delete_call_tracer); if (unlikely(!__pyx_t_5)) __PYX_ERR(12, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_4 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_5))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_5, function);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_self->call_tracer_capsule};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 78, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":75
+ *     self.due = set()
+ * 
+ *   cdef void maybe_delete_call_tracer(self) except *:             # <<<<<<<<<<<<<<
+ *     if not self.call_tracer_capsule:
+ *       return
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._CallState.maybe_delete_call_tracer", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":80
+ *     _observability.delete_call_tracer(self.call_tracer_capsule)
+ * 
+ *   cdef void maybe_set_client_call_tracer_on_call(self, bytes method_name, bytes target) except *:             # <<<<<<<<<<<<<<
+ *     # TODO(xuanwn): use channel args to exclude those metrics.
+ *     for exclude_prefix in _observability._SERVICES_TO_EXCLUDE:
+ */
+
+static void __pyx_f_7_cython_6cygrpc_10_CallState_maybe_set_client_call_tracer_on_call(struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self, PyObject *__pyx_v_method_name, PyObject *__pyx_v_target) {
+  PyObject *__pyx_v_exclude_prefix = NULL;
+  PyObject *__pyx_v_plugin = NULL;
+  PyObject *__pyx_v_capsule = NULL;
+  void *__pyx_v_capsule_ptr;
+  __Pyx_RefNannyDeclarations
+  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;
+  PyObject *__pyx_t_6 = NULL;
+  unsigned 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;
+  int __pyx_t_13;
+  void *__pyx_t_14;
+  PyObject *__pyx_t_15 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("maybe_set_client_call_tracer_on_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":82
+ *   cdef void maybe_set_client_call_tracer_on_call(self, bytes method_name, bytes target) except *:
+ *     # TODO(xuanwn): use channel args to exclude those metrics.
+ *     for exclude_prefix in _observability._SERVICES_TO_EXCLUDE:             # <<<<<<<<<<<<<<
+ *       if exclude_prefix in method_name:
+ *         return
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_observability); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 82, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SERVICES_TO_EXCLUDE); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 82, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
+    __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1);
+    __pyx_t_3 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 82, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 82, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  for (;;) {
+    if (likely(!__pyx_t_4)) {
+      if (likely(PyList_CheckExact(__pyx_t_1))) {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(12, 82, __pyx_L1_error)
+          #endif
+          if (__pyx_t_3 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(12, 82, __pyx_L1_error)
+        #else
+        __pyx_t_2 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 82, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        #endif
+      } else {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(12, 82, __pyx_L1_error)
+          #endif
+          if (__pyx_t_3 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(12, 82, __pyx_L1_error)
+        #else
+        __pyx_t_2 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 82, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        #endif
+      }
+    } else {
+      __pyx_t_2 = __pyx_t_4(__pyx_t_1);
+      if (unlikely(!__pyx_t_2)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else __PYX_ERR(12, 82, __pyx_L1_error)
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_2);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_exclude_prefix, __pyx_t_2);
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":83
+ *     # TODO(xuanwn): use channel args to exclude those metrics.
+ *     for exclude_prefix in _observability._SERVICES_TO_EXCLUDE:
+ *       if exclude_prefix in method_name:             # <<<<<<<<<<<<<<
+ *         return
+ *     with _observability.get_plugin() as plugin:
+ */
+    __pyx_t_5 = (__Pyx_PySequence_ContainsTF(__pyx_v_exclude_prefix, __pyx_v_method_name, Py_EQ)); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(12, 83, __pyx_L1_error)
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":84
+ *     for exclude_prefix in _observability._SERVICES_TO_EXCLUDE:
+ *       if exclude_prefix in method_name:
+ *         return             # <<<<<<<<<<<<<<
+ *     with _observability.get_plugin() as plugin:
+ *       if not (plugin and plugin.observability_enabled):
+ */
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":83
+ *     # TODO(xuanwn): use channel args to exclude those metrics.
+ *     for exclude_prefix in _observability._SERVICES_TO_EXCLUDE:
+ *       if exclude_prefix in method_name:             # <<<<<<<<<<<<<<
+ *         return
+ *     with _observability.get_plugin() as plugin:
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":82
+ *   cdef void maybe_set_client_call_tracer_on_call(self, bytes method_name, bytes target) except *:
+ *     # TODO(xuanwn): use channel args to exclude those metrics.
+ *     for exclude_prefix in _observability._SERVICES_TO_EXCLUDE:             # <<<<<<<<<<<<<<
+ *       if exclude_prefix in method_name:
+ *         return
+ */
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":85
+ *       if exclude_prefix in method_name:
+ *         return
+ *     with _observability.get_plugin() as plugin:             # <<<<<<<<<<<<<<
+ *       if not (plugin and plugin.observability_enabled):
+ *         return
+ */
+  /*with:*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_observability); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 85, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get_plugin); if (unlikely(!__pyx_t_6)) __PYX_ERR(12, 85, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_6))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_6);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_6, function);
+        __pyx_t_7 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 85, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __pyx_t_8 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_exit); if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 85, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_enter); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 85, __pyx_L7_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_9 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_9)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_9);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_7 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_9, NULL};
+      __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      if (unlikely(!__pyx_t_6)) __PYX_ERR(12, 85, __pyx_L7_error)
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_t_2 = __pyx_t_6;
+    __pyx_t_6 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);
+        __Pyx_XGOTREF(__pyx_t_10);
+        __Pyx_XGOTREF(__pyx_t_11);
+        __Pyx_XGOTREF(__pyx_t_12);
+        /*try:*/ {
+          __pyx_v_plugin = __pyx_t_2;
+          __pyx_t_2 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":86
+ *         return
+ *     with _observability.get_plugin() as plugin:
+ *       if not (plugin and plugin.observability_enabled):             # <<<<<<<<<<<<<<
+ *         return
+ *       capsule = plugin.create_client_call_tracer(method_name, target)
+ */
+          __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_v_plugin); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(12, 86, __pyx_L11_error)
+          if (__pyx_t_13) {
+          } else {
+            __pyx_t_5 = __pyx_t_13;
+            goto __pyx_L18_bool_binop_done;
+          }
+          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin, __pyx_n_s_observability_enabled); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 86, __pyx_L11_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_13 < 0))) __PYX_ERR(12, 86, __pyx_L11_error)
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_5 = __pyx_t_13;
+          __pyx_L18_bool_binop_done:;
+          __pyx_t_13 = (!__pyx_t_5);
+          if (__pyx_t_13) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":87
+ *     with _observability.get_plugin() as plugin:
+ *       if not (plugin and plugin.observability_enabled):
+ *         return             # <<<<<<<<<<<<<<
+ *       capsule = plugin.create_client_call_tracer(method_name, target)
+ *       capsule_ptr = cpython.PyCapsule_GetPointer(capsule, CLIENT_CALL_TRACER)
+ */
+            goto __pyx_L15_try_return;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":86
+ *         return
+ *     with _observability.get_plugin() as plugin:
+ *       if not (plugin and plugin.observability_enabled):             # <<<<<<<<<<<<<<
+ *         return
+ *       capsule = plugin.create_client_call_tracer(method_name, target)
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":88
+ *       if not (plugin and plugin.observability_enabled):
+ *         return
+ *       capsule = plugin.create_client_call_tracer(method_name, target)             # <<<<<<<<<<<<<<
+ *       capsule_ptr = cpython.PyCapsule_GetPointer(capsule, CLIENT_CALL_TRACER)
+ *       _set_call_tracer(self.c_call, capsule_ptr)
+ */
+          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin, __pyx_n_s_create_client_call_tracer); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 88, __pyx_L11_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_6 = NULL;
+          __pyx_t_7 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (likely(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;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_v_method_name, __pyx_v_target};
+            __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7);
+            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+            if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 88, __pyx_L11_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          }
+          __pyx_v_capsule = __pyx_t_2;
+          __pyx_t_2 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":89
+ *         return
+ *       capsule = plugin.create_client_call_tracer(method_name, target)
+ *       capsule_ptr = cpython.PyCapsule_GetPointer(capsule, CLIENT_CALL_TRACER)             # <<<<<<<<<<<<<<
+ *       _set_call_tracer(self.c_call, capsule_ptr)
+ *       self.call_tracer_capsule = capsule
+ */
+          __pyx_t_14 = PyCapsule_GetPointer(__pyx_v_capsule, __pyx_v_7_cython_6cygrpc_CLIENT_CALL_TRACER); if (unlikely(__pyx_t_14 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(12, 89, __pyx_L11_error)
+          __pyx_v_capsule_ptr = __pyx_t_14;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":90
+ *       capsule = plugin.create_client_call_tracer(method_name, target)
+ *       capsule_ptr = cpython.PyCapsule_GetPointer(capsule, CLIENT_CALL_TRACER)
+ *       _set_call_tracer(self.c_call, capsule_ptr)             # <<<<<<<<<<<<<<
+ *       self.call_tracer_capsule = capsule
+ * 
+ */
+          __pyx_f_7_cython_6cygrpc__set_call_tracer(__pyx_v_self->c_call, __pyx_v_capsule_ptr); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 90, __pyx_L11_error)
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":91
+ *       capsule_ptr = cpython.PyCapsule_GetPointer(capsule, CLIENT_CALL_TRACER)
+ *       _set_call_tracer(self.c_call, capsule_ptr)
+ *       self.call_tracer_capsule = capsule             # <<<<<<<<<<<<<<
+ * 
+ * cdef class _ChannelState:
+ */
+          __Pyx_INCREF(__pyx_v_capsule);
+          __Pyx_GIVEREF(__pyx_v_capsule);
+          __Pyx_GOTREF(__pyx_v_self->call_tracer_capsule);
+          __Pyx_DECREF(__pyx_v_self->call_tracer_capsule);
+          __pyx_v_self->call_tracer_capsule = __pyx_v_capsule;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":85
+ *       if exclude_prefix in method_name:
+ *         return
+ *     with _observability.get_plugin() as plugin:             # <<<<<<<<<<<<<<
+ *       if not (plugin and plugin.observability_enabled):
+ *         return
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L11_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._CallState.maybe_set_client_call_tracer_on_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_6) < 0) __PYX_ERR(12, 85, __pyx_L13_except_error)
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_1);
+          __Pyx_XGOTREF(__pyx_t_6);
+          __pyx_t_9 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_9)) __PYX_ERR(12, 85, __pyx_L13_except_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_15 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_9, NULL);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          if (unlikely(!__pyx_t_15)) __PYX_ERR(12, 85, __pyx_L13_except_error)
+          __Pyx_GOTREF(__pyx_t_15);
+          __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_15);
+          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+          if (__pyx_t_13 < 0) __PYX_ERR(12, 85, __pyx_L13_except_error)
+          __pyx_t_5 = (!__pyx_t_13);
+          if (unlikely(__pyx_t_5)) {
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_XGIVEREF(__pyx_t_6);
+            __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_1, __pyx_t_6);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_6 = 0; 
+            __PYX_ERR(12, 85, __pyx_L13_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+          goto __pyx_L12_exception_handled;
+        }
+        __pyx_L13_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_10);
+        __Pyx_XGIVEREF(__pyx_t_11);
+        __Pyx_XGIVEREF(__pyx_t_12);
+        __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12);
+        goto __pyx_L1_error;
+        __pyx_L15_try_return:;
+        __Pyx_XGIVEREF(__pyx_t_10);
+        __Pyx_XGIVEREF(__pyx_t_11);
+        __Pyx_XGIVEREF(__pyx_t_12);
+        __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12);
+        goto __pyx_L8_return;
+        __pyx_L12_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_10);
+        __Pyx_XGIVEREF(__pyx_t_11);
+        __Pyx_XGIVEREF(__pyx_t_12);
+        __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12);
+        __pyx_L16_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_8) {
+          __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (unlikely(!__pyx_t_12)) __PYX_ERR(12, 85, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_12);
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        }
+        goto __pyx_L10;
+      }
+      __pyx_L8_return: {
+        if (__pyx_t_8) {
+          __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (unlikely(!__pyx_t_12)) __PYX_ERR(12, 85, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_12);
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        }
+        goto __pyx_L0;
+      }
+      __pyx_L10:;
+    }
+    goto __pyx_L23;
+    __pyx_L7_error:;
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    goto __pyx_L1_error;
+    __pyx_L23:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":80
+ *     _observability.delete_call_tracer(self.call_tracer_capsule)
+ * 
+ *   cdef void maybe_set_client_call_tracer_on_call(self, bytes method_name, bytes target) except *:             # <<<<<<<<<<<<<<
+ *     # TODO(xuanwn): use channel args to exclude those metrics.
+ *     for exclude_prefix in _observability._SERVICES_TO_EXCLUDE:
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("_cython.cygrpc._CallState.maybe_set_client_call_tracer_on_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_exclude_prefix);
+  __Pyx_XDECREF(__pyx_v_plugin);
+  __Pyx_XDECREF(__pyx_v_capsule);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10_CallState_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10_CallState_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10_CallState_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10_CallState_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10_CallState_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10_CallState_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._CallState.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10_CallState_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10_CallState_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10_CallState_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10_CallState_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._CallState.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10_CallState_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10_CallState_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._CallState.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":95
+ * cdef class _ChannelState:
+ * 
+ *   def __cinit__(self, target):             # <<<<<<<<<<<<<<
+ *     self.target = target
+ *     self.condition = threading.Condition()
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_13_ChannelState_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_13_ChannelState_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_target = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_target,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_target)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 95, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(12, 95, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_target = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(12, 95, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelState.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_13_ChannelState___cinit__(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_v_self), __pyx_v_target);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_13_ChannelState___cinit__(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_self, PyObject *__pyx_v_target) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":96
+ * 
+ *   def __cinit__(self, target):
+ *     self.target = target             # <<<<<<<<<<<<<<
+ *     self.condition = threading.Condition()
+ *     self.open = True
+ */
+  if (!(likely(PyBytes_CheckExact(__pyx_v_target))||((__pyx_v_target) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_target))) __PYX_ERR(12, 96, __pyx_L1_error)
+  __pyx_t_1 = __pyx_v_target;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->target);
+  __Pyx_DECREF(__pyx_v_self->target);
+  __pyx_v_self->target = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":97
+ *   def __cinit__(self, target):
+ *     self.target = target
+ *     self.condition = threading.Condition()             # <<<<<<<<<<<<<<
+ *     self.open = True
+ *     self.integrated_call_states = {}
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 97, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Condition); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 97, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 97, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->condition);
+  __Pyx_DECREF(__pyx_v_self->condition);
+  __pyx_v_self->condition = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":98
+ *     self.target = target
+ *     self.condition = threading.Condition()
+ *     self.open = True             # <<<<<<<<<<<<<<
+ *     self.integrated_call_states = {}
+ *     self.segregated_call_states = set()
+ */
+  __Pyx_INCREF(Py_True);
+  __Pyx_GIVEREF(Py_True);
+  __Pyx_GOTREF(__pyx_v_self->open);
+  __Pyx_DECREF(__pyx_v_self->open);
+  __pyx_v_self->open = Py_True;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":99
+ *     self.condition = threading.Condition()
+ *     self.open = True
+ *     self.integrated_call_states = {}             # <<<<<<<<<<<<<<
+ *     self.segregated_call_states = set()
+ *     self.connectivity_due = set()
+ */
+  __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 99, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->integrated_call_states);
+  __Pyx_DECREF(__pyx_v_self->integrated_call_states);
+  __pyx_v_self->integrated_call_states = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":100
+ *     self.open = True
+ *     self.integrated_call_states = {}
+ *     self.segregated_call_states = set()             # <<<<<<<<<<<<<<
+ *     self.connectivity_due = set()
+ *     self.closed_reason = None
+ */
+  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 100, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->segregated_call_states);
+  __Pyx_DECREF(__pyx_v_self->segregated_call_states);
+  __pyx_v_self->segregated_call_states = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":101
+ *     self.integrated_call_states = {}
+ *     self.segregated_call_states = set()
+ *     self.connectivity_due = set()             # <<<<<<<<<<<<<<
+ *     self.closed_reason = None
+ * 
+ */
+  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 101, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->connectivity_due);
+  __Pyx_DECREF(__pyx_v_self->connectivity_due);
+  __pyx_v_self->connectivity_due = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":102
+ *     self.segregated_call_states = set()
+ *     self.connectivity_due = set()
+ *     self.closed_reason = None             # <<<<<<<<<<<<<<
+ * 
+ * cdef class CallHandle:
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->closed_reason);
+  __Pyx_DECREF(__pyx_v_self->closed_reason);
+  __pyx_v_self->closed_reason = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":95
+ * cdef class _ChannelState:
+ * 
+ *   def __cinit__(self, target):             # <<<<<<<<<<<<<<
+ *     self.target = target
+ *     self.condition = threading.Condition()
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelState.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_13_ChannelState_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_13_ChannelState_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13_ChannelState_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_13_ChannelState_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_13_ChannelState_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_13_ChannelState_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelState.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_13_ChannelState_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_13_ChannelState_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13_ChannelState_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_13_ChannelState_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelState.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_13_ChannelState_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_13_ChannelState_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ChannelState.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":106
+ * cdef class CallHandle:
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, object method):             # <<<<<<<<<<<<<<
+ *     self.method = method
+ *     cpython.Py_INCREF(method)
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_10CallHandle_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_10CallHandle_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state = 0;
+  PyObject *__pyx_v_method = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_channel_state,&__pyx_n_s_method,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 106, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 106, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(12, 106, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(12, 106, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_channel_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)values[0]);
+    __pyx_v_method = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 106, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CallHandle.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_channel_state), __pyx_ptype_7_cython_6cygrpc__ChannelState, 1, "channel_state", 0))) __PYX_ERR(12, 106, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10CallHandle___cinit__(((struct __pyx_obj_7_cython_6cygrpc_CallHandle *)__pyx_v_self), __pyx_v_channel_state, __pyx_v_method);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_10CallHandle___cinit__(struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, PyObject *__pyx_v_method) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  char const *__pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":107
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, object method):
+ *     self.method = method             # <<<<<<<<<<<<<<
+ *     cpython.Py_INCREF(method)
+ *     # Note that since we always pass None for host, we set the
+ */
+  __Pyx_INCREF(__pyx_v_method);
+  __Pyx_GIVEREF(__pyx_v_method);
+  __Pyx_GOTREF(__pyx_v_self->method);
+  __Pyx_DECREF(__pyx_v_self->method);
+  __pyx_v_self->method = __pyx_v_method;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":108
+ *   def __cinit__(self, _ChannelState channel_state, object method):
+ *     self.method = method
+ *     cpython.Py_INCREF(method)             # <<<<<<<<<<<<<<
+ *     # Note that since we always pass None for host, we set the
+ *     # second-to-last parameter of grpc_channel_register_call to a fixed
+ */
+  Py_INCREF(__pyx_v_method);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":113
+ *     # NULL value.
+ *     self.c_call_handle = grpc_channel_register_call(
+ *       channel_state.c_channel, <const char *>method, NULL, NULL)             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+  __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_method); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) __PYX_ERR(12, 113, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":112
+ *     # second-to-last parameter of grpc_channel_register_call to a fixed
+ *     # NULL value.
+ *     self.c_call_handle = grpc_channel_register_call(             # <<<<<<<<<<<<<<
+ *       channel_state.c_channel, <const char *>method, NULL, NULL)
+ * 
+ */
+  __pyx_v_self->c_call_handle = grpc_channel_register_call(__pyx_v_channel_state->c_channel, ((char const *)__pyx_t_1), NULL, NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":106
+ * cdef class CallHandle:
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, object method):             # <<<<<<<<<<<<<<
+ *     self.method = method
+ *     cpython.Py_INCREF(method)
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallHandle.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":115
+ *       channel_state.c_channel, <const char *>method, NULL, NULL)
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     cpython.Py_DECREF(self.method)
+ * 
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_10CallHandle_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_10CallHandle_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_10CallHandle_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_CallHandle *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_10CallHandle_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("__dealloc__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":116
+ * 
+ *   def __dealloc__(self):
+ *     cpython.Py_DECREF(self.method)             # <<<<<<<<<<<<<<
+ * 
+ *   @property
+ */
+  __pyx_t_1 = __pyx_v_self->method;
+  __Pyx_INCREF(__pyx_t_1);
+  Py_DECREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":115
+ *       channel_state.c_channel, <const char *>method, NULL, NULL)
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     cpython.Py_DECREF(self.method)
+ * 
+ */
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":118
+ *     cpython.Py_DECREF(self.method)
+ * 
+ *   @property             # <<<<<<<<<<<<<<
+ *   def call_handle(self):
+ *     return cpython.PyLong_FromVoidPtr(self.c_call_handle)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10CallHandle_11call_handle_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_10CallHandle_11call_handle_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10CallHandle_11call_handle___get__(((struct __pyx_obj_7_cython_6cygrpc_CallHandle *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10CallHandle_11call_handle___get__(struct __pyx_obj_7_cython_6cygrpc_CallHandle *__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("__get__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":120
+ *   @property
+ *   def call_handle(self):
+ *     return cpython.PyLong_FromVoidPtr(self.c_call_handle)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyLong_FromVoidPtr(__pyx_v_self->c_call_handle); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 120, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":118
+ *     cpython.Py_DECREF(self.method)
+ * 
+ *   @property             # <<<<<<<<<<<<<<
+ *   def call_handle(self):
+ *     return cpython.PyLong_FromVoidPtr(self.c_call_handle)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CallHandle.call_handle.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10CallHandle_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10CallHandle_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10CallHandle_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10CallHandle_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10CallHandle_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallHandle *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10CallHandle_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallHandle.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10CallHandle_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10CallHandle_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10CallHandle_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10CallHandle_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CallHandle.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10CallHandle_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallHandle *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10CallHandle_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallHandle *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallHandle.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":124
+ * 
+ * 
+ * cdef tuple _operate(grpc_call *c_call, object operations, object user_tag):             # <<<<<<<<<<<<<<
+ *   cdef grpc_call_error c_call_error
+ *   cdef _BatchOperationTag tag = _BatchOperationTag(user_tag, operations, None)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__operate(grpc_call *__pyx_v_c_call, PyObject *__pyx_v_operations, PyObject *__pyx_v_user_tag) {
+  grpc_call_error __pyx_v_c_call_error;
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_tag = 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("_operate", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":126
+ * cdef tuple _operate(grpc_call *c_call, object operations, object user_tag):
+ *   cdef grpc_call_error c_call_error
+ *   cdef _BatchOperationTag tag = _BatchOperationTag(user_tag, operations, None)             # <<<<<<<<<<<<<<
+ *   tag.prepare()
+ *   cpython.Py_INCREF(tag)
+ */
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 126, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_user_tag);
+  __Pyx_GIVEREF(__pyx_v_user_tag);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_user_tag)) __PYX_ERR(12, 126, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_operations);
+  __Pyx_GIVEREF(__pyx_v_operations);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_operations)) __PYX_ERR(12, 126, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(12, 126, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__BatchOperationTag), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 126, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_tag = ((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":127
+ *   cdef grpc_call_error c_call_error
+ *   cdef _BatchOperationTag tag = _BatchOperationTag(user_tag, operations, None)
+ *   tag.prepare()             # <<<<<<<<<<<<<<
+ *   cpython.Py_INCREF(tag)
+ *   with nogil:
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_tag->__pyx_base.__pyx_vtab)->prepare(__pyx_v_tag); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 127, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":128
+ *   cdef _BatchOperationTag tag = _BatchOperationTag(user_tag, operations, None)
+ *   tag.prepare()
+ *   cpython.Py_INCREF(tag)             # <<<<<<<<<<<<<<
+ *   with nogil:
+ *     c_call_error = grpc_call_start_batch(
+ */
+  Py_INCREF(((PyObject *)__pyx_v_tag));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":129
+ *   tag.prepare()
+ *   cpython.Py_INCREF(tag)
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     c_call_error = grpc_call_start_batch(
+ *         c_call, tag.c_ops, tag.c_nops, <cpython.PyObject *>tag, NULL)
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":130
+ *   cpython.Py_INCREF(tag)
+ *   with nogil:
+ *     c_call_error = grpc_call_start_batch(             # <<<<<<<<<<<<<<
+ *         c_call, tag.c_ops, tag.c_nops, <cpython.PyObject *>tag, NULL)
+ *   return c_call_error, tag
+ */
+        __pyx_v_c_call_error = grpc_call_start_batch(__pyx_v_c_call, __pyx_v_tag->c_ops, __pyx_v_tag->c_nops, ((PyObject *)__pyx_v_tag), NULL);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":129
+ *   tag.prepare()
+ *   cpython.Py_INCREF(tag)
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     c_call_error = grpc_call_start_batch(
+ *         c_call, tag.c_ops, tag.c_nops, <cpython.PyObject *>tag, NULL)
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":132
+ *     c_call_error = grpc_call_start_batch(
+ *         c_call, tag.c_ops, tag.c_nops, <cpython.PyObject *>tag, NULL)
+ *   return c_call_error, tag             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_c_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 132, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 132, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2)) __PYX_ERR(12, 132, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_tag);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_tag);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_tag))) __PYX_ERR(12, 132, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":124
+ * 
+ * 
+ * cdef tuple _operate(grpc_call *c_call, object operations, object user_tag):             # <<<<<<<<<<<<<<
+ *   cdef grpc_call_error c_call_error
+ *   cdef _BatchOperationTag tag = _BatchOperationTag(user_tag, operations, None)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._operate", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_tag);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":135
+ * 
+ * 
+ * cdef object _operate_from_integrated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, _CallState call_state, object operations,
+ *     object user_tag):
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__operate_from_integrated_call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state, PyObject *__pyx_v_operations, PyObject *__pyx_v_user_tag) {
+  grpc_call_error __pyx_v_c_call_error;
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_tag = 0;
+  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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  grpc_call_error __pyx_t_10;
+  int __pyx_t_11;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_t_14;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_operate_from_integrated_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":140
+ *   cdef grpc_call_error c_call_error
+ *   cdef _BatchOperationTag tag
+ *   with channel_state.condition:             # <<<<<<<<<<<<<<
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 140, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 140, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 140, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":141
+ *   cdef _BatchOperationTag tag
+ *   with channel_state.condition:
+ *     if call_state.due:             # <<<<<<<<<<<<<<
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:
+ */
+          __pyx_t_9 = (__pyx_v_call_state->due != Py_None)&&(PySet_GET_SIZE(__pyx_v_call_state->due) != 0);
+          if (__pyx_t_9) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":142
+ *   with channel_state.condition:
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)             # <<<<<<<<<<<<<<
+ *       if c_call_error == GRPC_CALL_OK:
+ *         call_state.due.add(tag)
+ */
+            __pyx_t_2 = __pyx_f_7_cython_6cygrpc__operate(__pyx_v_call_state->c_call, __pyx_v_operations, __pyx_v_user_tag); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 142, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            if (likely(__pyx_t_2 != Py_None)) {
+              PyObject* sequence = __pyx_t_2;
+              Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+              if (unlikely(size != 2)) {
+                if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                __PYX_ERR(12, 142, __pyx_L7_error)
+              }
+              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+              __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_ERR(12, 142, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 142, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_4);
+              #endif
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            } else {
+              __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(12, 142, __pyx_L7_error)
+            }
+            __pyx_t_10 = ((grpc_call_error)__Pyx_PyInt_As_grpc_call_error(__pyx_t_3)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 142, __pyx_L7_error)
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_7_cython_6cygrpc__BatchOperationTag))))) __PYX_ERR(12, 142, __pyx_L7_error)
+            __pyx_v_c_call_error = __pyx_t_10;
+            __pyx_v_tag = ((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_t_4);
+            __pyx_t_4 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":143
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *         call_state.due.add(tag)
+ *         channel_state.integrated_call_states[tag] = call_state
+ */
+            __pyx_t_9 = (__pyx_v_c_call_error == GRPC_CALL_OK);
+            if (__pyx_t_9) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":144
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:
+ *         call_state.due.add(tag)             # <<<<<<<<<<<<<<
+ *         channel_state.integrated_call_states[tag] = call_state
+ *         return True
+ */
+              if (unlikely(__pyx_v_call_state->due == Py_None)) {
+                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "add");
+                __PYX_ERR(12, 144, __pyx_L7_error)
+              }
+              __pyx_t_11 = PySet_Add(__pyx_v_call_state->due, ((PyObject *)__pyx_v_tag)); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(12, 144, __pyx_L7_error)
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":145
+ *       if c_call_error == GRPC_CALL_OK:
+ *         call_state.due.add(tag)
+ *         channel_state.integrated_call_states[tag] = call_state             # <<<<<<<<<<<<<<
+ *         return True
+ *       else:
+ */
+              if (unlikely(__pyx_v_channel_state->integrated_call_states == Py_None)) {
+                PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+                __PYX_ERR(12, 145, __pyx_L7_error)
+              }
+              if (unlikely((PyDict_SetItem(__pyx_v_channel_state->integrated_call_states, ((PyObject *)__pyx_v_tag), ((PyObject *)__pyx_v_call_state)) < 0))) __PYX_ERR(12, 145, __pyx_L7_error)
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":146
+ *         call_state.due.add(tag)
+ *         channel_state.integrated_call_states[tag] = call_state
+ *         return True             # <<<<<<<<<<<<<<
+ *       else:
+ *         _raise_call_error_no_metadata(c_call_error)
+ */
+              __Pyx_XDECREF(__pyx_r);
+              __Pyx_INCREF(Py_True);
+              __pyx_r = Py_True;
+              goto __pyx_L11_try_return;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":143
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *         call_state.due.add(tag)
+ *         channel_state.integrated_call_states[tag] = call_state
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":148
+ *         return True
+ *       else:
+ *         _raise_call_error_no_metadata(c_call_error)             # <<<<<<<<<<<<<<
+ *     else:
+ *       return False
+ */
+            /*else*/ {
+              __pyx_t_2 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_c_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 148, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_f_7_cython_6cygrpc__raise_call_error_no_metadata(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 148, __pyx_L7_error)
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":141
+ *   cdef _BatchOperationTag tag
+ *   with channel_state.condition:
+ *     if call_state.due:             # <<<<<<<<<<<<<<
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:
+ */
+            goto __pyx_L13;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":150
+ *         _raise_call_error_no_metadata(c_call_error)
+ *     else:
+ *       return False             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+          /*else*/ {
+            __Pyx_XDECREF(__pyx_r);
+            __Pyx_INCREF(Py_False);
+            __pyx_r = Py_False;
+            goto __pyx_L11_try_return;
+          }
+          __pyx_L13:;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":140
+ *   cdef grpc_call_error c_call_error
+ *   cdef _BatchOperationTag tag
+ *   with channel_state.condition:             # <<<<<<<<<<<<<<
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._operate_from_integrated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_4, &__pyx_t_3) < 0) __PYX_ERR(12, 140, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __Pyx_XGOTREF(__pyx_t_3);
+          __pyx_t_12 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_12)) __PYX_ERR(12, 140, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_12);
+          __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_12, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          if (unlikely(!__pyx_t_13)) __PYX_ERR(12, 140, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(12, 140, __pyx_L9_except_error)
+          __pyx_t_14 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_14)) {
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_XGIVEREF(__pyx_t_3);
+            __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_4, __pyx_t_3);
+            __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_3 = 0; 
+            __PYX_ERR(12, 140, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L11_try_return:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L4_return;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 140, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L4_return: {
+        __pyx_t_8 = __pyx_r;
+        __pyx_r = 0;
+        if (__pyx_t_1) {
+          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_7)) __PYX_ERR(12, 140, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+        __pyx_r = __pyx_t_8;
+        __pyx_t_8 = 0;
+        goto __pyx_L0;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L18;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L18:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":135
+ * 
+ * 
+ * cdef object _operate_from_integrated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, _CallState call_state, object operations,
+ *     object user_tag):
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_AddTraceback("_cython.cygrpc._operate_from_integrated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_tag);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":153
+ * 
+ * 
+ * cdef object _operate_from_segregated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, _CallState call_state, object operations,
+ *     object user_tag):
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__operate_from_segregated_call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state, PyObject *__pyx_v_operations, PyObject *__pyx_v_user_tag) {
+  grpc_call_error __pyx_v_c_call_error;
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_tag = 0;
+  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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  grpc_call_error __pyx_t_10;
+  int __pyx_t_11;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_t_14;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_operate_from_segregated_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":158
+ *   cdef grpc_call_error c_call_error
+ *   cdef _BatchOperationTag tag
+ *   with channel_state.condition:             # <<<<<<<<<<<<<<
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 158, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 158, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 158, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":159
+ *   cdef _BatchOperationTag tag
+ *   with channel_state.condition:
+ *     if call_state.due:             # <<<<<<<<<<<<<<
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:
+ */
+          __pyx_t_9 = (__pyx_v_call_state->due != Py_None)&&(PySet_GET_SIZE(__pyx_v_call_state->due) != 0);
+          if (__pyx_t_9) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":160
+ *   with channel_state.condition:
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)             # <<<<<<<<<<<<<<
+ *       if c_call_error == GRPC_CALL_OK:
+ *         call_state.due.add(tag)
+ */
+            __pyx_t_2 = __pyx_f_7_cython_6cygrpc__operate(__pyx_v_call_state->c_call, __pyx_v_operations, __pyx_v_user_tag); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 160, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            if (likely(__pyx_t_2 != Py_None)) {
+              PyObject* sequence = __pyx_t_2;
+              Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+              if (unlikely(size != 2)) {
+                if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                __PYX_ERR(12, 160, __pyx_L7_error)
+              }
+              #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+              __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_ERR(12, 160, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 160, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_4);
+              #endif
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            } else {
+              __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(12, 160, __pyx_L7_error)
+            }
+            __pyx_t_10 = ((grpc_call_error)__Pyx_PyInt_As_grpc_call_error(__pyx_t_3)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 160, __pyx_L7_error)
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_7_cython_6cygrpc__BatchOperationTag))))) __PYX_ERR(12, 160, __pyx_L7_error)
+            __pyx_v_c_call_error = __pyx_t_10;
+            __pyx_v_tag = ((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_t_4);
+            __pyx_t_4 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":161
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *         call_state.due.add(tag)
+ *         return True
+ */
+            __pyx_t_9 = (__pyx_v_c_call_error == GRPC_CALL_OK);
+            if (__pyx_t_9) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":162
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:
+ *         call_state.due.add(tag)             # <<<<<<<<<<<<<<
+ *         return True
+ *       else:
+ */
+              if (unlikely(__pyx_v_call_state->due == Py_None)) {
+                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "add");
+                __PYX_ERR(12, 162, __pyx_L7_error)
+              }
+              __pyx_t_11 = PySet_Add(__pyx_v_call_state->due, ((PyObject *)__pyx_v_tag)); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(12, 162, __pyx_L7_error)
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":163
+ *       if c_call_error == GRPC_CALL_OK:
+ *         call_state.due.add(tag)
+ *         return True             # <<<<<<<<<<<<<<
+ *       else:
+ *         _raise_call_error_no_metadata(c_call_error)
+ */
+              __Pyx_XDECREF(__pyx_r);
+              __Pyx_INCREF(Py_True);
+              __pyx_r = Py_True;
+              goto __pyx_L11_try_return;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":161
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *         call_state.due.add(tag)
+ *         return True
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":165
+ *         return True
+ *       else:
+ *         _raise_call_error_no_metadata(c_call_error)             # <<<<<<<<<<<<<<
+ *     else:
+ *       return False
+ */
+            /*else*/ {
+              __pyx_t_2 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_c_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 165, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_f_7_cython_6cygrpc__raise_call_error_no_metadata(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 165, __pyx_L7_error)
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":159
+ *   cdef _BatchOperationTag tag
+ *   with channel_state.condition:
+ *     if call_state.due:             # <<<<<<<<<<<<<<
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *       if c_call_error == GRPC_CALL_OK:
+ */
+            goto __pyx_L13;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":167
+ *         _raise_call_error_no_metadata(c_call_error)
+ *     else:
+ *       return False             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+          /*else*/ {
+            __Pyx_XDECREF(__pyx_r);
+            __Pyx_INCREF(Py_False);
+            __pyx_r = Py_False;
+            goto __pyx_L11_try_return;
+          }
+          __pyx_L13:;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":158
+ *   cdef grpc_call_error c_call_error
+ *   cdef _BatchOperationTag tag
+ *   with channel_state.condition:             # <<<<<<<<<<<<<<
+ *     if call_state.due:
+ *       c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._operate_from_segregated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_4, &__pyx_t_3) < 0) __PYX_ERR(12, 158, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __Pyx_XGOTREF(__pyx_t_3);
+          __pyx_t_12 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_12)) __PYX_ERR(12, 158, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_12);
+          __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_12, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          if (unlikely(!__pyx_t_13)) __PYX_ERR(12, 158, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(12, 158, __pyx_L9_except_error)
+          __pyx_t_14 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_14)) {
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_XGIVEREF(__pyx_t_3);
+            __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_4, __pyx_t_3);
+            __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_3 = 0; 
+            __PYX_ERR(12, 158, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L11_try_return:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L4_return;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 158, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L4_return: {
+        __pyx_t_8 = __pyx_r;
+        __pyx_r = 0;
+        if (__pyx_t_1) {
+          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_7)) __PYX_ERR(12, 158, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+        __pyx_r = __pyx_t_8;
+        __pyx_t_8 = 0;
+        goto __pyx_L0;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L18;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L18:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":153
+ * 
+ * 
+ * cdef object _operate_from_segregated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, _CallState call_state, object operations,
+ *     object user_tag):
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_AddTraceback("_cython.cygrpc._operate_from_segregated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_tag);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":170
+ * 
+ * 
+ * cdef _cancel(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, _CallState call_state, grpc_status_code code,
+ *     str details):
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__cancel(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state, grpc_status_code __pyx_v_code, PyObject *__pyx_v_details) {
+  grpc_call_error __pyx_v_c_call_error;
+  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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  char const *__pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  int __pyx_t_13;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_cancel", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":174
+ *     str details):
+ *   cdef grpc_call_error c_call_error
+ *   with channel_state.condition:             # <<<<<<<<<<<<<<
+ *     if call_state.due:
+ *       c_call_error = grpc_call_cancel_with_status(
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 174, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 174, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 174, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":175
+ *   cdef grpc_call_error c_call_error
+ *   with channel_state.condition:
+ *     if call_state.due:             # <<<<<<<<<<<<<<
+ *       c_call_error = grpc_call_cancel_with_status(
+ *           call_state.c_call, code, _encode(details), NULL)
+ */
+          __pyx_t_9 = (__pyx_v_call_state->due != Py_None)&&(PySet_GET_SIZE(__pyx_v_call_state->due) != 0);
+          if (__pyx_t_9) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":177
+ *     if call_state.due:
+ *       c_call_error = grpc_call_cancel_with_status(
+ *           call_state.c_call, code, _encode(details), NULL)             # <<<<<<<<<<<<<<
+ *       _check_and_raise_call_error_no_metadata(c_call_error)
+ * 
+ */
+            __pyx_t_2 = __pyx_f_7_cython_6cygrpc__encode(__pyx_v_details); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 177, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            if (unlikely(__pyx_t_2 == Py_None)) {
+              PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+              __PYX_ERR(12, 177, __pyx_L7_error)
+            }
+            __pyx_t_10 = __Pyx_PyBytes_AsString(__pyx_t_2); if (unlikely((!__pyx_t_10) && PyErr_Occurred())) __PYX_ERR(12, 177, __pyx_L7_error)
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":176
+ *   with channel_state.condition:
+ *     if call_state.due:
+ *       c_call_error = grpc_call_cancel_with_status(             # <<<<<<<<<<<<<<
+ *           call_state.c_call, code, _encode(details), NULL)
+ *       _check_and_raise_call_error_no_metadata(c_call_error)
+ */
+            __pyx_v_c_call_error = grpc_call_cancel_with_status(__pyx_v_call_state->c_call, __pyx_v_code, __pyx_t_10, NULL);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":178
+ *       c_call_error = grpc_call_cancel_with_status(
+ *           call_state.c_call, code, _encode(details), NULL)
+ *       _check_and_raise_call_error_no_metadata(c_call_error)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+            __pyx_t_2 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_c_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 178, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = __pyx_f_7_cython_6cygrpc__check_and_raise_call_error_no_metadata(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 178, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":175
+ *   cdef grpc_call_error c_call_error
+ *   with channel_state.condition:
+ *     if call_state.due:             # <<<<<<<<<<<<<<
+ *       c_call_error = grpc_call_cancel_with_status(
+ *           call_state.c_call, code, _encode(details), NULL)
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":174
+ *     str details):
+ *   cdef grpc_call_error c_call_error
+ *   with channel_state.condition:             # <<<<<<<<<<<<<<
+ *     if call_state.due:
+ *       c_call_error = grpc_call_cancel_with_status(
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_4) < 0) __PYX_ERR(12, 174, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_11 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_11)) __PYX_ERR(12, 174, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (unlikely(!__pyx_t_12)) __PYX_ERR(12, 174, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_12);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_12);
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(12, 174, __pyx_L9_except_error)
+          __pyx_t_13 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_13)) {
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_2, __pyx_t_4);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(12, 174, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 174, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L17;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L17:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":170
+ * 
+ * 
+ * cdef _cancel(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, _CallState call_state, grpc_status_code code,
+ *     str details):
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("_cython.cygrpc._cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":181
+ * 
+ * 
+ * cdef _next_call_event(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, grpc_completion_queue *c_completion_queue,
+ *     on_success, on_failure, deadline):
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__next_call_event(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, grpc_completion_queue *__pyx_v_c_completion_queue, PyObject *__pyx_v_on_success, PyObject *__pyx_v_on_failure, PyObject *__pyx_v_deadline) {
+  PyObject *__pyx_v_tag = NULL;
+  PyObject *__pyx_v_event = 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 *);
+  PyObject *__pyx_t_9 = NULL;
+  unsigned int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  PyObject *__pyx_t_14 = NULL;
+  int __pyx_t_15;
+  int __pyx_t_16;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *__pyx_t_18 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_next_call_event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":200
+ *     deadline: The point after which the RPC will time out.
+ *   """
+ *   try:             # <<<<<<<<<<<<<<
+ *     tag, event = _latent_event(c_completion_queue, deadline)
+ *   # NOTE(rbellevi): This broad except enables us to clean up resources before
+ */
+  {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":201
+ *   """
+ *   try:
+ *     tag, event = _latent_event(c_completion_queue, deadline)             # <<<<<<<<<<<<<<
+ *   # NOTE(rbellevi): This broad except enables us to clean up resources before
+ *   # propagating any exceptions raised by signal handlers to the application.
+ */
+      __pyx_t_4 = __pyx_f_7_cython_6cygrpc__latent_event(__pyx_v_c_completion_queue, __pyx_v_deadline); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 201, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
+        PyObject* sequence = __pyx_t_4;
+        Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+        if (unlikely(size != 2)) {
+          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+          __PYX_ERR(12, 201, __pyx_L3_error)
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        if (likely(PyTuple_CheckExact(sequence))) {
+          __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
+          __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
+        } else {
+          __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
+          __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
+        }
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_INCREF(__pyx_t_6);
+        #else
+        __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(12, 201, __pyx_L3_error)
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(12, 201, __pyx_L3_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_ERR(12, 201, __pyx_L3_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __pyx_t_8 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_7);
+        index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L9_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_5);
+        index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L9_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_6);
+        if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) __PYX_ERR(12, 201, __pyx_L3_error)
+        __pyx_t_8 = NULL;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L10_unpacking_done;
+        __pyx_L9_unpacking_failed:;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __pyx_t_8 = NULL;
+        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+        __PYX_ERR(12, 201, __pyx_L3_error)
+        __pyx_L10_unpacking_done:;
+      }
+      __pyx_v_tag = __pyx_t_5;
+      __pyx_t_5 = 0;
+      __pyx_v_event = __pyx_t_6;
+      __pyx_t_6 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":200
+ *     deadline: The point after which the RPC will time out.
+ *   """
+ *   try:             # <<<<<<<<<<<<<<
+ *     tag, event = _latent_event(c_completion_queue, deadline)
+ *   # NOTE(rbellevi): This broad except enables us to clean up resources before
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":209
+ *     raise
+ *   else:
+ *     with channel_state.condition:             # <<<<<<<<<<<<<<
+ *       on_success(tag)
+ *       channel_state.condition.notify_all()
+ */
+    /*else:*/ {
+      /*with:*/ {
+        __pyx_t_9 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_9)) __PYX_ERR(12, 209, __pyx_L5_except_error)
+        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_6 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_6)) __PYX_ERR(12, 209, __pyx_L11_error)
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_5 = NULL;
+        __pyx_t_10 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(PyMethod_Check(__pyx_t_6))) {
+          __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6);
+          if (likely(__pyx_t_5)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+            __Pyx_INCREF(__pyx_t_5);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_6, function);
+            __pyx_t_10 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+          __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_10, 0+__pyx_t_10);
+          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 209, __pyx_L11_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*try:*/ {
+          {
+            __Pyx_PyThreadState_declare
+            __Pyx_PyThreadState_assign
+            __Pyx_ExceptionSave(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13);
+            __Pyx_XGOTREF(__pyx_t_11);
+            __Pyx_XGOTREF(__pyx_t_12);
+            __Pyx_XGOTREF(__pyx_t_13);
+            /*try:*/ {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":210
+ *   else:
+ *     with channel_state.condition:
+ *       on_success(tag)             # <<<<<<<<<<<<<<
+ *       channel_state.condition.notify_all()
+ *     return event
+ */
+              __Pyx_INCREF(__pyx_v_on_success);
+              __pyx_t_6 = __pyx_v_on_success; __pyx_t_5 = NULL;
+              __pyx_t_10 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (unlikely(PyMethod_Check(__pyx_t_6))) {
+                __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6);
+                if (likely(__pyx_t_5)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+                  __Pyx_INCREF(__pyx_t_5);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_6, function);
+                  __pyx_t_10 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_v_tag};
+                __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10);
+                __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+                if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 210, __pyx_L15_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":211
+ *     with channel_state.condition:
+ *       on_success(tag)
+ *       channel_state.condition.notify_all()             # <<<<<<<<<<<<<<
+ *     return event
+ * 
+ */
+              __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_channel_state->condition, __pyx_n_s_notify_all); if (unlikely(!__pyx_t_6)) __PYX_ERR(12, 211, __pyx_L15_error)
+              __Pyx_GOTREF(__pyx_t_6);
+              __pyx_t_5 = NULL;
+              __pyx_t_10 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (likely(PyMethod_Check(__pyx_t_6))) {
+                __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6);
+                if (likely(__pyx_t_5)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+                  __Pyx_INCREF(__pyx_t_5);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_6, function);
+                  __pyx_t_10 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+                __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_10, 0+__pyx_t_10);
+                __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+                if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 211, __pyx_L15_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":209
+ *     raise
+ *   else:
+ *     with channel_state.condition:             # <<<<<<<<<<<<<<
+ *       on_success(tag)
+ *       channel_state.condition.notify_all()
+ */
+            }
+            __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+            __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+            goto __pyx_L20_try_end;
+            __pyx_L15_error:;
+            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+            __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+            /*except:*/ {
+              __Pyx_AddTraceback("_cython.cygrpc._next_call_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+              if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_6, &__pyx_t_5) < 0) __PYX_ERR(12, 209, __pyx_L17_except_error)
+              __Pyx_XGOTREF(__pyx_t_4);
+              __Pyx_XGOTREF(__pyx_t_6);
+              __Pyx_XGOTREF(__pyx_t_5);
+              __pyx_t_7 = PyTuple_Pack(3, __pyx_t_4, __pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(12, 209, __pyx_L17_except_error)
+              __Pyx_GOTREF(__pyx_t_7);
+              __pyx_t_14 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_7, NULL);
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+              if (unlikely(!__pyx_t_14)) __PYX_ERR(12, 209, __pyx_L17_except_error)
+              __Pyx_GOTREF(__pyx_t_14);
+              __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_14);
+              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+              if (__pyx_t_15 < 0) __PYX_ERR(12, 209, __pyx_L17_except_error)
+              __pyx_t_16 = (!__pyx_t_15);
+              if (unlikely(__pyx_t_16)) {
+                __Pyx_GIVEREF(__pyx_t_4);
+                __Pyx_GIVEREF(__pyx_t_6);
+                __Pyx_XGIVEREF(__pyx_t_5);
+                __Pyx_ErrRestoreWithState(__pyx_t_4, __pyx_t_6, __pyx_t_5);
+                __pyx_t_4 = 0; __pyx_t_6 = 0; __pyx_t_5 = 0; 
+                __PYX_ERR(12, 209, __pyx_L17_except_error)
+              }
+              __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+              __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+              goto __pyx_L16_exception_handled;
+            }
+            __pyx_L17_except_error:;
+            __Pyx_XGIVEREF(__pyx_t_11);
+            __Pyx_XGIVEREF(__pyx_t_12);
+            __Pyx_XGIVEREF(__pyx_t_13);
+            __Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13);
+            goto __pyx_L5_except_error;
+            __pyx_L16_exception_handled:;
+            __Pyx_XGIVEREF(__pyx_t_11);
+            __Pyx_XGIVEREF(__pyx_t_12);
+            __Pyx_XGIVEREF(__pyx_t_13);
+            __Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13);
+            __pyx_L20_try_end:;
+          }
+        }
+        /*finally:*/ {
+          /*normal exit:*/{
+            if (__pyx_t_9) {
+              __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_tuple__11, NULL);
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              if (unlikely(!__pyx_t_13)) __PYX_ERR(12, 209, __pyx_L5_except_error)
+              __Pyx_GOTREF(__pyx_t_13);
+              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+            }
+            goto __pyx_L14;
+          }
+          __pyx_L14:;
+        }
+        goto __pyx_L24;
+        __pyx_L11_error:;
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L5_except_error;
+        __pyx_L24:;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":212
+ *       on_success(tag)
+ *       channel_state.condition.notify_all()
+ *     return event             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(__pyx_v_event);
+      __pyx_r = __pyx_v_event;
+      goto __pyx_L6_except_return;
+    }
+    __pyx_L3_error:;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":204
+ *   # NOTE(rbellevi): This broad except enables us to clean up resources before
+ *   # propagating any exceptions raised by signal handlers to the application.
+ *   except:             # <<<<<<<<<<<<<<
+ *     if on_failure is not None:
+ *       on_failure()
+ */
+    /*except:*/ {
+      __Pyx_AddTraceback("_cython.cygrpc._next_call_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_4) < 0) __PYX_ERR(12, 204, __pyx_L5_except_error)
+      __Pyx_XGOTREF(__pyx_t_5);
+      __Pyx_XGOTREF(__pyx_t_6);
+      __Pyx_XGOTREF(__pyx_t_4);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":205
+ *   # propagating any exceptions raised by signal handlers to the application.
+ *   except:
+ *     if on_failure is not None:             # <<<<<<<<<<<<<<
+ *       on_failure()
+ *     raise
+ */
+      __pyx_t_16 = (__pyx_v_on_failure != Py_None);
+      if (__pyx_t_16) {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":206
+ *   except:
+ *     if on_failure is not None:
+ *       on_failure()             # <<<<<<<<<<<<<<
+ *     raise
+ *   else:
+ */
+        __Pyx_INCREF(__pyx_v_on_failure);
+        __pyx_t_17 = __pyx_v_on_failure; __pyx_t_18 = NULL;
+        __pyx_t_10 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_17))) {
+          __pyx_t_18 = PyMethod_GET_SELF(__pyx_t_17);
+          if (likely(__pyx_t_18)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_17);
+            __Pyx_INCREF(__pyx_t_18);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_17, function);
+            __pyx_t_10 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_18, NULL};
+          __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_17, __pyx_callargs+1-__pyx_t_10, 0+__pyx_t_10);
+          __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0;
+          if (unlikely(!__pyx_t_7)) __PYX_ERR(12, 206, __pyx_L5_except_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":205
+ *   # propagating any exceptions raised by signal handlers to the application.
+ *   except:
+ *     if on_failure is not None:             # <<<<<<<<<<<<<<
+ *       on_failure()
+ *     raise
+ */
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":207
+ *     if on_failure is not None:
+ *       on_failure()
+ *     raise             # <<<<<<<<<<<<<<
+ *   else:
+ *     with channel_state.condition:
+ */
+      __Pyx_GIVEREF(__pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_6);
+      __Pyx_XGIVEREF(__pyx_t_4);
+      __Pyx_ErrRestoreWithState(__pyx_t_5, __pyx_t_6, __pyx_t_4);
+      __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_4 = 0; 
+      __PYX_ERR(12, 207, __pyx_L5_except_error)
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":200
+ *     deadline: The point after which the RPC will time out.
+ *   """
+ *   try:             # <<<<<<<<<<<<<<
+ *     tag, event = _latent_event(c_completion_queue, deadline)
+ *   # NOTE(rbellevi): This broad except enables us to clean up resources before
+ */
+    __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;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":181
+ * 
+ * 
+ * cdef _next_call_event(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, grpc_completion_queue *c_completion_queue,
+ *     on_success, on_failure, deadline):
+ */
+
+  /* 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_XDECREF(__pyx_t_17);
+  __Pyx_XDECREF(__pyx_t_18);
+  __Pyx_AddTraceback("_cython.cygrpc._next_call_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_tag);
+  __Pyx_XDECREF(__pyx_v_event);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":216
+ * 
+ * # TODO(https://github.com/grpc/grpc/issues/14569): This could be a lot simpler.
+ * cdef void _call(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, _CallState call_state,
+ *     grpc_completion_queue *c_completion_queue, on_success, int flags, method,
+ */
+
+static void __pyx_f_7_cython_6cygrpc__call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state, grpc_completion_queue *__pyx_v_c_completion_queue, PyObject *__pyx_v_on_success, int __pyx_v_flags, PyObject *__pyx_v_method, PyObject *__pyx_v_host, PyObject *__pyx_v_deadline, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials, PyObject *__pyx_v_operationses_and_user_tags, PyObject *__pyx_v_metadata, PyObject *__pyx_v_context, PyObject *__pyx_v_registered_call_handle) {
+  grpc_slice __pyx_v_method_slice;
+  grpc_slice __pyx_v_host_slice;
+  grpc_slice *__pyx_v_host_slice_ptr;
+  grpc_call_credentials *__pyx_v_c_call_credentials;
+  grpc_call_error __pyx_v_c_call_error;
+  PyObject *__pyx_v_started_tags = NULL;
+  PyObject *__pyx_v_operations = NULL;
+  PyObject *__pyx_v_user_tag = NULL;
+  PyObject *__pyx_v_tag = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  grpc_slice __pyx_t_10;
+  void *__pyx_t_11;
+  gpr_timespec __pyx_t_12;
+  grpc_call_credentials *__pyx_t_13;
+  Py_ssize_t __pyx_t_14;
+  PyObject *(*__pyx_t_15)(PyObject *);
+  PyObject *__pyx_t_16 = NULL;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *(*__pyx_t_18)(PyObject *);
+  grpc_call_error __pyx_t_19;
+  int __pyx_t_20;
+  PyObject *__pyx_t_21 = NULL;
+  int __pyx_t_22;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":258
+ *   cdef tuple error_and_wrapper_tag
+ *   cdef _BatchOperationTag wrapper_tag
+ *   with channel_state.condition:             # <<<<<<<<<<<<<<
+ *     if channel_state.open:
+ *       method_slice = _slice_from_bytes(method)
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 258, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_channel_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 258, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 258, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":259
+ *   cdef _BatchOperationTag wrapper_tag
+ *   with channel_state.condition:
+ *     if channel_state.open:             # <<<<<<<<<<<<<<
+ *       method_slice = _slice_from_bytes(method)
+ *       if host is None:
+ */
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_channel_state->open); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(12, 259, __pyx_L7_error)
+          if (likely(__pyx_t_9)) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":260
+ *   with channel_state.condition:
+ *     if channel_state.open:
+ *       method_slice = _slice_from_bytes(method)             # <<<<<<<<<<<<<<
+ *       if host is None:
+ *         host_slice_ptr = NULL
+ */
+            if (!(likely(PyBytes_CheckExact(__pyx_v_method))||((__pyx_v_method) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_method))) __PYX_ERR(12, 260, __pyx_L7_error)
+            __pyx_t_10 = __pyx_f_7_cython_6cygrpc__slice_from_bytes(((PyObject*)__pyx_v_method)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 260, __pyx_L7_error)
+            __pyx_v_method_slice = __pyx_t_10;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":261
+ *     if channel_state.open:
+ *       method_slice = _slice_from_bytes(method)
+ *       if host is None:             # <<<<<<<<<<<<<<
+ *         host_slice_ptr = NULL
+ *       else:
+ */
+            __pyx_t_9 = (__pyx_v_host == Py_None);
+            if (__pyx_t_9) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":262
+ *       method_slice = _slice_from_bytes(method)
+ *       if host is None:
+ *         host_slice_ptr = NULL             # <<<<<<<<<<<<<<
+ *       else:
+ *         host_slice = _slice_from_bytes(host)
+ */
+              __pyx_v_host_slice_ptr = NULL;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":261
+ *     if channel_state.open:
+ *       method_slice = _slice_from_bytes(method)
+ *       if host is None:             # <<<<<<<<<<<<<<
+ *         host_slice_ptr = NULL
+ *       else:
+ */
+              goto __pyx_L14;
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":264
+ *         host_slice_ptr = NULL
+ *       else:
+ *         host_slice = _slice_from_bytes(host)             # <<<<<<<<<<<<<<
+ *         host_slice_ptr = &host_slice
+ *       if registered_call_handle:
+ */
+            /*else*/ {
+              if (!(likely(PyBytes_CheckExact(__pyx_v_host))||((__pyx_v_host) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_host))) __PYX_ERR(12, 264, __pyx_L7_error)
+              __pyx_t_10 = __pyx_f_7_cython_6cygrpc__slice_from_bytes(((PyObject*)__pyx_v_host)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 264, __pyx_L7_error)
+              __pyx_v_host_slice = __pyx_t_10;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":265
+ *       else:
+ *         host_slice = _slice_from_bytes(host)
+ *         host_slice_ptr = &host_slice             # <<<<<<<<<<<<<<
+ *       if registered_call_handle:
+ *         call_state.c_call = grpc_channel_create_registered_call(
+ */
+              __pyx_v_host_slice_ptr = (&__pyx_v_host_slice);
+            }
+            __pyx_L14:;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":266
+ *         host_slice = _slice_from_bytes(host)
+ *         host_slice_ptr = &host_slice
+ *       if registered_call_handle:             # <<<<<<<<<<<<<<
+ *         call_state.c_call = grpc_channel_create_registered_call(
+ *             channel_state.c_channel, NULL, flags,
+ */
+            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_registered_call_handle); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(12, 266, __pyx_L7_error)
+            if (__pyx_t_9) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":269
+ *         call_state.c_call = grpc_channel_create_registered_call(
+ *             channel_state.c_channel, NULL, flags,
+ *             c_completion_queue, cpython.PyLong_AsVoidPtr(registered_call_handle),             # <<<<<<<<<<<<<<
+ *             _timespec_from_time(deadline), NULL)
+ *       else:
+ */
+              __pyx_t_11 = PyLong_AsVoidPtr(__pyx_v_registered_call_handle); if (unlikely(__pyx_t_11 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(12, 269, __pyx_L7_error)
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":270
+ *             channel_state.c_channel, NULL, flags,
+ *             c_completion_queue, cpython.PyLong_AsVoidPtr(registered_call_handle),
+ *             _timespec_from_time(deadline), NULL)             # <<<<<<<<<<<<<<
+ *       else:
+ *         call_state.c_call = grpc_channel_create_call(
+ */
+              __pyx_t_12 = __pyx_f_7_cython_6cygrpc__timespec_from_time(__pyx_v_deadline); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 270, __pyx_L7_error)
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":267
+ *         host_slice_ptr = &host_slice
+ *       if registered_call_handle:
+ *         call_state.c_call = grpc_channel_create_registered_call(             # <<<<<<<<<<<<<<
+ *             channel_state.c_channel, NULL, flags,
+ *             c_completion_queue, cpython.PyLong_AsVoidPtr(registered_call_handle),
+ */
+              __pyx_v_call_state->c_call = grpc_channel_create_registered_call(__pyx_v_channel_state->c_channel, NULL, __pyx_v_flags, __pyx_v_c_completion_queue, __pyx_t_11, __pyx_t_12, NULL);
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":266
+ *         host_slice = _slice_from_bytes(host)
+ *         host_slice_ptr = &host_slice
+ *       if registered_call_handle:             # <<<<<<<<<<<<<<
+ *         call_state.c_call = grpc_channel_create_registered_call(
+ *             channel_state.c_channel, NULL, flags,
+ */
+              goto __pyx_L15;
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":272
+ *             _timespec_from_time(deadline), NULL)
+ *       else:
+ *         call_state.c_call = grpc_channel_create_call(             # <<<<<<<<<<<<<<
+ *             channel_state.c_channel, NULL, flags,
+ *             c_completion_queue, method_slice, host_slice_ptr,
+ */
+            /*else*/ {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":275
+ *             channel_state.c_channel, NULL, flags,
+ *             c_completion_queue, method_slice, host_slice_ptr,
+ *             _timespec_from_time(deadline), NULL)             # <<<<<<<<<<<<<<
+ *       grpc_slice_unref(method_slice)
+ *       if host_slice_ptr:
+ */
+              __pyx_t_12 = __pyx_f_7_cython_6cygrpc__timespec_from_time(__pyx_v_deadline); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 275, __pyx_L7_error)
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":272
+ *             _timespec_from_time(deadline), NULL)
+ *       else:
+ *         call_state.c_call = grpc_channel_create_call(             # <<<<<<<<<<<<<<
+ *             channel_state.c_channel, NULL, flags,
+ *             c_completion_queue, method_slice, host_slice_ptr,
+ */
+              __pyx_v_call_state->c_call = grpc_channel_create_call(__pyx_v_channel_state->c_channel, NULL, __pyx_v_flags, __pyx_v_c_completion_queue, __pyx_v_method_slice, __pyx_v_host_slice_ptr, __pyx_t_12, NULL);
+            }
+            __pyx_L15:;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":276
+ *             c_completion_queue, method_slice, host_slice_ptr,
+ *             _timespec_from_time(deadline), NULL)
+ *       grpc_slice_unref(method_slice)             # <<<<<<<<<<<<<<
+ *       if host_slice_ptr:
+ *         grpc_slice_unref(host_slice)
+ */
+            grpc_slice_unref(__pyx_v_method_slice);
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":277
+ *             _timespec_from_time(deadline), NULL)
+ *       grpc_slice_unref(method_slice)
+ *       if host_slice_ptr:             # <<<<<<<<<<<<<<
+ *         grpc_slice_unref(host_slice)
+ *       call_state.maybe_set_client_call_tracer_on_call(method, channel_state.target)
+ */
+            __pyx_t_9 = (__pyx_v_host_slice_ptr != 0);
+            if (__pyx_t_9) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":278
+ *       grpc_slice_unref(method_slice)
+ *       if host_slice_ptr:
+ *         grpc_slice_unref(host_slice)             # <<<<<<<<<<<<<<
+ *       call_state.maybe_set_client_call_tracer_on_call(method, channel_state.target)
+ *       if context is not None:
+ */
+              grpc_slice_unref(__pyx_v_host_slice);
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":277
+ *             _timespec_from_time(deadline), NULL)
+ *       grpc_slice_unref(method_slice)
+ *       if host_slice_ptr:             # <<<<<<<<<<<<<<
+ *         grpc_slice_unref(host_slice)
+ *       call_state.maybe_set_client_call_tracer_on_call(method, channel_state.target)
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":279
+ *       if host_slice_ptr:
+ *         grpc_slice_unref(host_slice)
+ *       call_state.maybe_set_client_call_tracer_on_call(method, channel_state.target)             # <<<<<<<<<<<<<<
+ *       if context is not None:
+ *         set_census_context_on_call(call_state, context)
+ */
+            if (!(likely(PyBytes_CheckExact(__pyx_v_method))||((__pyx_v_method) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_method))) __PYX_ERR(12, 279, __pyx_L7_error)
+            __pyx_t_2 = __pyx_v_channel_state->target;
+            __Pyx_INCREF(__pyx_t_2);
+            ((struct __pyx_vtabstruct_7_cython_6cygrpc__CallState *)__pyx_v_call_state->__pyx_vtab)->maybe_set_client_call_tracer_on_call(__pyx_v_call_state, ((PyObject*)__pyx_v_method), ((PyObject*)__pyx_t_2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 279, __pyx_L7_error)
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":280
+ *         grpc_slice_unref(host_slice)
+ *       call_state.maybe_set_client_call_tracer_on_call(method, channel_state.target)
+ *       if context is not None:             # <<<<<<<<<<<<<<
+ *         set_census_context_on_call(call_state, context)
+ *       if credentials is not None:
+ */
+            __pyx_t_9 = (__pyx_v_context != Py_None);
+            if (__pyx_t_9) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":281
+ *       call_state.maybe_set_client_call_tracer_on_call(method, channel_state.target)
+ *       if context is not None:
+ *         set_census_context_on_call(call_state, context)             # <<<<<<<<<<<<<<
+ *       if credentials is not None:
+ *         c_call_credentials = credentials.c()
+ */
+              __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_set_census_context_on_call); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 281, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_4 = NULL;
+              __pyx_t_5 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (unlikely(PyMethod_Check(__pyx_t_3))) {
+                __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+                if (likely(__pyx_t_4)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+                  __Pyx_INCREF(__pyx_t_4);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_3, function);
+                  __pyx_t_5 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[3] = {__pyx_t_4, ((PyObject *)__pyx_v_call_state), __pyx_v_context};
+                __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+                __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 281, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_2);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":280
+ *         grpc_slice_unref(host_slice)
+ *       call_state.maybe_set_client_call_tracer_on_call(method, channel_state.target)
+ *       if context is not None:             # <<<<<<<<<<<<<<
+ *         set_census_context_on_call(call_state, context)
+ *       if credentials is not None:
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":282
+ *       if context is not None:
+ *         set_census_context_on_call(call_state, context)
+ *       if credentials is not None:             # <<<<<<<<<<<<<<
+ *         c_call_credentials = credentials.c()
+ *         c_call_error = grpc_call_set_credentials(
+ */
+            __pyx_t_9 = (((PyObject *)__pyx_v_credentials) != Py_None);
+            if (__pyx_t_9) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":283
+ *         set_census_context_on_call(call_state, context)
+ *       if credentials is not None:
+ *         c_call_credentials = credentials.c()             # <<<<<<<<<<<<<<
+ *         c_call_error = grpc_call_set_credentials(
+ *             call_state.c_call, c_call_credentials)
+ */
+              __pyx_t_13 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials *)__pyx_v_credentials->__pyx_vtab)->c(__pyx_v_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 283, __pyx_L7_error)
+              __pyx_v_c_call_credentials = __pyx_t_13;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":284
+ *       if credentials is not None:
+ *         c_call_credentials = credentials.c()
+ *         c_call_error = grpc_call_set_credentials(             # <<<<<<<<<<<<<<
+ *             call_state.c_call, c_call_credentials)
+ *         grpc_call_credentials_release(c_call_credentials)
+ */
+              __pyx_v_c_call_error = grpc_call_set_credentials(__pyx_v_call_state->c_call, __pyx_v_c_call_credentials);
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":286
+ *         c_call_error = grpc_call_set_credentials(
+ *             call_state.c_call, c_call_credentials)
+ *         grpc_call_credentials_release(c_call_credentials)             # <<<<<<<<<<<<<<
+ *         if c_call_error != GRPC_CALL_OK:
+ *           #TODO(xuanwn): Expand the scope of nogil
+ */
+              grpc_call_credentials_release(__pyx_v_c_call_credentials);
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":287
+ *             call_state.c_call, c_call_credentials)
+ *         grpc_call_credentials_release(c_call_credentials)
+ *         if c_call_error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:
+ */
+              __pyx_t_9 = (__pyx_v_c_call_error != GRPC_CALL_OK);
+              if (__pyx_t_9) {
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":289
+ *         if c_call_error != GRPC_CALL_OK:
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:             # <<<<<<<<<<<<<<
+ *             grpc_call_unref(call_state.c_call)
+ *           call_state.c_call = NULL
+ */
+                {
+                    #ifdef WITH_THREAD
+                    PyThreadState *_save;
+                    _save = NULL;
+                    Py_UNBLOCK_THREADS
+                    __Pyx_FastGIL_Remember();
+                    #endif
+                    /*try:*/ {
+
+                      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":290
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:
+ *             grpc_call_unref(call_state.c_call)             # <<<<<<<<<<<<<<
+ *           call_state.c_call = NULL
+ *           _raise_call_error_no_metadata(c_call_error)
+ */
+                      grpc_call_unref(__pyx_v_call_state->c_call);
+                    }
+
+                    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":289
+ *         if c_call_error != GRPC_CALL_OK:
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:             # <<<<<<<<<<<<<<
+ *             grpc_call_unref(call_state.c_call)
+ *           call_state.c_call = NULL
+ */
+                    /*finally:*/ {
+                      /*normal exit:*/{
+                        #ifdef WITH_THREAD
+                        __Pyx_FastGIL_Forget();
+                        Py_BLOCK_THREADS
+                        #endif
+                        goto __pyx_L22;
+                      }
+                      __pyx_L22:;
+                    }
+                }
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":291
+ *           with nogil:
+ *             grpc_call_unref(call_state.c_call)
+ *           call_state.c_call = NULL             # <<<<<<<<<<<<<<
+ *           _raise_call_error_no_metadata(c_call_error)
+ *       started_tags = set()
+ */
+                __pyx_v_call_state->c_call = NULL;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":292
+ *             grpc_call_unref(call_state.c_call)
+ *           call_state.c_call = NULL
+ *           _raise_call_error_no_metadata(c_call_error)             # <<<<<<<<<<<<<<
+ *       started_tags = set()
+ *       for operations, user_tag in operationses_and_user_tags:
+ */
+                __pyx_t_2 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_c_call_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 292, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_2);
+                __pyx_f_7_cython_6cygrpc__raise_call_error_no_metadata(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 292, __pyx_L7_error)
+                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":287
+ *             call_state.c_call, c_call_credentials)
+ *         grpc_call_credentials_release(c_call_credentials)
+ *         if c_call_error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:
+ */
+              }
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":282
+ *       if context is not None:
+ *         set_census_context_on_call(call_state, context)
+ *       if credentials is not None:             # <<<<<<<<<<<<<<
+ *         c_call_credentials = credentials.c()
+ *         c_call_error = grpc_call_set_credentials(
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":293
+ *           call_state.c_call = NULL
+ *           _raise_call_error_no_metadata(c_call_error)
+ *       started_tags = set()             # <<<<<<<<<<<<<<
+ *       for operations, user_tag in operationses_and_user_tags:
+ *         c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ */
+            __pyx_t_2 = PySet_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 293, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_v_started_tags = ((PyObject*)__pyx_t_2);
+            __pyx_t_2 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":294
+ *           _raise_call_error_no_metadata(c_call_error)
+ *       started_tags = set()
+ *       for operations, user_tag in operationses_and_user_tags:             # <<<<<<<<<<<<<<
+ *         c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *         if c_call_error == GRPC_CALL_OK:
+ */
+            if (likely(PyList_CheckExact(__pyx_v_operationses_and_user_tags)) || PyTuple_CheckExact(__pyx_v_operationses_and_user_tags)) {
+              __pyx_t_2 = __pyx_v_operationses_and_user_tags; __Pyx_INCREF(__pyx_t_2);
+              __pyx_t_14 = 0;
+              __pyx_t_15 = NULL;
+            } else {
+              __pyx_t_14 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_operationses_and_user_tags); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 294, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_15)) __PYX_ERR(12, 294, __pyx_L7_error)
+            }
+            for (;;) {
+              if (likely(!__pyx_t_15)) {
+                if (likely(PyList_CheckExact(__pyx_t_2))) {
+                  {
+                    Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2);
+                    #if !CYTHON_ASSUME_SAFE_MACROS
+                    if (unlikely((__pyx_temp < 0))) __PYX_ERR(12, 294, __pyx_L7_error)
+                    #endif
+                    if (__pyx_t_14 >= __pyx_temp) break;
+                  }
+                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                  __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(12, 294, __pyx_L7_error)
+                  #else
+                  __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 294, __pyx_L7_error)
+                  __Pyx_GOTREF(__pyx_t_3);
+                  #endif
+                } else {
+                  {
+                    Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2);
+                    #if !CYTHON_ASSUME_SAFE_MACROS
+                    if (unlikely((__pyx_temp < 0))) __PYX_ERR(12, 294, __pyx_L7_error)
+                    #endif
+                    if (__pyx_t_14 >= __pyx_temp) break;
+                  }
+                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                  __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++; if (unlikely((0 < 0))) __PYX_ERR(12, 294, __pyx_L7_error)
+                  #else
+                  __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_14); __pyx_t_14++; if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 294, __pyx_L7_error)
+                  __Pyx_GOTREF(__pyx_t_3);
+                  #endif
+                }
+              } else {
+                __pyx_t_3 = __pyx_t_15(__pyx_t_2);
+                if (unlikely(!__pyx_t_3)) {
+                  PyObject* exc_type = PyErr_Occurred();
+                  if (exc_type) {
+                    if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+                    else __PYX_ERR(12, 294, __pyx_L7_error)
+                  }
+                  break;
+                }
+                __Pyx_GOTREF(__pyx_t_3);
+              }
+              if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+                PyObject* sequence = __pyx_t_3;
+                Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+                if (unlikely(size != 2)) {
+                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  __PYX_ERR(12, 294, __pyx_L7_error)
+                }
+                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                if (likely(PyTuple_CheckExact(sequence))) {
+                  __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
+                  __pyx_t_16 = PyTuple_GET_ITEM(sequence, 1); 
+                } else {
+                  __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
+                  __pyx_t_16 = PyList_GET_ITEM(sequence, 1); 
+                }
+                __Pyx_INCREF(__pyx_t_4);
+                __Pyx_INCREF(__pyx_t_16);
+                #else
+                __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 294, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __pyx_t_16 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_16)) __PYX_ERR(12, 294, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_16);
+                #endif
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              } else {
+                Py_ssize_t index = -1;
+                __pyx_t_17 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_17)) __PYX_ERR(12, 294, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_17);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __pyx_t_18 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_17);
+                index = 0; __pyx_t_4 = __pyx_t_18(__pyx_t_17); if (unlikely(!__pyx_t_4)) goto __pyx_L25_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_4);
+                index = 1; __pyx_t_16 = __pyx_t_18(__pyx_t_17); if (unlikely(!__pyx_t_16)) goto __pyx_L25_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_16);
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_18(__pyx_t_17), 2) < 0) __PYX_ERR(12, 294, __pyx_L7_error)
+                __pyx_t_18 = NULL;
+                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+                goto __pyx_L26_unpacking_done;
+                __pyx_L25_unpacking_failed:;
+                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+                __pyx_t_18 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                __PYX_ERR(12, 294, __pyx_L7_error)
+                __pyx_L26_unpacking_done:;
+              }
+              __Pyx_XDECREF_SET(__pyx_v_operations, __pyx_t_4);
+              __pyx_t_4 = 0;
+              __Pyx_XDECREF_SET(__pyx_v_user_tag, __pyx_t_16);
+              __pyx_t_16 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":295
+ *       started_tags = set()
+ *       for operations, user_tag in operationses_and_user_tags:
+ *         c_call_error, tag = _operate(call_state.c_call, operations, user_tag)             # <<<<<<<<<<<<<<
+ *         if c_call_error == GRPC_CALL_OK:
+ *           started_tags.add(tag)
+ */
+              __pyx_t_3 = __pyx_f_7_cython_6cygrpc__operate(__pyx_v_call_state->c_call, __pyx_v_operations, __pyx_v_user_tag); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 295, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              if (likely(__pyx_t_3 != Py_None)) {
+                PyObject* sequence = __pyx_t_3;
+                Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+                if (unlikely(size != 2)) {
+                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  __PYX_ERR(12, 295, __pyx_L7_error)
+                }
+                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                __pyx_t_16 = PyTuple_GET_ITEM(sequence, 0); 
+                __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
+                __Pyx_INCREF(__pyx_t_16);
+                __Pyx_INCREF(__pyx_t_4);
+                #else
+                __pyx_t_16 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_16)) __PYX_ERR(12, 295, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_16);
+                __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 295, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                #endif
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              } else {
+                __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(12, 295, __pyx_L7_error)
+              }
+              __pyx_t_19 = ((grpc_call_error)__Pyx_PyInt_As_grpc_call_error(__pyx_t_16)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 295, __pyx_L7_error)
+              __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+              __pyx_v_c_call_error = __pyx_t_19;
+              __Pyx_XDECREF_SET(__pyx_v_tag, __pyx_t_4);
+              __pyx_t_4 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":296
+ *       for operations, user_tag in operationses_and_user_tags:
+ *         c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *         if c_call_error == GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *           started_tags.add(tag)
+ *         else:
+ */
+              __pyx_t_9 = (__pyx_v_c_call_error == GRPC_CALL_OK);
+              if (__pyx_t_9) {
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":297
+ *         c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *         if c_call_error == GRPC_CALL_OK:
+ *           started_tags.add(tag)             # <<<<<<<<<<<<<<
+ *         else:
+ *           grpc_call_cancel(call_state.c_call, NULL)
+ */
+                __pyx_t_20 = PySet_Add(__pyx_v_started_tags, __pyx_v_tag); if (unlikely(__pyx_t_20 == ((int)-1))) __PYX_ERR(12, 297, __pyx_L7_error)
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":296
+ *       for operations, user_tag in operationses_and_user_tags:
+ *         c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *         if c_call_error == GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *           started_tags.add(tag)
+ *         else:
+ */
+                goto __pyx_L27;
+              }
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":299
+ *           started_tags.add(tag)
+ *         else:
+ *           grpc_call_cancel(call_state.c_call, NULL)             # <<<<<<<<<<<<<<
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:
+ */
+              /*else*/ {
+                (void)(grpc_call_cancel(__pyx_v_call_state->c_call, NULL));
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":301
+ *           grpc_call_cancel(call_state.c_call, NULL)
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:             # <<<<<<<<<<<<<<
+ *             grpc_call_unref(call_state.c_call)
+ *           call_state.c_call = NULL
+ */
+                {
+                    #ifdef WITH_THREAD
+                    PyThreadState *_save;
+                    _save = NULL;
+                    Py_UNBLOCK_THREADS
+                    __Pyx_FastGIL_Remember();
+                    #endif
+                    /*try:*/ {
+
+                      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":302
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:
+ *             grpc_call_unref(call_state.c_call)             # <<<<<<<<<<<<<<
+ *           call_state.c_call = NULL
+ *           _raise_call_error(c_call_error, metadata)
+ */
+                      grpc_call_unref(__pyx_v_call_state->c_call);
+                    }
+
+                    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":301
+ *           grpc_call_cancel(call_state.c_call, NULL)
+ *           #TODO(xuanwn): Expand the scope of nogil
+ *           with nogil:             # <<<<<<<<<<<<<<
+ *             grpc_call_unref(call_state.c_call)
+ *           call_state.c_call = NULL
+ */
+                    /*finally:*/ {
+                      /*normal exit:*/{
+                        #ifdef WITH_THREAD
+                        __Pyx_FastGIL_Forget();
+                        Py_BLOCK_THREADS
+                        #endif
+                        goto __pyx_L32;
+                      }
+                      __pyx_L32:;
+                    }
+                }
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":303
+ *           with nogil:
+ *             grpc_call_unref(call_state.c_call)
+ *           call_state.c_call = NULL             # <<<<<<<<<<<<<<
+ *           _raise_call_error(c_call_error, metadata)
+ *       else:
+ */
+                __pyx_v_call_state->c_call = NULL;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":304
+ *             grpc_call_unref(call_state.c_call)
+ *           call_state.c_call = NULL
+ *           _raise_call_error(c_call_error, metadata)             # <<<<<<<<<<<<<<
+ *       else:
+ *         call_state.due.update(started_tags)
+ */
+                __pyx_t_3 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_c_call_error); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 304, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_f_7_cython_6cygrpc__raise_call_error(__pyx_t_3, __pyx_v_metadata); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 304, __pyx_L7_error)
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              }
+              __pyx_L27:;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":294
+ *           _raise_call_error_no_metadata(c_call_error)
+ *       started_tags = set()
+ *       for operations, user_tag in operationses_and_user_tags:             # <<<<<<<<<<<<<<
+ *         c_call_error, tag = _operate(call_state.c_call, operations, user_tag)
+ *         if c_call_error == GRPC_CALL_OK:
+ */
+            }
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            /*else*/ {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":306
+ *           _raise_call_error(c_call_error, metadata)
+ *       else:
+ *         call_state.due.update(started_tags)             # <<<<<<<<<<<<<<
+ *         on_success(started_tags)
+ *     else:
+ */
+              __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_call_state->due, __pyx_n_s_update); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 306, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_4 = NULL;
+              __pyx_t_5 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (likely(PyMethod_Check(__pyx_t_3))) {
+                __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+                if (likely(__pyx_t_4)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+                  __Pyx_INCREF(__pyx_t_4);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_3, function);
+                  __pyx_t_5 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_started_tags};
+                __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+                __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 306, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_2);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":307
+ *       else:
+ *         call_state.due.update(started_tags)
+ *         on_success(started_tags)             # <<<<<<<<<<<<<<
+ *     else:
+ *       raise ValueError('Cannot invoke RPC: %s' % channel_state.closed_reason)
+ */
+              __Pyx_INCREF(__pyx_v_on_success);
+              __pyx_t_3 = __pyx_v_on_success; __pyx_t_4 = NULL;
+              __pyx_t_5 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (unlikely(PyMethod_Check(__pyx_t_3))) {
+                __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+                if (likely(__pyx_t_4)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+                  __Pyx_INCREF(__pyx_t_4);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_3, function);
+                  __pyx_t_5 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_started_tags};
+                __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+                __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 307, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_2);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":259
+ *   cdef _BatchOperationTag wrapper_tag
+ *   with channel_state.condition:
+ *     if channel_state.open:             # <<<<<<<<<<<<<<
+ *       method_slice = _slice_from_bytes(method)
+ *       if host is None:
+ */
+            goto __pyx_L13;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":309
+ *         on_success(started_tags)
+ *     else:
+ *       raise ValueError('Cannot invoke RPC: %s' % channel_state.closed_reason)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+          /*else*/ {
+            __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Cannot_invoke_RPC_s, __pyx_v_channel_state->closed_reason); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 309, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 309, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __PYX_ERR(12, 309, __pyx_L7_error)
+          }
+          __pyx_L13:;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":258
+ *   cdef tuple error_and_wrapper_tag
+ *   cdef _BatchOperationTag wrapper_tag
+ *   with channel_state.condition:             # <<<<<<<<<<<<<<
+ *     if channel_state.open:
+ *       method_slice = _slice_from_bytes(method)
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
+        __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_4) < 0) __PYX_ERR(12, 258, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_16 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_16)) __PYX_ERR(12, 258, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_16);
+          __pyx_t_21 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_16, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+          if (unlikely(!__pyx_t_21)) __PYX_ERR(12, 258, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_21);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_21);
+          __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(12, 258, __pyx_L9_except_error)
+          __pyx_t_22 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_22)) {
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_2, __pyx_t_4);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(12, 258, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 258, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L38;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L38:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":216
+ * 
+ * # TODO(https://github.com/grpc/grpc/issues/14569): This could be a lot simpler.
+ * cdef void _call(             # <<<<<<<<<<<<<<
+ *     _ChannelState channel_state, _CallState call_state,
+ *     grpc_completion_queue *c_completion_queue, on_success, int flags, method,
+ */
+
+  /* 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_XDECREF(__pyx_t_16);
+  __Pyx_XDECREF(__pyx_t_17);
+  __Pyx_AddTraceback("_cython.cygrpc._call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_started_tags);
+  __Pyx_XDECREF(__pyx_v_operations);
+  __Pyx_XDECREF(__pyx_v_user_tag);
+  __Pyx_XDECREF(__pyx_v_tag);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":312
+ * 
+ * 
+ * cdef void _process_integrated_call_tag(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, _BatchOperationTag tag) except *:
+ *   cdef _CallState call_state = state.integrated_call_states.pop(tag)
+ */
+
+static void __pyx_f_7_cython_6cygrpc__process_integrated_call_tag(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state, struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_tag) {
+  struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state = 0;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_process_integrated_call_tag", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":314
+ * cdef void _process_integrated_call_tag(
+ *     _ChannelState state, _BatchOperationTag tag) except *:
+ *   cdef _CallState call_state = state.integrated_call_states.pop(tag)             # <<<<<<<<<<<<<<
+ *   call_state.due.remove(tag)
+ *   if not call_state.due:
+ */
+  if (unlikely(__pyx_v_state->integrated_call_states == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "pop");
+    __PYX_ERR(12, 314, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_PyDict_Pop(__pyx_v_state->integrated_call_states, ((PyObject *)__pyx_v_tag), ((PyObject *)NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 314, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7_cython_6cygrpc__CallState))))) __PYX_ERR(12, 314, __pyx_L1_error)
+  __pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":315
+ *     _ChannelState state, _BatchOperationTag tag) except *:
+ *   cdef _CallState call_state = state.integrated_call_states.pop(tag)
+ *   call_state.due.remove(tag)             # <<<<<<<<<<<<<<
+ *   if not call_state.due:
+ *     with nogil:
+ */
+  if (unlikely(__pyx_v_call_state->due == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "remove");
+    __PYX_ERR(12, 315, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PySet_Remove(__pyx_v_call_state->due, ((PyObject *)__pyx_v_tag)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(12, 315, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":316
+ *   cdef _CallState call_state = state.integrated_call_states.pop(tag)
+ *   call_state.due.remove(tag)
+ *   if not call_state.due:             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_call_unref(call_state.c_call)
+ */
+  __pyx_t_3 = (__pyx_v_call_state->due != Py_None)&&(PySet_GET_SIZE(__pyx_v_call_state->due) != 0);
+  __pyx_t_4 = (!__pyx_t_3);
+  if (__pyx_t_4) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":317
+ *   call_state.due.remove(tag)
+ *   if not call_state.due:
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_call_unref(call_state.c_call)
+ *     call_state.c_call = NULL
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":318
+ *   if not call_state.due:
+ *     with nogil:
+ *       grpc_call_unref(call_state.c_call)             # <<<<<<<<<<<<<<
+ *     call_state.c_call = NULL
+ *     call_state.maybe_delete_call_tracer()
+ */
+          grpc_call_unref(__pyx_v_call_state->c_call);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":317
+ *   call_state.due.remove(tag)
+ *   if not call_state.due:
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_call_unref(call_state.c_call)
+ *     call_state.c_call = NULL
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L6;
+          }
+          __pyx_L6:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":319
+ *     with nogil:
+ *       grpc_call_unref(call_state.c_call)
+ *     call_state.c_call = NULL             # <<<<<<<<<<<<<<
+ *     call_state.maybe_delete_call_tracer()
+ * 
+ */
+    __pyx_v_call_state->c_call = NULL;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":320
+ *       grpc_call_unref(call_state.c_call)
+ *     call_state.c_call = NULL
+ *     call_state.maybe_delete_call_tracer()             # <<<<<<<<<<<<<<
+ * 
+ * cdef class IntegratedCall:
+ */
+    ((struct __pyx_vtabstruct_7_cython_6cygrpc__CallState *)__pyx_v_call_state->__pyx_vtab)->maybe_delete_call_tracer(__pyx_v_call_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 320, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":316
+ *   cdef _CallState call_state = state.integrated_call_states.pop(tag)
+ *   call_state.due.remove(tag)
+ *   if not call_state.due:             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_call_unref(call_state.c_call)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":312
+ * 
+ * 
+ * cdef void _process_integrated_call_tag(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, _BatchOperationTag tag) except *:
+ *   cdef _CallState call_state = state.integrated_call_states.pop(tag)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._process_integrated_call_tag", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_call_state);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":324
+ * cdef class IntegratedCall:
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, _CallState call_state):             # <<<<<<<<<<<<<<
+ *     self._channel_state = channel_state
+ *     self._call_state = call_state
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_14IntegratedCall_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_14IntegratedCall_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state = 0;
+  struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_channel_state,&__pyx_n_s_call_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 324, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 324, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(12, 324, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(12, 324, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_channel_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)values[0]);
+    __pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)values[1]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 324, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.IntegratedCall.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_channel_state), __pyx_ptype_7_cython_6cygrpc__ChannelState, 1, "channel_state", 0))) __PYX_ERR(12, 324, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_state), __pyx_ptype_7_cython_6cygrpc__CallState, 1, "call_state", 0))) __PYX_ERR(12, 324, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14IntegratedCall___cinit__(((struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)__pyx_v_self), __pyx_v_channel_state, __pyx_v_call_state);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_14IntegratedCall___cinit__(struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":325
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, _CallState call_state):
+ *     self._channel_state = channel_state             # <<<<<<<<<<<<<<
+ *     self._call_state = call_state
+ * 
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_channel_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_channel_state);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_channel_state);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_channel_state);
+  __pyx_v_self->_channel_state = __pyx_v_channel_state;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":326
+ *   def __cinit__(self, _ChannelState channel_state, _CallState call_state):
+ *     self._channel_state = channel_state
+ *     self._call_state = call_state             # <<<<<<<<<<<<<<
+ * 
+ *   def operate(self, operations, tag):
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_call_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_call_state);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_call_state);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_call_state);
+  __pyx_v_self->_call_state = __pyx_v_call_state;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":324
+ * cdef class IntegratedCall:
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, _CallState call_state):             # <<<<<<<<<<<<<<
+ *     self._channel_state = channel_state
+ *     self._call_state = call_state
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":328
+ *     self._call_state = call_state
+ * 
+ *   def operate(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return _operate_from_integrated_call(
+ *         self._channel_state, self._call_state, operations, tag)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14IntegratedCall_3operate(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14IntegratedCall_3operate = {"operate", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14IntegratedCall_3operate, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14IntegratedCall_3operate(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_operations = 0;
+  PyObject *__pyx_v_tag = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("operate (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_operations,&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operations)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 328, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 328, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("operate", 1, 2, 2, 1); __PYX_ERR(12, 328, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "operate") < 0)) __PYX_ERR(12, 328, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_operations = values[0];
+    __pyx_v_tag = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("operate", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 328, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.IntegratedCall.operate", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14IntegratedCall_2operate(((struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)__pyx_v_self), __pyx_v_operations, __pyx_v_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14IntegratedCall_2operate(struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag) {
+  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("operate", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":329
+ * 
+ *   def operate(self, operations, tag):
+ *     return _operate_from_integrated_call(             # <<<<<<<<<<<<<<
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":330
+ *   def operate(self, operations, tag):
+ *     return _operate_from_integrated_call(
+ *         self._channel_state, self._call_state, operations, tag)             # <<<<<<<<<<<<<<
+ * 
+ *   def cancel(self, code, details):
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->_channel_state);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->_call_state);
+  __Pyx_INCREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":329
+ * 
+ *   def operate(self, operations, tag):
+ *     return _operate_from_integrated_call(             # <<<<<<<<<<<<<<
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc__operate_from_integrated_call(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_2), __pyx_v_operations, __pyx_v_tag); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 329, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":328
+ *     self._call_state = call_state
+ * 
+ *   def operate(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return _operate_from_integrated_call(
+ *         self._channel_state, self._call_state, operations, tag)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.IntegratedCall.operate", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":332
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ *   def cancel(self, code, details):             # <<<<<<<<<<<<<<
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14IntegratedCall_5cancel(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14IntegratedCall_5cancel = {"cancel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14IntegratedCall_5cancel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14IntegratedCall_5cancel(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_code = 0;
+  PyObject *__pyx_v_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancel (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,&__pyx_n_s_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 332, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 332, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("cancel", 1, 2, 2, 1); __PYX_ERR(12, 332, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cancel") < 0)) __PYX_ERR(12, 332, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_code = values[0];
+    __pyx_v_details = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("cancel", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 332, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.IntegratedCall.cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14IntegratedCall_4cancel(((struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)__pyx_v_self), __pyx_v_code, __pyx_v_details);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14IntegratedCall_4cancel(struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  grpc_status_code __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("cancel", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":333
+ * 
+ *   def cancel(self, code, details):
+ *     _cancel(self._channel_state, self._call_state, code, details)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->_channel_state);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->_call_state);
+  __Pyx_INCREF(__pyx_t_2);
+  __pyx_t_3 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_v_code)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 333, __pyx_L1_error)
+  if (!(likely(PyString_CheckExact(__pyx_v_details))||((__pyx_v_details) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_details))) __PYX_ERR(12, 333, __pyx_L1_error)
+  __pyx_t_4 = __pyx_f_7_cython_6cygrpc__cancel(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_2), __pyx_t_3, ((PyObject*)__pyx_v_details)); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 333, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":332
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ *   def cancel(self, code, details):             # <<<<<<<<<<<<<<
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ */
+
+  /* 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_4);
+  __Pyx_AddTraceback("_cython.cygrpc.IntegratedCall.cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14IntegratedCall_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14IntegratedCall_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14IntegratedCall_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14IntegratedCall_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14IntegratedCall_6__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14IntegratedCall_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.IntegratedCall.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14IntegratedCall_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14IntegratedCall_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14IntegratedCall_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14IntegratedCall_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.IntegratedCall.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14IntegratedCall_8__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14IntegratedCall_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.IntegratedCall.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":342
+ *   call_state = _CallState()
+ * 
+ *   def on_success(started_tags):             # <<<<<<<<<<<<<<
+ *     for started_tag in started_tags:
+ *       state.integrated_call_states[started_tag] = call_state
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_integrated_call_1on_success(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_integrated_call_1on_success = {"on_success", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_integrated_call_1on_success, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_integrated_call_1on_success(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_started_tags = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("on_success (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_started_tags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_started_tags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 342, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "on_success") < 0)) __PYX_ERR(12, 342, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_started_tags = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("on_success", 1, 1, 1, __pyx_nargs); __PYX_ERR(12, 342, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._integrated_call.on_success", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_integrated_call_on_success(__pyx_self, __pyx_v_started_tags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_integrated_call_on_success(PyObject *__pyx_self, PyObject *__pyx_v_started_tags) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *__pyx_outer_scope;
+  PyObject *__pyx_v_started_tag = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("on_success", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":343
+ * 
+ *   def on_success(started_tags):
+ *     for started_tag in started_tags:             # <<<<<<<<<<<<<<
+ *       state.integrated_call_states[started_tag] = call_state
+ * 
+ */
+  if (likely(PyList_CheckExact(__pyx_v_started_tags)) || PyTuple_CheckExact(__pyx_v_started_tags)) {
+    __pyx_t_1 = __pyx_v_started_tags; __Pyx_INCREF(__pyx_t_1);
+    __pyx_t_2 = 0;
+    __pyx_t_3 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_started_tags); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 343, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 343, __pyx_L1_error)
+  }
+  for (;;) {
+    if (likely(!__pyx_t_3)) {
+      if (likely(PyList_CheckExact(__pyx_t_1))) {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(12, 343, __pyx_L1_error)
+          #endif
+          if (__pyx_t_2 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(12, 343, __pyx_L1_error)
+        #else
+        __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 343, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        #endif
+      } else {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(12, 343, __pyx_L1_error)
+          #endif
+          if (__pyx_t_2 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(12, 343, __pyx_L1_error)
+        #else
+        __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 343, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        #endif
+      }
+    } else {
+      __pyx_t_4 = __pyx_t_3(__pyx_t_1);
+      if (unlikely(!__pyx_t_4)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else __PYX_ERR(12, 343, __pyx_L1_error)
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_4);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_started_tag, __pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":344
+ *   def on_success(started_tags):
+ *     for started_tag in started_tags:
+ *       state.integrated_call_states[started_tag] = call_state             # <<<<<<<<<<<<<<
+ * 
+ *   _call(
+ */
+    if (unlikely(!__pyx_cur_scope->__pyx_v_call_state)) { __Pyx_RaiseClosureNameError("call_state"); __PYX_ERR(12, 344, __pyx_L1_error) }
+    if (unlikely(!__pyx_cur_scope->__pyx_v_state)) { __Pyx_RaiseClosureNameError("state"); __PYX_ERR(12, 344, __pyx_L1_error) }
+    if (unlikely(__pyx_cur_scope->__pyx_v_state->integrated_call_states == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      __PYX_ERR(12, 344, __pyx_L1_error)
+    }
+    if (unlikely((PyDict_SetItem(__pyx_cur_scope->__pyx_v_state->integrated_call_states, __pyx_v_started_tag, ((PyObject *)__pyx_cur_scope->__pyx_v_call_state)) < 0))) __PYX_ERR(12, 344, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":343
+ * 
+ *   def on_success(started_tags):
+ *     for started_tag in started_tags:             # <<<<<<<<<<<<<<
+ *       state.integrated_call_states[started_tag] = call_state
+ * 
+ */
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":342
+ *   call_state = _CallState()
+ * 
+ *   def on_success(started_tags):             # <<<<<<<<<<<<<<
+ *     for started_tag in started_tags:
+ *       state.integrated_call_states[started_tag] = call_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_4);
+  __Pyx_AddTraceback("_cython.cygrpc._integrated_call.on_success", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_started_tag);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":336
+ * 
+ * 
+ * cdef IntegratedCall _integrated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, int flags, method, host, object deadline,
+ *     object metadata, CallCredentials credentials, operationses_and_user_tags,
+ */
+
+static struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__pyx_f_7_cython_6cygrpc__integrated_call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state, int __pyx_v_flags, PyObject *__pyx_v_method, PyObject *__pyx_v_host, PyObject *__pyx_v_deadline, PyObject *__pyx_v_metadata, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials, PyObject *__pyx_v_operationses_and_user_tags, PyObject *__pyx_v_context, PyObject *__pyx_v_registered_call_handle) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *__pyx_cur_scope;
+  PyObject *__pyx_v_on_success = 0;
+  struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *__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("_integrated_call", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(12, 336, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_state = __pyx_v_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_state);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":340
+ *     object metadata, CallCredentials credentials, operationses_and_user_tags,
+ *     object context, object registered_call_handle):
+ *   call_state = _CallState()             # <<<<<<<<<<<<<<
+ * 
+ *   def on_success(started_tags):
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__CallState)); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 340, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":342
+ *   call_state = _CallState()
+ * 
+ *   def on_success(started_tags):             # <<<<<<<<<<<<<<
+ *     for started_tag in started_tags:
+ *       state.integrated_call_states[started_tag] = call_state
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_integrated_call_1on_success, 0, __pyx_n_s_integrated_call_locals_on_succe, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__13)); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 342, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_on_success = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":347
+ * 
+ *   _call(
+ *       state, call_state, state.c_call_completion_queue, on_success, flags,             # <<<<<<<<<<<<<<
+ *       method, host, deadline, credentials, operationses_and_user_tags,
+ *       metadata, context, registered_call_handle)
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_v_state);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = ((PyObject *)__pyx_cur_scope->__pyx_v_call_state);
+  __Pyx_INCREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":346
+ *       state.integrated_call_states[started_tag] = call_state
+ * 
+ *   _call(             # <<<<<<<<<<<<<<
+ *       state, call_state, state.c_call_completion_queue, on_success, flags,
+ *       method, host, deadline, credentials, operationses_and_user_tags,
+ */
+  __pyx_f_7_cython_6cygrpc__call(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_2), __pyx_cur_scope->__pyx_v_state->c_call_completion_queue, __pyx_v_on_success, __pyx_v_flags, __pyx_v_method, __pyx_v_host, __pyx_v_deadline, __pyx_v_credentials, __pyx_v_operationses_and_user_tags, __pyx_v_metadata, __pyx_v_context, __pyx_v_registered_call_handle); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 346, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":351
+ *       metadata, context, registered_call_handle)
+ * 
+ *   return IntegratedCall(state, call_state)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF((PyObject *)__pyx_r);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 351, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_state))) __PYX_ERR(12, 351, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_call_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_call_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_cur_scope->__pyx_v_call_state))) __PYX_ERR(12, 351, __pyx_L1_error);
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_IntegratedCall), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 351, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_r = ((struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":336
+ * 
+ * 
+ * cdef IntegratedCall _integrated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, int flags, method, host, object deadline,
+ *     object metadata, CallCredentials credentials, operationses_and_user_tags,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._integrated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_on_success);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":354
+ * 
+ * 
+ * cdef object _process_segregated_call_tag(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, _CallState call_state,
+ *     grpc_completion_queue *c_completion_queue, _BatchOperationTag tag):
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__process_segregated_call_tag(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state, grpc_completion_queue *__pyx_v_c_completion_queue, struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_tag) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_process_segregated_call_tag", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":357
+ *     _ChannelState state, _CallState call_state,
+ *     grpc_completion_queue *c_completion_queue, _BatchOperationTag tag):
+ *   call_state.due.remove(tag)             # <<<<<<<<<<<<<<
+ *   if not call_state.due:
+ *     #TODO(xuanwn): Expand the scope of nogil
+ */
+  if (unlikely(__pyx_v_call_state->due == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "remove");
+    __PYX_ERR(12, 357, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_PySet_Remove(__pyx_v_call_state->due, ((PyObject *)__pyx_v_tag)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(12, 357, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":358
+ *     grpc_completion_queue *c_completion_queue, _BatchOperationTag tag):
+ *   call_state.due.remove(tag)
+ *   if not call_state.due:             # <<<<<<<<<<<<<<
+ *     #TODO(xuanwn): Expand the scope of nogil
+ *     with nogil:
+ */
+  __pyx_t_2 = (__pyx_v_call_state->due != Py_None)&&(PySet_GET_SIZE(__pyx_v_call_state->due) != 0);
+  __pyx_t_3 = (!__pyx_t_2);
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":360
+ *   if not call_state.due:
+ *     #TODO(xuanwn): Expand the scope of nogil
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_call_unref(call_state.c_call)
+ *     call_state.c_call = NULL
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":361
+ *     #TODO(xuanwn): Expand the scope of nogil
+ *     with nogil:
+ *       grpc_call_unref(call_state.c_call)             # <<<<<<<<<<<<<<
+ *     call_state.c_call = NULL
+ *     call_state.maybe_delete_call_tracer()
+ */
+          grpc_call_unref(__pyx_v_call_state->c_call);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":360
+ *   if not call_state.due:
+ *     #TODO(xuanwn): Expand the scope of nogil
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_call_unref(call_state.c_call)
+ *     call_state.c_call = NULL
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L6;
+          }
+          __pyx_L6:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":362
+ *     with nogil:
+ *       grpc_call_unref(call_state.c_call)
+ *     call_state.c_call = NULL             # <<<<<<<<<<<<<<
+ *     call_state.maybe_delete_call_tracer()
+ *     state.segregated_call_states.remove(call_state)
+ */
+    __pyx_v_call_state->c_call = NULL;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":363
+ *       grpc_call_unref(call_state.c_call)
+ *     call_state.c_call = NULL
+ *     call_state.maybe_delete_call_tracer()             # <<<<<<<<<<<<<<
+ *     state.segregated_call_states.remove(call_state)
+ *     _destroy_c_completion_queue(c_completion_queue)
+ */
+    ((struct __pyx_vtabstruct_7_cython_6cygrpc__CallState *)__pyx_v_call_state->__pyx_vtab)->maybe_delete_call_tracer(__pyx_v_call_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 363, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":364
+ *     call_state.c_call = NULL
+ *     call_state.maybe_delete_call_tracer()
+ *     state.segregated_call_states.remove(call_state)             # <<<<<<<<<<<<<<
+ *     _destroy_c_completion_queue(c_completion_queue)
+ *     return True
+ */
+    if (unlikely(__pyx_v_state->segregated_call_states == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "remove");
+      __PYX_ERR(12, 364, __pyx_L1_error)
+    }
+    __pyx_t_1 = __Pyx_PySet_Remove(__pyx_v_state->segregated_call_states, ((PyObject *)__pyx_v_call_state)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(12, 364, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":365
+ *     call_state.maybe_delete_call_tracer()
+ *     state.segregated_call_states.remove(call_state)
+ *     _destroy_c_completion_queue(c_completion_queue)             # <<<<<<<<<<<<<<
+ *     return True
+ *   else:
+ */
+    __pyx_t_4 = __pyx_f_7_cython_6cygrpc__destroy_c_completion_queue(__pyx_v_c_completion_queue); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 365, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":366
+ *     state.segregated_call_states.remove(call_state)
+ *     _destroy_c_completion_queue(c_completion_queue)
+ *     return True             # <<<<<<<<<<<<<<
+ *   else:
+ *     return False
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(Py_True);
+    __pyx_r = Py_True;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":358
+ *     grpc_completion_queue *c_completion_queue, _BatchOperationTag tag):
+ *   call_state.due.remove(tag)
+ *   if not call_state.due:             # <<<<<<<<<<<<<<
+ *     #TODO(xuanwn): Expand the scope of nogil
+ *     with nogil:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":368
+ *     return True
+ *   else:
+ *     return False             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(Py_False);
+    __pyx_r = Py_False;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":354
+ * 
+ * 
+ * cdef object _process_segregated_call_tag(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, _CallState call_state,
+ *     grpc_completion_queue *c_completion_queue, _BatchOperationTag tag):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._process_segregated_call_tag", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":373
+ * cdef class SegregatedCall:
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, _CallState call_state):             # <<<<<<<<<<<<<<
+ *     self._channel_state = channel_state
+ *     self._call_state = call_state
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_14SegregatedCall_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_14SegregatedCall_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state = 0;
+  struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_channel_state,&__pyx_n_s_call_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 373, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 373, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(12, 373, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(12, 373, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_channel_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)values[0]);
+    __pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)values[1]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 373, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_channel_state), __pyx_ptype_7_cython_6cygrpc__ChannelState, 1, "channel_state", 0))) __PYX_ERR(12, 373, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_state), __pyx_ptype_7_cython_6cygrpc__CallState, 1, "call_state", 0))) __PYX_ERR(12, 373, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14SegregatedCall___cinit__(((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)__pyx_v_self), __pyx_v_channel_state, __pyx_v_call_state);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_14SegregatedCall___cinit__(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_channel_state, struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":374
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, _CallState call_state):
+ *     self._channel_state = channel_state             # <<<<<<<<<<<<<<
+ *     self._call_state = call_state
+ * 
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_channel_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_channel_state);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_channel_state);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_channel_state);
+  __pyx_v_self->_channel_state = __pyx_v_channel_state;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":375
+ *   def __cinit__(self, _ChannelState channel_state, _CallState call_state):
+ *     self._channel_state = channel_state
+ *     self._call_state = call_state             # <<<<<<<<<<<<<<
+ * 
+ *   def operate(self, operations, tag):
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_call_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_call_state);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_call_state);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_call_state);
+  __pyx_v_self->_call_state = __pyx_v_call_state;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":373
+ * cdef class SegregatedCall:
+ * 
+ *   def __cinit__(self, _ChannelState channel_state, _CallState call_state):             # <<<<<<<<<<<<<<
+ *     self._channel_state = channel_state
+ *     self._call_state = call_state
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":377
+ *     self._call_state = call_state
+ * 
+ *   def operate(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return _operate_from_segregated_call(
+ *         self._channel_state, self._call_state, operations, tag)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_3operate(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14SegregatedCall_3operate = {"operate", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_3operate, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_3operate(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_operations = 0;
+  PyObject *__pyx_v_tag = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("operate (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_operations,&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operations)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 377, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 377, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("operate", 1, 2, 2, 1); __PYX_ERR(12, 377, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "operate") < 0)) __PYX_ERR(12, 377, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_operations = values[0];
+    __pyx_v_tag = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("operate", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 377, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.operate", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14SegregatedCall_2operate(((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)__pyx_v_self), __pyx_v_operations, __pyx_v_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_2operate(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self, PyObject *__pyx_v_operations, PyObject *__pyx_v_tag) {
+  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("operate", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":378
+ * 
+ *   def operate(self, operations, tag):
+ *     return _operate_from_segregated_call(             # <<<<<<<<<<<<<<
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":379
+ *   def operate(self, operations, tag):
+ *     return _operate_from_segregated_call(
+ *         self._channel_state, self._call_state, operations, tag)             # <<<<<<<<<<<<<<
+ * 
+ *   def cancel(self, code, details):
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->_channel_state);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->_call_state);
+  __Pyx_INCREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":378
+ * 
+ *   def operate(self, operations, tag):
+ *     return _operate_from_segregated_call(             # <<<<<<<<<<<<<<
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc__operate_from_segregated_call(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_2), __pyx_v_operations, __pyx_v_tag); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 378, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":377
+ *     self._call_state = call_state
+ * 
+ *   def operate(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return _operate_from_segregated_call(
+ *         self._channel_state, self._call_state, operations, tag)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.operate", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":381
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ *   def cancel(self, code, details):             # <<<<<<<<<<<<<<
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_5cancel(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14SegregatedCall_5cancel = {"cancel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_5cancel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_5cancel(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_code = 0;
+  PyObject *__pyx_v_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancel (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,&__pyx_n_s_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 381, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 381, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("cancel", 1, 2, 2, 1); __PYX_ERR(12, 381, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cancel") < 0)) __PYX_ERR(12, 381, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_code = values[0];
+    __pyx_v_details = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("cancel", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 381, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14SegregatedCall_4cancel(((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)__pyx_v_self), __pyx_v_code, __pyx_v_details);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_4cancel(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  grpc_status_code __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("cancel", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":382
+ * 
+ *   def cancel(self, code, details):
+ *     _cancel(self._channel_state, self._call_state, code, details)             # <<<<<<<<<<<<<<
+ * 
+ *   def next_event(self):
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->_channel_state);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->_call_state);
+  __Pyx_INCREF(__pyx_t_2);
+  __pyx_t_3 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_v_code)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 382, __pyx_L1_error)
+  if (!(likely(PyString_CheckExact(__pyx_v_details))||((__pyx_v_details) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_v_details))) __PYX_ERR(12, 382, __pyx_L1_error)
+  __pyx_t_4 = __pyx_f_7_cython_6cygrpc__cancel(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_2), __pyx_t_3, ((PyObject*)__pyx_v_details)); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 382, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":381
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ *   def cancel(self, code, details):             # <<<<<<<<<<<<<<
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ */
+
+  /* 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_4);
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":384
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ *   def next_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       _process_segregated_call_tag(
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_7next_event(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14SegregatedCall_7next_event = {"next_event", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_7next_event, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_7next_event(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("next_event (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("next_event", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "next_event", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14SegregatedCall_6next_event(((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":385
+ * 
+ *   def next_event(self):
+ *     def on_success(tag):             # <<<<<<<<<<<<<<
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_10next_event_1on_success(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14SegregatedCall_10next_event_1on_success = {"on_success", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_10next_event_1on_success, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_10next_event_1on_success(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_tag = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("on_success (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 385, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "on_success") < 0)) __PYX_ERR(12, 385, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_tag = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("on_success", 1, 1, 1, __pyx_nargs); __PYX_ERR(12, 385, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.next_event.on_success", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14SegregatedCall_10next_event_on_success(__pyx_self, __pyx_v_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_10next_event_on_success(PyObject *__pyx_self, PyObject *__pyx_v_tag) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *__pyx_outer_scope;
+  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("on_success", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":387
+ *     def on_success(tag):
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)             # <<<<<<<<<<<<<<
+ *     def on_failure():
+ *       self._call_state.due.clear()
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 387, __pyx_L1_error) }
+  __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_v_self->_channel_state);
+  __Pyx_INCREF(__pyx_t_1);
+  if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 387, __pyx_L1_error) }
+  __pyx_t_2 = ((PyObject *)__pyx_cur_scope->__pyx_v_self->_call_state);
+  __Pyx_INCREF(__pyx_t_2);
+  if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 387, __pyx_L1_error) }
+  if (!(likely(((__pyx_v_tag) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_tag, __pyx_ptype_7_cython_6cygrpc__BatchOperationTag))))) __PYX_ERR(12, 387, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":386
+ *   def next_event(self):
+ *     def on_success(tag):
+ *       _process_segregated_call_tag(             # <<<<<<<<<<<<<<
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ *     def on_failure():
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc__process_segregated_call_tag(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_2), __pyx_cur_scope->__pyx_v_self->_c_completion_queue, ((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_tag)); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 386, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":385
+ * 
+ *   def next_event(self):
+ *     def on_success(tag):             # <<<<<<<<<<<<<<
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ */
+
+  /* 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("_cython.cygrpc.SegregatedCall.next_event.on_success", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":388
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ *     def on_failure():             # <<<<<<<<<<<<<<
+ *       self._call_state.due.clear()
+ *       with nogil:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_10next_event_3on_failure(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14SegregatedCall_10next_event_3on_failure = {"on_failure", (PyCFunction)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_10next_event_3on_failure, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_10next_event_3on_failure(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("on_failure (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14SegregatedCall_10next_event_2on_failure(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_10next_event_2on_failure(PyObject *__pyx_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *__pyx_outer_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("on_failure", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":389
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ *     def on_failure():
+ *       self._call_state.due.clear()             # <<<<<<<<<<<<<<
+ *       with nogil:
+ *         grpc_call_unref(self._call_state.c_call)
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 389, __pyx_L1_error) }
+  if (unlikely(__pyx_cur_scope->__pyx_v_self->_call_state->due == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "clear");
+    __PYX_ERR(12, 389, __pyx_L1_error)
+  }
+  __pyx_t_1 = PySet_Clear(__pyx_cur_scope->__pyx_v_self->_call_state->due); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(12, 389, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":390
+ *     def on_failure():
+ *       self._call_state.due.clear()
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         grpc_call_unref(self._call_state.c_call)
+ *       self._call_state.c_call = NULL
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":391
+ *       self._call_state.due.clear()
+ *       with nogil:
+ *         grpc_call_unref(self._call_state.c_call)             # <<<<<<<<<<<<<<
+ *       self._call_state.c_call = NULL
+ *       self._channel_state.segregated_call_states.remove(self._call_state)
+ */
+        if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 391, __pyx_L4_error) }
+        grpc_call_unref(__pyx_cur_scope->__pyx_v_self->_call_state->c_call);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":390
+ *     def on_failure():
+ *       self._call_state.due.clear()
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         grpc_call_unref(self._call_state.c_call)
+ *       self._call_state.c_call = NULL
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L4_error: {
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L1_error;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":392
+ *       with nogil:
+ *         grpc_call_unref(self._call_state.c_call)
+ *       self._call_state.c_call = NULL             # <<<<<<<<<<<<<<
+ *       self._channel_state.segregated_call_states.remove(self._call_state)
+ *       _destroy_c_completion_queue(self._c_completion_queue)
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 392, __pyx_L1_error) }
+  __pyx_cur_scope->__pyx_v_self->_call_state->c_call = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":393
+ *         grpc_call_unref(self._call_state.c_call)
+ *       self._call_state.c_call = NULL
+ *       self._channel_state.segregated_call_states.remove(self._call_state)             # <<<<<<<<<<<<<<
+ *       _destroy_c_completion_queue(self._c_completion_queue)
+ *     return _next_call_event(
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 393, __pyx_L1_error) }
+  if (unlikely(__pyx_cur_scope->__pyx_v_self->_channel_state->segregated_call_states == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "remove");
+    __PYX_ERR(12, 393, __pyx_L1_error)
+  }
+  if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 393, __pyx_L1_error) }
+  __pyx_t_2 = ((PyObject *)__pyx_cur_scope->__pyx_v_self->_call_state);
+  __Pyx_INCREF(__pyx_t_2);
+  __pyx_t_1 = __Pyx_PySet_Remove(__pyx_cur_scope->__pyx_v_self->_channel_state->segregated_call_states, __pyx_t_2); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(12, 393, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":394
+ *       self._call_state.c_call = NULL
+ *       self._channel_state.segregated_call_states.remove(self._call_state)
+ *       _destroy_c_completion_queue(self._c_completion_queue)             # <<<<<<<<<<<<<<
+ *     return _next_call_event(
+ *         self._channel_state, self._c_completion_queue, on_success, on_failure, None)
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 394, __pyx_L1_error) }
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__destroy_c_completion_queue(__pyx_cur_scope->__pyx_v_self->_c_completion_queue); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 394, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":388
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ *     def on_failure():             # <<<<<<<<<<<<<<
+ *       self._call_state.due.clear()
+ *       with nogil:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.next_event.on_failure", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":384
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ *   def next_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       _process_segregated_call_tag(
+ */
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_6next_event(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *__pyx_cur_scope;
+  PyObject *__pyx_v_on_success = 0;
+  PyObject *__pyx_v_on_failure = 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("next_event", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_1_next_event(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(12, 384, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":385
+ * 
+ *   def next_event(self):
+ *     def on_success(tag):             # <<<<<<<<<<<<<<
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14SegregatedCall_10next_event_1on_success, 0, __pyx_n_s_next_event_locals_on_success, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__15)); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 385, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_on_success = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":388
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ *     def on_failure():             # <<<<<<<<<<<<<<
+ *       self._call_state.due.clear()
+ *       with nogil:
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14SegregatedCall_10next_event_3on_failure, 0, __pyx_n_s_next_event_locals_on_failure, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__16)); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 388, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_on_failure = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":395
+ *       self._channel_state.segregated_call_states.remove(self._call_state)
+ *       _destroy_c_completion_queue(self._c_completion_queue)
+ *     return _next_call_event(             # <<<<<<<<<<<<<<
+ *         self._channel_state, self._c_completion_queue, on_success, on_failure, None)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":396
+ *       _destroy_c_completion_queue(self._c_completion_queue)
+ *     return _next_call_event(
+ *         self._channel_state, self._c_completion_queue, on_success, on_failure, None)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_v_self->_channel_state);
+  __Pyx_INCREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":395
+ *       self._channel_state.segregated_call_states.remove(self._call_state)
+ *       _destroy_c_completion_queue(self._c_completion_queue)
+ *     return _next_call_event(             # <<<<<<<<<<<<<<
+ *         self._channel_state, self._c_completion_queue, on_success, on_failure, None)
+ * 
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__next_call_event(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), __pyx_cur_scope->__pyx_v_self->_c_completion_queue, __pyx_v_on_success, __pyx_v_on_failure, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 395, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":384
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ *   def next_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       _process_segregated_call_tag(
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.next_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_on_success);
+  __Pyx_XDECREF(__pyx_v_on_failure);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_9__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14SegregatedCall_9__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_9__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_9__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14SegregatedCall_8__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_8__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_11__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_14SegregatedCall_11__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_11__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_14SegregatedCall_11__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14SegregatedCall_10__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14SegregatedCall_10__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SegregatedCall.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":407
+ *   cdef grpc_completion_queue *c_completion_queue
+ * 
+ *   def on_success(started_tags):             # <<<<<<<<<<<<<<
+ *     state.segregated_call_states.add(call_state)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_segregated_call_1on_success(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_segregated_call_1on_success = {"on_success", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_segregated_call_1on_success, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_segregated_call_1on_success(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v_started_tags = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("on_success (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_started_tags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_started_tags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 407, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "on_success") < 0)) __PYX_ERR(12, 407, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_started_tags = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("on_success", 1, 1, 1, __pyx_nargs); __PYX_ERR(12, 407, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._segregated_call.on_success", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_segregated_call_on_success(__pyx_self, __pyx_v_started_tags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_segregated_call_on_success(PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_started_tags) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *__pyx_outer_scope;
+  PyObject *__pyx_r = NULL;
+  __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("on_success", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":408
+ * 
+ *   def on_success(started_tags):
+ *     state.segregated_call_states.add(call_state)             # <<<<<<<<<<<<<<
+ * 
+ *   with state.condition:
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_state)) { __Pyx_RaiseClosureNameError("state"); __PYX_ERR(12, 408, __pyx_L1_error) }
+  if (unlikely(__pyx_cur_scope->__pyx_v_state->segregated_call_states == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "add");
+    __PYX_ERR(12, 408, __pyx_L1_error)
+  }
+  if (unlikely(!__pyx_cur_scope->__pyx_v_call_state)) { __Pyx_RaiseClosureNameError("call_state"); __PYX_ERR(12, 408, __pyx_L1_error) }
+  __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_v_call_state);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = PySet_Add(__pyx_cur_scope->__pyx_v_state->segregated_call_states, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(12, 408, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":407
+ *   cdef grpc_completion_queue *c_completion_queue
+ * 
+ *   def on_success(started_tags):             # <<<<<<<<<<<<<<
+ *     state.segregated_call_states.add(call_state)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._segregated_call.on_success", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":399
+ * 
+ * 
+ * cdef SegregatedCall _segregated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, int flags, method, host, object deadline,
+ *     object metadata, CallCredentials credentials, operationses_and_user_tags,
+ */
+
+static struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_f_7_cython_6cygrpc__segregated_call(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state, int __pyx_v_flags, PyObject *__pyx_v_method, PyObject *__pyx_v_host, PyObject *__pyx_v_deadline, PyObject *__pyx_v_metadata, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials, PyObject *__pyx_v_operationses_and_user_tags, PyObject *__pyx_v_context, PyObject *__pyx_v_registered_call_handle) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__pyx_v_segregated_call = 0;
+  grpc_completion_queue *__pyx_v_c_completion_queue;
+  PyObject *__pyx_v_on_success = 0;
+  struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *__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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_segregated_call", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(12, 399, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_state = __pyx_v_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_state);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":403
+ *     object metadata, CallCredentials credentials, operationses_and_user_tags,
+ *     object context, object registered_call_handle):
+ *   cdef _CallState call_state = _CallState()             # <<<<<<<<<<<<<<
+ *   cdef SegregatedCall segregated_call
+ *   cdef grpc_completion_queue *c_completion_queue
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__CallState)); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 403, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":407
+ *   cdef grpc_completion_queue *c_completion_queue
+ * 
+ *   def on_success(started_tags):             # <<<<<<<<<<<<<<
+ *     state.segregated_call_states.add(call_state)
+ * 
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_segregated_call_1on_success, 0, __pyx_n_s_segregated_call_locals_on_succe, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__18)); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_on_success = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":410
+ *     state.segregated_call_states.add(call_state)
+ * 
+ *   with state.condition:             # <<<<<<<<<<<<<<
+ *     if state.open:
+ *       c_completion_queue = (grpc_completion_queue_create_for_next(NULL))
+ */
+  /*with:*/ {
+    __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_cur_scope->__pyx_v_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 410, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_cur_scope->__pyx_v_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 410, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 410, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":411
+ * 
+ *   with state.condition:
+ *     if state.open:             # <<<<<<<<<<<<<<
+ *       c_completion_queue = (grpc_completion_queue_create_for_next(NULL))
+ *     else:
+ */
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_state->open); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(12, 411, __pyx_L7_error)
+          if (likely(__pyx_t_9)) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":412
+ *   with state.condition:
+ *     if state.open:
+ *       c_completion_queue = (grpc_completion_queue_create_for_next(NULL))             # <<<<<<<<<<<<<<
+ *     else:
+ *       raise ValueError('Cannot invoke RPC on closed channel!')
+ */
+            __pyx_v_c_completion_queue = grpc_completion_queue_create_for_next(NULL);
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":411
+ * 
+ *   with state.condition:
+ *     if state.open:             # <<<<<<<<<<<<<<
+ *       c_completion_queue = (grpc_completion_queue_create_for_next(NULL))
+ *     else:
+ */
+            goto __pyx_L13;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":414
+ *       c_completion_queue = (grpc_completion_queue_create_for_next(NULL))
+ *     else:
+ *       raise ValueError('Cannot invoke RPC on closed channel!')             # <<<<<<<<<<<<<<
+ * 
+ *   try:
+ */
+          /*else*/ {
+            __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 414, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __PYX_ERR(12, 414, __pyx_L7_error)
+          }
+          __pyx_L13:;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":410
+ *     state.segregated_call_states.add(call_state)
+ * 
+ *   with state.condition:             # <<<<<<<<<<<<<<
+ *     if state.open:
+ *       c_completion_queue = (grpc_completion_queue_create_for_next(NULL))
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._segregated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(12, 410, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_1);
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_10 = PyTuple_Pack(3, __pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(12, 410, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_10, NULL);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(12, 410, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(12, 410, __pyx_L9_except_error)
+          __pyx_t_12 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_1, __pyx_t_3, __pyx_t_4);
+            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(12, 410, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_2) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 410, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L17;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L1_error;
+    __pyx_L17:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":416
+ *       raise ValueError('Cannot invoke RPC on closed channel!')
+ * 
+ *   try:             # <<<<<<<<<<<<<<
+ *     _call(
+ *         state, call_state, c_completion_queue, on_success, flags, method, host,
+ */
+  {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_8, &__pyx_t_7);
+    __Pyx_XGOTREF(__pyx_t_2);
+    __Pyx_XGOTREF(__pyx_t_8);
+    __Pyx_XGOTREF(__pyx_t_7);
+    /*try:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":418
+ *   try:
+ *     _call(
+ *         state, call_state, c_completion_queue, on_success, flags, method, host,             # <<<<<<<<<<<<<<
+ *         deadline, credentials, operationses_and_user_tags, metadata,
+ *         context, registered_call_handle)
+ */
+      __pyx_t_4 = ((PyObject *)__pyx_cur_scope->__pyx_v_state);
+      __Pyx_INCREF(__pyx_t_4);
+      __pyx_t_3 = ((PyObject *)__pyx_cur_scope->__pyx_v_call_state);
+      __Pyx_INCREF(__pyx_t_3);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":417
+ * 
+ *   try:
+ *     _call(             # <<<<<<<<<<<<<<
+ *         state, call_state, c_completion_queue, on_success, flags, method, host,
+ *         deadline, credentials, operationses_and_user_tags, metadata,
+ */
+      __pyx_f_7_cython_6cygrpc__call(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_4), ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_3), __pyx_v_c_completion_queue, __pyx_v_on_success, __pyx_v_flags, __pyx_v_method, __pyx_v_host, __pyx_v_deadline, __pyx_v_credentials, __pyx_v_operationses_and_user_tags, __pyx_v_metadata, __pyx_v_context, __pyx_v_registered_call_handle); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 417, __pyx_L18_error)
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":416
+ *       raise ValueError('Cannot invoke RPC on closed channel!')
+ * 
+ *   try:             # <<<<<<<<<<<<<<
+ *     _call(
+ *         state, call_state, c_completion_queue, on_success, flags, method, host,
+ */
+    }
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    goto __pyx_L23_try_end;
+    __pyx_L18_error:;
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":421
+ *         deadline, credentials, operationses_and_user_tags, metadata,
+ *         context, registered_call_handle)
+ *   except:             # <<<<<<<<<<<<<<
+ *     _destroy_c_completion_queue(c_completion_queue)
+ *     raise
+ */
+    /*except:*/ {
+      __Pyx_AddTraceback("_cython.cygrpc._segregated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_4, &__pyx_t_1) < 0) __PYX_ERR(12, 421, __pyx_L20_except_error)
+      __Pyx_XGOTREF(__pyx_t_3);
+      __Pyx_XGOTREF(__pyx_t_4);
+      __Pyx_XGOTREF(__pyx_t_1);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":422
+ *         context, registered_call_handle)
+ *   except:
+ *     _destroy_c_completion_queue(c_completion_queue)             # <<<<<<<<<<<<<<
+ *     raise
+ * 
+ */
+      __pyx_t_10 = __pyx_f_7_cython_6cygrpc__destroy_c_completion_queue(__pyx_v_c_completion_queue); if (unlikely(!__pyx_t_10)) __PYX_ERR(12, 422, __pyx_L20_except_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":423
+ *   except:
+ *     _destroy_c_completion_queue(c_completion_queue)
+ *     raise             # <<<<<<<<<<<<<<
+ * 
+ *   segregated_call = SegregatedCall(state, call_state)
+ */
+      __Pyx_GIVEREF(__pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_4);
+      __Pyx_XGIVEREF(__pyx_t_1);
+      __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_4, __pyx_t_1);
+      __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
+      __PYX_ERR(12, 423, __pyx_L20_except_error)
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":416
+ *       raise ValueError('Cannot invoke RPC on closed channel!')
+ * 
+ *   try:             # <<<<<<<<<<<<<<
+ *     _call(
+ *         state, call_state, c_completion_queue, on_success, flags, method, host,
+ */
+    __pyx_L20_except_error:;
+    __Pyx_XGIVEREF(__pyx_t_2);
+    __Pyx_XGIVEREF(__pyx_t_8);
+    __Pyx_XGIVEREF(__pyx_t_7);
+    __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_8, __pyx_t_7);
+    goto __pyx_L1_error;
+    __pyx_L23_try_end:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":425
+ *     raise
+ * 
+ *   segregated_call = SegregatedCall(state, call_state)             # <<<<<<<<<<<<<<
+ *   segregated_call._c_completion_queue = c_completion_queue
+ *   return segregated_call
+ */
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 425, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_state))) __PYX_ERR(12, 425, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_call_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_call_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_cur_scope->__pyx_v_call_state))) __PYX_ERR(12, 425, __pyx_L1_error);
+  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SegregatedCall), __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 425, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_segregated_call = ((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)__pyx_t_4);
+  __pyx_t_4 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":426
+ * 
+ *   segregated_call = SegregatedCall(state, call_state)
+ *   segregated_call._c_completion_queue = c_completion_queue             # <<<<<<<<<<<<<<
+ *   return segregated_call
+ * 
+ */
+  __pyx_v_segregated_call->_c_completion_queue = __pyx_v_c_completion_queue;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":427
+ *   segregated_call = SegregatedCall(state, call_state)
+ *   segregated_call._c_completion_queue = c_completion_queue
+ *   return segregated_call             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF((PyObject *)__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_segregated_call);
+  __pyx_r = __pyx_v_segregated_call;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":399
+ * 
+ * 
+ * cdef SegregatedCall _segregated_call(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, int flags, method, host, object deadline,
+ *     object metadata, CallCredentials credentials, operationses_and_user_tags,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_AddTraceback("_cython.cygrpc._segregated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_segregated_call);
+  __Pyx_XDECREF(__pyx_v_on_success);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":430
+ * 
+ * 
+ * cdef object _watch_connectivity_state(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, grpc_connectivity_state last_observed_state,
+ *     object deadline):
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__watch_connectivity_state(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state, grpc_connectivity_state __pyx_v_last_observed_state, PyObject *__pyx_v_deadline) {
+  struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_tag = 0;
+  PyObject *__pyx_v_completed_tag = NULL;
+  PyObject *__pyx_v_event = 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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  gpr_timespec __pyx_t_10;
+  int __pyx_t_11;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_t_14;
+  PyObject *(*__pyx_t_15)(PyObject *);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_watch_connectivity_state", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":433
+ *     _ChannelState state, grpc_connectivity_state last_observed_state,
+ *     object deadline):
+ *   cdef _ConnectivityTag tag = _ConnectivityTag(object())             # <<<<<<<<<<<<<<
+ *   with state.condition:
+ *     if state.open:
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_builtin_object); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 433, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ConnectivityTag), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 433, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_tag = ((struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":434
+ *     object deadline):
+ *   cdef _ConnectivityTag tag = _ConnectivityTag(object())
+ *   with state.condition:             # <<<<<<<<<<<<<<
+ *     if state.open:
+ *       cpython.Py_INCREF(tag)
+ */
+  /*with:*/ {
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 434, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 434, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_1))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_1, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 434, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":435
+ *   cdef _ConnectivityTag tag = _ConnectivityTag(object())
+ *   with state.condition:
+ *     if state.open:             # <<<<<<<<<<<<<<
+ *       cpython.Py_INCREF(tag)
+ *       grpc_channel_watch_connectivity_state(
+ */
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_state->open); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(12, 435, __pyx_L7_error)
+          if (likely(__pyx_t_9)) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":436
+ *   with state.condition:
+ *     if state.open:
+ *       cpython.Py_INCREF(tag)             # <<<<<<<<<<<<<<
+ *       grpc_channel_watch_connectivity_state(
+ *           state.c_channel, last_observed_state, _timespec_from_time(deadline),
+ */
+            Py_INCREF(((PyObject *)__pyx_v_tag));
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":438
+ *       cpython.Py_INCREF(tag)
+ *       grpc_channel_watch_connectivity_state(
+ *           state.c_channel, last_observed_state, _timespec_from_time(deadline),             # <<<<<<<<<<<<<<
+ *           state.c_connectivity_completion_queue, <cpython.PyObject *>tag)
+ *       state.connectivity_due.add(tag)
+ */
+            __pyx_t_10 = __pyx_f_7_cython_6cygrpc__timespec_from_time(__pyx_v_deadline); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 438, __pyx_L7_error)
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":437
+ *     if state.open:
+ *       cpython.Py_INCREF(tag)
+ *       grpc_channel_watch_connectivity_state(             # <<<<<<<<<<<<<<
+ *           state.c_channel, last_observed_state, _timespec_from_time(deadline),
+ *           state.c_connectivity_completion_queue, <cpython.PyObject *>tag)
+ */
+            grpc_channel_watch_connectivity_state(__pyx_v_state->c_channel, __pyx_v_last_observed_state, __pyx_t_10, __pyx_v_state->c_connectivity_completion_queue, ((PyObject *)__pyx_v_tag));
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":440
+ *           state.c_channel, last_observed_state, _timespec_from_time(deadline),
+ *           state.c_connectivity_completion_queue, <cpython.PyObject *>tag)
+ *       state.connectivity_due.add(tag)             # <<<<<<<<<<<<<<
+ *     else:
+ *       raise ValueError('Cannot monitor channel state: %s' % state.closed_reason)
+ */
+            if (unlikely(__pyx_v_state->connectivity_due == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "add");
+              __PYX_ERR(12, 440, __pyx_L7_error)
+            }
+            __pyx_t_11 = PySet_Add(__pyx_v_state->connectivity_due, ((PyObject *)__pyx_v_tag)); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(12, 440, __pyx_L7_error)
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":435
+ *   cdef _ConnectivityTag tag = _ConnectivityTag(object())
+ *   with state.condition:
+ *     if state.open:             # <<<<<<<<<<<<<<
+ *       cpython.Py_INCREF(tag)
+ *       grpc_channel_watch_connectivity_state(
+ */
+            goto __pyx_L13;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":442
+ *       state.connectivity_due.add(tag)
+ *     else:
+ *       raise ValueError('Cannot monitor channel state: %s' % state.closed_reason)             # <<<<<<<<<<<<<<
+ *   completed_tag, event = _latent_event(
+ *       state.c_connectivity_completion_queue, None)
+ */
+          /*else*/ {
+            __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Cannot_monitor_channel_state_s, __pyx_v_state->closed_reason); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 442, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 442, __pyx_L7_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_ERR(12, 442, __pyx_L7_error)
+          }
+          __pyx_L13:;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":434
+ *     object deadline):
+ *   cdef _ConnectivityTag tag = _ConnectivityTag(object())
+ *   with state.condition:             # <<<<<<<<<<<<<<
+ *     if state.open:
+ *       cpython.Py_INCREF(tag)
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._watch_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_4) < 0) __PYX_ERR(12, 434, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_1);
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_12 = PyTuple_Pack(3, __pyx_t_1, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_12)) __PYX_ERR(12, 434, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_12);
+          __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_12, NULL);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          if (unlikely(!__pyx_t_13)) __PYX_ERR(12, 434, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(12, 434, __pyx_L9_except_error)
+          __pyx_t_14 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_14)) {
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_1, __pyx_t_2, __pyx_t_4);
+            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(12, 434, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_3) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 434, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L17;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    goto __pyx_L1_error;
+    __pyx_L17:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":443
+ *     else:
+ *       raise ValueError('Cannot monitor channel state: %s' % state.closed_reason)
+ *   completed_tag, event = _latent_event(             # <<<<<<<<<<<<<<
+ *       state.c_connectivity_completion_queue, None)
+ *   with state.condition:
+ */
+  __pyx_t_4 = __pyx_f_7_cython_6cygrpc__latent_event(__pyx_v_state->c_connectivity_completion_queue, Py_None); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 443, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
+    PyObject* sequence = __pyx_t_4;
+    Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+    if (unlikely(size != 2)) {
+      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+      __PYX_ERR(12, 443, __pyx_L1_error)
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    if (likely(PyTuple_CheckExact(sequence))) {
+      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
+      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
+    } else {
+      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
+      __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
+    }
+    __Pyx_INCREF(__pyx_t_2);
+    __Pyx_INCREF(__pyx_t_1);
+    #else
+    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 443, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 443, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    #endif
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  } else {
+    Py_ssize_t index = -1;
+    __pyx_t_12 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_12)) __PYX_ERR(12, 443, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_15 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_12);
+    index = 0; __pyx_t_2 = __pyx_t_15(__pyx_t_12); if (unlikely(!__pyx_t_2)) goto __pyx_L18_unpacking_failed;
+    __Pyx_GOTREF(__pyx_t_2);
+    index = 1; __pyx_t_1 = __pyx_t_15(__pyx_t_12); if (unlikely(!__pyx_t_1)) goto __pyx_L18_unpacking_failed;
+    __Pyx_GOTREF(__pyx_t_1);
+    if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_12), 2) < 0) __PYX_ERR(12, 443, __pyx_L1_error)
+    __pyx_t_15 = NULL;
+    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+    goto __pyx_L19_unpacking_done;
+    __pyx_L18_unpacking_failed:;
+    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+    __pyx_t_15 = NULL;
+    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+    __PYX_ERR(12, 443, __pyx_L1_error)
+    __pyx_L19_unpacking_done:;
+  }
+  __pyx_v_completed_tag = __pyx_t_2;
+  __pyx_t_2 = 0;
+  __pyx_v_event = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":445
+ *   completed_tag, event = _latent_event(
+ *       state.c_connectivity_completion_queue, None)
+ *   with state.condition:             # <<<<<<<<<<<<<<
+ *     state.connectivity_due.remove(completed_tag)
+ *     state.condition.notify_all()
+ */
+  /*with:*/ {
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 445, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 445, __pyx_L20_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_1))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_1, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 445, __pyx_L20_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_7, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_6);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":446
+ *       state.c_connectivity_completion_queue, None)
+ *   with state.condition:
+ *     state.connectivity_due.remove(completed_tag)             # <<<<<<<<<<<<<<
+ *     state.condition.notify_all()
+ *   return event
+ */
+          if (unlikely(__pyx_v_state->connectivity_due == Py_None)) {
+            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "remove");
+            __PYX_ERR(12, 446, __pyx_L24_error)
+          }
+          __pyx_t_11 = __Pyx_PySet_Remove(__pyx_v_state->connectivity_due, __pyx_v_completed_tag); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(12, 446, __pyx_L24_error)
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":447
+ *   with state.condition:
+ *     state.connectivity_due.remove(completed_tag)
+ *     state.condition.notify_all()             # <<<<<<<<<<<<<<
+ *   return event
+ * 
+ */
+          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_state->condition, __pyx_n_s_notify_all); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 447, __pyx_L24_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = NULL;
+          __pyx_t_5 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (likely(PyMethod_Check(__pyx_t_1))) {
+            __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+            if (likely(__pyx_t_2)) {
+              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+              __Pyx_INCREF(__pyx_t_2);
+              __Pyx_INCREF(function);
+              __Pyx_DECREF_SET(__pyx_t_1, function);
+              __pyx_t_5 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+            __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+            __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+            if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 447, __pyx_L24_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":445
+ *   completed_tag, event = _latent_event(
+ *       state.c_connectivity_completion_queue, None)
+ *   with state.condition:             # <<<<<<<<<<<<<<
+ *     state.connectivity_due.remove(completed_tag)
+ *     state.condition.notify_all()
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        goto __pyx_L29_try_end;
+        __pyx_L24_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._watch_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_1, &__pyx_t_2) < 0) __PYX_ERR(12, 445, __pyx_L26_except_error)
+          __Pyx_XGOTREF(__pyx_t_4);
+          __Pyx_XGOTREF(__pyx_t_1);
+          __Pyx_XGOTREF(__pyx_t_2);
+          __pyx_t_12 = PyTuple_Pack(3, __pyx_t_4, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_12)) __PYX_ERR(12, 445, __pyx_L26_except_error)
+          __Pyx_GOTREF(__pyx_t_12);
+          __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_12, NULL);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          if (unlikely(!__pyx_t_13)) __PYX_ERR(12, 445, __pyx_L26_except_error)
+          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+          if (__pyx_t_14 < 0) __PYX_ERR(12, 445, __pyx_L26_except_error)
+          __pyx_t_9 = (!__pyx_t_14);
+          if (unlikely(__pyx_t_9)) {
+            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_XGIVEREF(__pyx_t_2);
+            __Pyx_ErrRestoreWithState(__pyx_t_4, __pyx_t_1, __pyx_t_2);
+            __pyx_t_4 = 0; __pyx_t_1 = 0; __pyx_t_2 = 0; 
+            __PYX_ERR(12, 445, __pyx_L26_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          goto __pyx_L25_exception_handled;
+        }
+        __pyx_L26_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_7, __pyx_t_6);
+        goto __pyx_L1_error;
+        __pyx_L25_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_7, __pyx_t_6);
+        __pyx_L29_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_3) {
+          __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          if (unlikely(!__pyx_t_6)) __PYX_ERR(12, 445, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_6);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        }
+        goto __pyx_L23;
+      }
+      __pyx_L23:;
+    }
+    goto __pyx_L33;
+    __pyx_L20_error:;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    goto __pyx_L1_error;
+    __pyx_L33:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":448
+ *     state.connectivity_due.remove(completed_tag)
+ *     state.condition.notify_all()
+ *   return event             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_event);
+  __pyx_r = __pyx_v_event;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":430
+ * 
+ * 
+ * cdef object _watch_connectivity_state(             # <<<<<<<<<<<<<<
+ *     _ChannelState state, grpc_connectivity_state last_observed_state,
+ *     object deadline):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_AddTraceback("_cython.cygrpc._watch_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_tag);
+  __Pyx_XDECREF(__pyx_v_completed_tag);
+  __Pyx_XDECREF(__pyx_v_event);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":451
+ * 
+ * 
+ * cdef _close(Channel channel, grpc_status_code code, object details,             # <<<<<<<<<<<<<<
+ *     drain_calls):
+ *   cdef _ChannelState state = channel._state
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__close(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_channel, grpc_status_code __pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_drain_calls) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state = 0;
+  struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state = 0;
+  PyObject *__pyx_v_encoded_details = NULL;
+  PyObject *__pyx_v_event = 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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  Py_ssize_t __pyx_t_10;
+  Py_ssize_t __pyx_t_11;
+  int __pyx_t_12;
+  int __pyx_t_13;
+  char const *__pyx_t_14;
+  int __pyx_t_15;
+  PyObject *__pyx_t_16 = NULL;
+  PyObject *__pyx_t_17 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_close", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":453
+ * cdef _close(Channel channel, grpc_status_code code, object details,
+ *     drain_calls):
+ *   cdef _ChannelState state = channel._state             # <<<<<<<<<<<<<<
+ *   cdef _CallState call_state
+ *   encoded_details = _encode(details)
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_channel->_state);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_v_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":455
+ *   cdef _ChannelState state = channel._state
+ *   cdef _CallState call_state
+ *   encoded_details = _encode(details)             # <<<<<<<<<<<<<<
+ *   with state.condition:
+ *     if state.open:
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__encode(__pyx_v_details); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 455, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_encoded_details = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":456
+ *   cdef _CallState call_state
+ *   encoded_details = _encode(details)
+ *   with state.condition:             # <<<<<<<<<<<<<<
+ *     if state.open:
+ *       state.open = False
+ */
+  /*with:*/ {
+    __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_v_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 456, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 456, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 456, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":457
+ *   encoded_details = _encode(details)
+ *   with state.condition:
+ *     if state.open:             # <<<<<<<<<<<<<<
+ *       state.open = False
+ *       state.closed_reason = details
+ */
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_state->open); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(12, 457, __pyx_L7_error)
+          if (__pyx_t_9) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":458
+ *   with state.condition:
+ *     if state.open:
+ *       state.open = False             # <<<<<<<<<<<<<<
+ *       state.closed_reason = details
+ *       for call_state in set(state.integrated_call_states.values()):
+ */
+            __Pyx_INCREF(Py_False);
+            __Pyx_GIVEREF(Py_False);
+            __Pyx_GOTREF(__pyx_v_state->open);
+            __Pyx_DECREF(__pyx_v_state->open);
+            __pyx_v_state->open = Py_False;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":459
+ *     if state.open:
+ *       state.open = False
+ *       state.closed_reason = details             # <<<<<<<<<<<<<<
+ *       for call_state in set(state.integrated_call_states.values()):
+ *         grpc_call_cancel_with_status(
+ */
+            __Pyx_INCREF(__pyx_v_details);
+            __Pyx_GIVEREF(__pyx_v_details);
+            __Pyx_GOTREF(__pyx_v_state->closed_reason);
+            __Pyx_DECREF(__pyx_v_state->closed_reason);
+            __pyx_v_state->closed_reason = __pyx_v_details;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":460
+ *       state.open = False
+ *       state.closed_reason = details
+ *       for call_state in set(state.integrated_call_states.values()):             # <<<<<<<<<<<<<<
+ *         grpc_call_cancel_with_status(
+ *             call_state.c_call, code, encoded_details, NULL)
+ */
+            __pyx_t_10 = 0;
+            if (unlikely(__pyx_v_state->integrated_call_states == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values");
+              __PYX_ERR(12, 460, __pyx_L7_error)
+            }
+            __pyx_t_3 = __Pyx_PyDict_Values(__pyx_v_state->integrated_call_states); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 460, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_4 = PySet_New(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 460, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_3 = __Pyx_set_iterator(__pyx_t_4, 1, (&__pyx_t_11), (&__pyx_t_12)); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 460, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_XDECREF(__pyx_t_1);
+            __pyx_t_1 = __pyx_t_3;
+            __pyx_t_3 = 0;
+            while (1) {
+              __pyx_t_13 = __Pyx_set_iter_next(__pyx_t_1, __pyx_t_11, &__pyx_t_10, &__pyx_t_3, __pyx_t_12);
+              if (unlikely(__pyx_t_13 == 0)) break;
+              if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(12, 460, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_7_cython_6cygrpc__CallState))))) __PYX_ERR(12, 460, __pyx_L7_error)
+              __Pyx_XDECREF_SET(__pyx_v_call_state, ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_3));
+              __pyx_t_3 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":462
+ *       for call_state in set(state.integrated_call_states.values()):
+ *         grpc_call_cancel_with_status(
+ *             call_state.c_call, code, encoded_details, NULL)             # <<<<<<<<<<<<<<
+ *       for call_state in state.segregated_call_states:
+ *         grpc_call_cancel_with_status(
+ */
+              if (unlikely(__pyx_v_encoded_details == Py_None)) {
+                PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+                __PYX_ERR(12, 462, __pyx_L7_error)
+              }
+              __pyx_t_14 = __Pyx_PyBytes_AsString(__pyx_v_encoded_details); if (unlikely((!__pyx_t_14) && PyErr_Occurred())) __PYX_ERR(12, 462, __pyx_L7_error)
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":461
+ *       state.closed_reason = details
+ *       for call_state in set(state.integrated_call_states.values()):
+ *         grpc_call_cancel_with_status(             # <<<<<<<<<<<<<<
+ *             call_state.c_call, code, encoded_details, NULL)
+ *       for call_state in state.segregated_call_states:
+ */
+              (void)(grpc_call_cancel_with_status(__pyx_v_call_state->c_call, __pyx_v_code, __pyx_t_14, NULL));
+            }
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":463
+ *         grpc_call_cancel_with_status(
+ *             call_state.c_call, code, encoded_details, NULL)
+ *       for call_state in state.segregated_call_states:             # <<<<<<<<<<<<<<
+ *         grpc_call_cancel_with_status(
+ *             call_state.c_call, code, encoded_details, NULL)
+ */
+            __pyx_t_11 = 0;
+            __pyx_t_3 = __Pyx_set_iterator(__pyx_v_state->segregated_call_states, 1, (&__pyx_t_10), (&__pyx_t_12)); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 463, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_XDECREF(__pyx_t_1);
+            __pyx_t_1 = __pyx_t_3;
+            __pyx_t_3 = 0;
+            while (1) {
+              __pyx_t_13 = __Pyx_set_iter_next(__pyx_t_1, __pyx_t_10, &__pyx_t_11, &__pyx_t_3, __pyx_t_12);
+              if (unlikely(__pyx_t_13 == 0)) break;
+              if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(12, 463, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_7_cython_6cygrpc__CallState))))) __PYX_ERR(12, 463, __pyx_L7_error)
+              __Pyx_XDECREF_SET(__pyx_v_call_state, ((struct __pyx_obj_7_cython_6cygrpc__CallState *)__pyx_t_3));
+              __pyx_t_3 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":465
+ *       for call_state in state.segregated_call_states:
+ *         grpc_call_cancel_with_status(
+ *             call_state.c_call, code, encoded_details, NULL)             # <<<<<<<<<<<<<<
+ *       # TODO(https://github.com/grpc/grpc/issues/3064): Cancel connectivity
+ *       # watching.
+ */
+              if (unlikely(__pyx_v_encoded_details == Py_None)) {
+                PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+                __PYX_ERR(12, 465, __pyx_L7_error)
+              }
+              __pyx_t_14 = __Pyx_PyBytes_AsString(__pyx_v_encoded_details); if (unlikely((!__pyx_t_14) && PyErr_Occurred())) __PYX_ERR(12, 465, __pyx_L7_error)
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":464
+ *             call_state.c_call, code, encoded_details, NULL)
+ *       for call_state in state.segregated_call_states:
+ *         grpc_call_cancel_with_status(             # <<<<<<<<<<<<<<
+ *             call_state.c_call, code, encoded_details, NULL)
+ *       # TODO(https://github.com/grpc/grpc/issues/3064): Cancel connectivity
+ */
+              (void)(grpc_call_cancel_with_status(__pyx_v_call_state->c_call, __pyx_v_code, __pyx_t_14, NULL));
+            }
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":469
+ *       # watching.
+ * 
+ *       if drain_calls:             # <<<<<<<<<<<<<<
+ *         while not _calls_drained(state):
+ *           event = channel.next_call_event()
+ */
+            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_drain_calls); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(12, 469, __pyx_L7_error)
+            if (__pyx_t_9) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":470
+ * 
+ *       if drain_calls:
+ *         while not _calls_drained(state):             # <<<<<<<<<<<<<<
+ *           event = channel.next_call_event()
+ *           if event.completion_type == CompletionType.queue_timeout:
+ */
+              while (1) {
+                __pyx_t_1 = __pyx_f_7_cython_6cygrpc__calls_drained(__pyx_v_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 470, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_1);
+                __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(12, 470, __pyx_L7_error)
+                __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+                __pyx_t_15 = (!__pyx_t_9);
+                if (!__pyx_t_15) break;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":471
+ *       if drain_calls:
+ *         while not _calls_drained(state):
+ *           event = channel.next_call_event()             # <<<<<<<<<<<<<<
+ *           if event.completion_type == CompletionType.queue_timeout:
+ *               continue
+ */
+                __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_channel), __pyx_n_s_next_call_event); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 471, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_4 = NULL;
+                __pyx_t_5 = 0;
+                #if CYTHON_UNPACK_METHODS
+                if (likely(PyMethod_Check(__pyx_t_3))) {
+                  __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+                  if (likely(__pyx_t_4)) {
+                    PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+                    __Pyx_INCREF(__pyx_t_4);
+                    __Pyx_INCREF(function);
+                    __Pyx_DECREF_SET(__pyx_t_3, function);
+                    __pyx_t_5 = 1;
+                  }
+                }
+                #endif
+                {
+                  PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+                  __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+                  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                  if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 471, __pyx_L7_error)
+                  __Pyx_GOTREF(__pyx_t_1);
+                  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                }
+                __Pyx_XDECREF_SET(__pyx_v_event, __pyx_t_1);
+                __pyx_t_1 = 0;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":472
+ *         while not _calls_drained(state):
+ *           event = channel.next_call_event()
+ *           if event.completion_type == CompletionType.queue_timeout:             # <<<<<<<<<<<<<<
+ *               continue
+ *           event.tag(event)
+ */
+                __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event, __pyx_n_s_completion_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 472, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_CompletionType); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 472, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_queue_timeout); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 472, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 472, __pyx_L7_error)
+                __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+                __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+                __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_15 < 0))) __PYX_ERR(12, 472, __pyx_L7_error)
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                if (__pyx_t_15) {
+
+                  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":473
+ *           event = channel.next_call_event()
+ *           if event.completion_type == CompletionType.queue_timeout:
+ *               continue             # <<<<<<<<<<<<<<
+ *           event.tag(event)
+ *       else:
+ */
+                  goto __pyx_L19_continue;
+
+                  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":472
+ *         while not _calls_drained(state):
+ *           event = channel.next_call_event()
+ *           if event.completion_type == CompletionType.queue_timeout:             # <<<<<<<<<<<<<<
+ *               continue
+ *           event.tag(event)
+ */
+                }
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":474
+ *           if event.completion_type == CompletionType.queue_timeout:
+ *               continue
+ *           event.tag(event)             # <<<<<<<<<<<<<<
+ *       else:
+ *         while state.integrated_call_states:
+ */
+                __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_event, __pyx_n_s_tag); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 474, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __pyx_t_1 = NULL;
+                __pyx_t_5 = 0;
+                #if CYTHON_UNPACK_METHODS
+                if (likely(PyMethod_Check(__pyx_t_4))) {
+                  __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+                  if (likely(__pyx_t_1)) {
+                    PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+                    __Pyx_INCREF(__pyx_t_1);
+                    __Pyx_INCREF(function);
+                    __Pyx_DECREF_SET(__pyx_t_4, function);
+                    __pyx_t_5 = 1;
+                  }
+                }
+                #endif
+                {
+                  PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_v_event};
+                  __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+                  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+                  if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 474, __pyx_L7_error)
+                  __Pyx_GOTREF(__pyx_t_3);
+                  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+                }
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __pyx_L19_continue:;
+              }
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":469
+ *       # watching.
+ * 
+ *       if drain_calls:             # <<<<<<<<<<<<<<
+ *         while not _calls_drained(state):
+ *           event = channel.next_call_event()
+ */
+              goto __pyx_L18;
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":476
+ *           event.tag(event)
+ *       else:
+ *         while state.integrated_call_states:             # <<<<<<<<<<<<<<
+ *           state.condition.wait()
+ *         while state.connectivity_due:
+ */
+            /*else*/ {
+              while (1) {
+                __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_v_state->integrated_call_states); if (unlikely((__pyx_t_15 < 0))) __PYX_ERR(12, 476, __pyx_L7_error)
+                if (!__pyx_t_15) break;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":477
+ *       else:
+ *         while state.integrated_call_states:
+ *           state.condition.wait()             # <<<<<<<<<<<<<<
+ *         while state.connectivity_due:
+ *           state.condition.wait()
+ */
+                __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_state->condition, __pyx_n_s_wait); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 477, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __pyx_t_1 = NULL;
+                __pyx_t_5 = 0;
+                #if CYTHON_UNPACK_METHODS
+                if (likely(PyMethod_Check(__pyx_t_4))) {
+                  __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+                  if (likely(__pyx_t_1)) {
+                    PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+                    __Pyx_INCREF(__pyx_t_1);
+                    __Pyx_INCREF(function);
+                    __Pyx_DECREF_SET(__pyx_t_4, function);
+                    __pyx_t_5 = 1;
+                  }
+                }
+                #endif
+                {
+                  PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+                  __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+                  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+                  if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 477, __pyx_L7_error)
+                  __Pyx_GOTREF(__pyx_t_3);
+                  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+                }
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              }
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":478
+ *         while state.integrated_call_states:
+ *           state.condition.wait()
+ *         while state.connectivity_due:             # <<<<<<<<<<<<<<
+ *           state.condition.wait()
+ * 
+ */
+              while (1) {
+                __pyx_t_15 = (__pyx_v_state->connectivity_due != Py_None)&&(PySet_GET_SIZE(__pyx_v_state->connectivity_due) != 0);
+                if (!__pyx_t_15) break;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":479
+ *           state.condition.wait()
+ *         while state.connectivity_due:
+ *           state.condition.wait()             # <<<<<<<<<<<<<<
+ * 
+ *       _destroy_c_completion_queue(state.c_call_completion_queue)
+ */
+                __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_state->condition, __pyx_n_s_wait); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 479, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __pyx_t_1 = NULL;
+                __pyx_t_5 = 0;
+                #if CYTHON_UNPACK_METHODS
+                if (likely(PyMethod_Check(__pyx_t_4))) {
+                  __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+                  if (likely(__pyx_t_1)) {
+                    PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+                    __Pyx_INCREF(__pyx_t_1);
+                    __Pyx_INCREF(function);
+                    __Pyx_DECREF_SET(__pyx_t_4, function);
+                    __pyx_t_5 = 1;
+                  }
+                }
+                #endif
+                {
+                  PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+                  __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+                  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+                  if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 479, __pyx_L7_error)
+                  __Pyx_GOTREF(__pyx_t_3);
+                  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+                }
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              }
+            }
+            __pyx_L18:;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":481
+ *           state.condition.wait()
+ * 
+ *       _destroy_c_completion_queue(state.c_call_completion_queue)             # <<<<<<<<<<<<<<
+ *       _destroy_c_completion_queue(state.c_connectivity_completion_queue)
+ *       grpc_channel_destroy(state.c_channel)
+ */
+            __pyx_t_3 = __pyx_f_7_cython_6cygrpc__destroy_c_completion_queue(__pyx_v_state->c_call_completion_queue); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 481, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":482
+ * 
+ *       _destroy_c_completion_queue(state.c_call_completion_queue)
+ *       _destroy_c_completion_queue(state.c_connectivity_completion_queue)             # <<<<<<<<<<<<<<
+ *       grpc_channel_destroy(state.c_channel)
+ *       state.c_channel = NULL
+ */
+            __pyx_t_3 = __pyx_f_7_cython_6cygrpc__destroy_c_completion_queue(__pyx_v_state->c_connectivity_completion_queue); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 482, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":483
+ *       _destroy_c_completion_queue(state.c_call_completion_queue)
+ *       _destroy_c_completion_queue(state.c_connectivity_completion_queue)
+ *       grpc_channel_destroy(state.c_channel)             # <<<<<<<<<<<<<<
+ *       state.c_channel = NULL
+ *       grpc_shutdown()
+ */
+            grpc_channel_destroy(__pyx_v_state->c_channel);
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":484
+ *       _destroy_c_completion_queue(state.c_connectivity_completion_queue)
+ *       grpc_channel_destroy(state.c_channel)
+ *       state.c_channel = NULL             # <<<<<<<<<<<<<<
+ *       grpc_shutdown()
+ *       state.condition.notify_all()
+ */
+            __pyx_v_state->c_channel = NULL;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":485
+ *       grpc_channel_destroy(state.c_channel)
+ *       state.c_channel = NULL
+ *       grpc_shutdown()             # <<<<<<<<<<<<<<
+ *       state.condition.notify_all()
+ *     else:
+ */
+            grpc_shutdown();
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":486
+ *       state.c_channel = NULL
+ *       grpc_shutdown()
+ *       state.condition.notify_all()             # <<<<<<<<<<<<<<
+ *     else:
+ *       # Another call to close already completed in the past or is currently
+ */
+            __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_state->condition, __pyx_n_s_notify_all); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 486, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_1 = NULL;
+            __pyx_t_5 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (likely(PyMethod_Check(__pyx_t_4))) {
+              __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+              if (likely(__pyx_t_1)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+                __Pyx_INCREF(__pyx_t_1);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_4, function);
+                __pyx_t_5 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+              __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+              __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+              if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 486, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":457
+ *   encoded_details = _encode(details)
+ *   with state.condition:
+ *     if state.open:             # <<<<<<<<<<<<<<
+ *       state.open = False
+ *       state.closed_reason = details
+ */
+            goto __pyx_L13;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":490
+ *       # Another call to close already completed in the past or is currently
+ *       # being executed in another thread.
+ *       while state.c_channel != NULL:             # <<<<<<<<<<<<<<
+ *         state.condition.wait()
+ * 
+ */
+          /*else*/ {
+            while (1) {
+              __pyx_t_15 = (__pyx_v_state->c_channel != NULL);
+              if (!__pyx_t_15) break;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":491
+ *       # being executed in another thread.
+ *       while state.c_channel != NULL:
+ *         state.condition.wait()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+              __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_state->condition, __pyx_n_s_wait); if (unlikely(!__pyx_t_4)) __PYX_ERR(12, 491, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_1 = NULL;
+              __pyx_t_5 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (likely(PyMethod_Check(__pyx_t_4))) {
+                __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+                if (likely(__pyx_t_1)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+                  __Pyx_INCREF(__pyx_t_1);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_4, function);
+                  __pyx_t_5 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+                __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+                __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+                if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 491, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_3);
+                __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            }
+          }
+          __pyx_L13:;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":456
+ *   cdef _CallState call_state
+ *   encoded_details = _encode(details)
+ *   with state.condition:             # <<<<<<<<<<<<<<
+ *     if state.open:
+ *       state.open = False
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_4, &__pyx_t_1) < 0) __PYX_ERR(12, 456, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __Pyx_XGOTREF(__pyx_t_1);
+          __pyx_t_16 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_16)) __PYX_ERR(12, 456, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_16);
+          __pyx_t_17 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_16, NULL);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+          if (unlikely(!__pyx_t_17)) __PYX_ERR(12, 456, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_17);
+          __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_17);
+          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+          if (__pyx_t_15 < 0) __PYX_ERR(12, 456, __pyx_L9_except_error)
+          __pyx_t_9 = (!__pyx_t_15);
+          if (unlikely(__pyx_t_9)) {
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_XGIVEREF(__pyx_t_1);
+            __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_4, __pyx_t_1);
+            __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
+            __PYX_ERR(12, 456, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_2) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 456, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L31;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L1_error;
+    __pyx_L31:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":451
+ * 
+ * 
+ * cdef _close(Channel channel, grpc_status_code code, object details,             # <<<<<<<<<<<<<<
+ *     drain_calls):
+ *   cdef _ChannelState state = channel._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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_16);
+  __Pyx_AddTraceback("_cython.cygrpc._close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_state);
+  __Pyx_XDECREF((PyObject *)__pyx_v_call_state);
+  __Pyx_XDECREF(__pyx_v_encoded_details);
+  __Pyx_XDECREF(__pyx_v_event);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":494
+ * 
+ * 
+ * cdef _calls_drained(_ChannelState state):             # <<<<<<<<<<<<<<
+ *   return not (state.integrated_call_states or state.segregated_call_states or
+ *               state.connectivity_due)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__calls_drained(struct __pyx_obj_7_cython_6cygrpc__ChannelState *__pyx_v_state) {
+  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("_calls_drained", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":495
+ * 
+ * cdef _calls_drained(_ChannelState state):
+ *   return not (state.integrated_call_states or state.segregated_call_states or             # <<<<<<<<<<<<<<
+ *               state.connectivity_due)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_state->integrated_call_states); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(12, 495, __pyx_L1_error)
+  if (!__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L3_bool_binop_done;
+  }
+  __pyx_t_2 = (__pyx_v_state->segregated_call_states != Py_None)&&(PySet_GET_SIZE(__pyx_v_state->segregated_call_states) != 0);
+  if (!__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L3_bool_binop_done;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":496
+ * cdef _calls_drained(_ChannelState state):
+ *   return not (state.integrated_call_states or state.segregated_call_states or
+ *               state.connectivity_due)             # <<<<<<<<<<<<<<
+ * 
+ * cdef class Channel:
+ */
+  __pyx_t_2 = (__pyx_v_state->connectivity_due != Py_None)&&(PySet_GET_SIZE(__pyx_v_state->connectivity_due) != 0);
+  __pyx_t_1 = __pyx_t_2;
+  __pyx_L3_bool_binop_done:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":495
+ * 
+ * cdef _calls_drained(_ChannelState state):
+ *   return not (state.integrated_call_states or state.segregated_call_states or             # <<<<<<<<<<<<<<
+ *               state.connectivity_due)
+ * 
+ */
+  __pyx_t_3 = __Pyx_PyBool_FromLong((!__pyx_t_1)); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 495, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":494
+ * 
+ * 
+ * cdef _calls_drained(_ChannelState state):             # <<<<<<<<<<<<<<
+ *   return not (state.integrated_call_states or state.segregated_call_states or
+ *               state.connectivity_due)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._calls_drained", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":500
+ * cdef class Channel:
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, bytes target, object arguments,
+ *       ChannelCredentials channel_credentials):
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_7Channel_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_7Channel_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_target = 0;
+  PyObject *__pyx_v_arguments = 0;
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_channel_credentials = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_target,&__pyx_n_s_arguments,&__pyx_n_s_channel_credentials,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_target)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 500, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arguments)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 500, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(12, 500, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 500, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(12, 500, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(12, 500, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+    }
+    __pyx_v_target = ((PyObject*)values[0]);
+    __pyx_v_arguments = values[1];
+    __pyx_v_channel_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)values[2]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(12, 500, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_target), (&PyBytes_Type), 1, "target", 1))) __PYX_ERR(12, 501, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_channel_credentials), __pyx_ptype_7_cython_6cygrpc_ChannelCredentials, 1, "channel_credentials", 0))) __PYX_ERR(12, 502, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel___cinit__(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v_target, __pyx_v_arguments, __pyx_v_channel_credentials);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_7Channel___cinit__(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, PyObject *__pyx_v_target, PyObject *__pyx_v_arguments, struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_channel_credentials) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_channel_args = 0;
+  grpc_channel_credentials *__pyx_v_c_channel_credentials;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  grpc_channel_credentials *__pyx_t_6;
+  grpc_channel_credentials *__pyx_t_7;
+  char *__pyx_t_8;
+  grpc_channel_args *__pyx_t_9;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_INCREF(__pyx_v_arguments);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":503
+ *       self, bytes target, object arguments,
+ *       ChannelCredentials channel_credentials):
+ *     arguments = () if arguments is None else tuple(arguments)             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self._state = _ChannelState(target)
+ */
+  __pyx_t_2 = (__pyx_v_arguments == Py_None);
+  if (__pyx_t_2) {
+    __Pyx_INCREF(__pyx_empty_tuple);
+    __pyx_t_1 = __pyx_empty_tuple;
+  } else {
+    __pyx_t_3 = __Pyx_PySequence_Tuple(__pyx_v_arguments); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 503, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __pyx_t_3;
+    __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF_SET(__pyx_v_arguments, __pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":504
+ *       ChannelCredentials channel_credentials):
+ *     arguments = () if arguments is None else tuple(arguments)
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     self._state = _ChannelState(target)
+ *     self._state.c_call_completion_queue = (
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 504, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 504, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":505
+ *     arguments = () if arguments is None else tuple(arguments)
+ *     fork_handlers_and_grpc_init()
+ *     self._state = _ChannelState(target)             # <<<<<<<<<<<<<<
+ *     self._state.c_call_completion_queue = (
+ *         grpc_completion_queue_create_for_next(NULL))
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ChannelState), __pyx_v_target); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 505, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_state);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_state);
+  __pyx_v_self->_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":506
+ *     fork_handlers_and_grpc_init()
+ *     self._state = _ChannelState(target)
+ *     self._state.c_call_completion_queue = (             # <<<<<<<<<<<<<<
+ *         grpc_completion_queue_create_for_next(NULL))
+ *     self._state.c_connectivity_completion_queue = (
+ */
+  __pyx_v_self->_state->c_call_completion_queue = grpc_completion_queue_create_for_next(NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":508
+ *     self._state.c_call_completion_queue = (
+ *         grpc_completion_queue_create_for_next(NULL))
+ *     self._state.c_connectivity_completion_queue = (             # <<<<<<<<<<<<<<
+ *         grpc_completion_queue_create_for_next(NULL))
+ *     self._arguments = arguments
+ */
+  __pyx_v_self->_state->c_connectivity_completion_queue = grpc_completion_queue_create_for_next(NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":510
+ *     self._state.c_connectivity_completion_queue = (
+ *         grpc_completion_queue_create_for_next(NULL))
+ *     self._arguments = arguments             # <<<<<<<<<<<<<<
+ *     cdef _ChannelArgs channel_args = _ChannelArgs(arguments)
+ *     c_channel_credentials = (
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_v_arguments))||((__pyx_v_arguments) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_arguments))) __PYX_ERR(12, 510, __pyx_L1_error)
+  __pyx_t_1 = __pyx_v_arguments;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_arguments);
+  __Pyx_DECREF(__pyx_v_self->_arguments);
+  __pyx_v_self->_arguments = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":511
+ *         grpc_completion_queue_create_for_next(NULL))
+ *     self._arguments = arguments
+ *     cdef _ChannelArgs channel_args = _ChannelArgs(arguments)             # <<<<<<<<<<<<<<
+ *     c_channel_credentials = (
+ *         channel_credentials.c() if channel_credentials is not None
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ChannelArgs), __pyx_v_arguments); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 511, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_channel_args = ((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":513
+ *     cdef _ChannelArgs channel_args = _ChannelArgs(arguments)
+ *     c_channel_credentials = (
+ *         channel_credentials.c() if channel_credentials is not None             # <<<<<<<<<<<<<<
+ *         else grpc_insecure_credentials_create())
+ *     self._state.c_channel = grpc_channel_create(
+ */
+  __pyx_t_2 = (((PyObject *)__pyx_v_channel_credentials) != Py_None);
+  if (__pyx_t_2) {
+    __pyx_t_7 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials *)__pyx_v_channel_credentials->__pyx_vtab)->c(__pyx_v_channel_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 513, __pyx_L1_error)
+    __pyx_t_6 = __pyx_t_7;
+  } else {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":514
+ *     c_channel_credentials = (
+ *         channel_credentials.c() if channel_credentials is not None
+ *         else grpc_insecure_credentials_create())             # <<<<<<<<<<<<<<
+ *     self._state.c_channel = grpc_channel_create(
+ *         <char *>target, c_channel_credentials, channel_args.c_args())
+ */
+    __pyx_t_6 = grpc_insecure_credentials_create();
+  }
+  __pyx_v_c_channel_credentials = __pyx_t_6;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":516
+ *         else grpc_insecure_credentials_create())
+ *     self._state.c_channel = grpc_channel_create(
+ *         <char *>target, c_channel_credentials, channel_args.c_args())             # <<<<<<<<<<<<<<
+ *     self._registered_call_handles = {}
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ */
+  if (unlikely(__pyx_v_target == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+    __PYX_ERR(12, 516, __pyx_L1_error)
+  }
+  __pyx_t_8 = __Pyx_PyBytes_AsWritableString(__pyx_v_target); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) __PYX_ERR(12, 516, __pyx_L1_error)
+  __pyx_t_9 = ((struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs *)__pyx_v_channel_args->__pyx_vtab)->c_args(__pyx_v_channel_args); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 516, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":515
+ *         channel_credentials.c() if channel_credentials is not None
+ *         else grpc_insecure_credentials_create())
+ *     self._state.c_channel = grpc_channel_create(             # <<<<<<<<<<<<<<
+ *         <char *>target, c_channel_credentials, channel_args.c_args())
+ *     self._registered_call_handles = {}
+ */
+  __pyx_v_self->_state->c_channel = grpc_channel_create(((char *)__pyx_t_8), __pyx_v_c_channel_credentials, __pyx_t_9);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":517
+ *     self._state.c_channel = grpc_channel_create(
+ *         <char *>target, c_channel_credentials, channel_args.c_args())
+ *     self._registered_call_handles = {}             # <<<<<<<<<<<<<<
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 517, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_registered_call_handles);
+  __Pyx_DECREF(__pyx_v_self->_registered_call_handles);
+  __pyx_v_self->_registered_call_handles = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":518
+ *         <char *>target, c_channel_credentials, channel_args.c_args())
+ *     self._registered_call_handles = {}
+ *     grpc_channel_credentials_release(c_channel_credentials)             # <<<<<<<<<<<<<<
+ * 
+ *   def target(self):
+ */
+  grpc_channel_credentials_release(__pyx_v_c_channel_credentials);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":500
+ * cdef class Channel:
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, bytes target, object arguments,
+ *       ChannelCredentials channel_credentials):
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_channel_args);
+  __Pyx_XDECREF(__pyx_v_arguments);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":520
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ * 
+ *   def target(self):             # <<<<<<<<<<<<<<
+ *     cdef char *c_target
+ *     with self._state.condition:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_3target(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_3target = {"target", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_3target, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_3target(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("target (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("target", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "target", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_2target(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_2target(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self) {
+  char *__pyx_v_c_target;
+  PyObject *__pyx_v_target = 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;
+  unsigned int __pyx_t_5;
+  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;
+  int __pyx_t_11;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("target", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":522
+ *   def target(self):
+ *     cdef char *c_target
+ *     with self._state.condition:             # <<<<<<<<<<<<<<
+ *       c_target = grpc_channel_get_target(self._state.c_channel)
+ *       target = <bytes>c_target
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_self->_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 522, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_self->_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 522, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 522, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":523
+ *     cdef char *c_target
+ *     with self._state.condition:
+ *       c_target = grpc_channel_get_target(self._state.c_channel)             # <<<<<<<<<<<<<<
+ *       target = <bytes>c_target
+ *       gpr_free(c_target)
+ */
+          __pyx_v_c_target = grpc_channel_get_target(__pyx_v_self->_state->c_channel);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":524
+ *     with self._state.condition:
+ *       c_target = grpc_channel_get_target(self._state.c_channel)
+ *       target = <bytes>c_target             # <<<<<<<<<<<<<<
+ *       gpr_free(c_target)
+ *       return target
+ */
+          __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_c_target); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 524, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_3 = __pyx_t_2;
+          __Pyx_INCREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_v_target = ((PyObject*)__pyx_t_3);
+          __pyx_t_3 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":525
+ *       c_target = grpc_channel_get_target(self._state.c_channel)
+ *       target = <bytes>c_target
+ *       gpr_free(c_target)             # <<<<<<<<<<<<<<
+ *       return target
+ * 
+ */
+          gpr_free(__pyx_v_c_target);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":526
+ *       target = <bytes>c_target
+ *       gpr_free(c_target)
+ *       return target             # <<<<<<<<<<<<<<
+ * 
+ *   def integrated_call(
+ */
+          __Pyx_XDECREF(__pyx_r);
+          __Pyx_INCREF(__pyx_v_target);
+          __pyx_r = __pyx_v_target;
+          goto __pyx_L11_try_return;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":522
+ *   def target(self):
+ *     cdef char *c_target
+ *     with self._state.condition:             # <<<<<<<<<<<<<<
+ *       c_target = grpc_channel_get_target(self._state.c_channel)
+ *       target = <bytes>c_target
+ */
+        }
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc.Channel.target", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_4) < 0) __PYX_ERR(12, 522, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_9 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(12, 522, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_9, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          if (unlikely(!__pyx_t_10)) __PYX_ERR(12, 522, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10);
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (__pyx_t_11 < 0) __PYX_ERR(12, 522, __pyx_L9_except_error)
+          __pyx_t_12 = (!__pyx_t_11);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_2, __pyx_t_4);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(12, 522, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L11_try_return:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L4_return;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 522, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L4_return: {
+        __pyx_t_8 = __pyx_r;
+        __pyx_r = 0;
+        if (__pyx_t_1) {
+          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_7)) __PYX_ERR(12, 522, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+        __pyx_r = __pyx_t_8;
+        __pyx_t_8 = 0;
+        goto __pyx_L0;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L16;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L16:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":520
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ * 
+ *   def target(self):             # <<<<<<<<<<<<<<
+ *     cdef char *c_target
+ *     with self._state.condition:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.target", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_target);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":528
+ *       return target
+ * 
+ *   def integrated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_5integrated_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_5integrated_call = {"integrated_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_5integrated_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_5integrated_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  int __pyx_v_flags;
+  PyObject *__pyx_v_method = 0;
+  PyObject *__pyx_v_host = 0;
+  PyObject *__pyx_v_deadline = 0;
+  PyObject *__pyx_v_metadata = 0;
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials = 0;
+  PyObject *__pyx_v_operationses_and_tags = 0;
+  PyObject *__pyx_v_context = 0;
+  PyObject *__pyx_v_registered_call_handle = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("integrated_call (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_flags,&__pyx_n_s_method,&__pyx_n_s_host,&__pyx_n_s_deadline,&__pyx_n_s_metadata,&__pyx_n_s_credentials,&__pyx_n_s_operationses_and_tags,&__pyx_n_s_context,&__pyx_n_s_registered_call_handle,0};
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":531
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ *       object context = None, object registered_call_handle = None):             # <<<<<<<<<<<<<<
+ *     return _integrated_call(
+ *         self._state, flags, method, host, deadline, metadata, credentials,
+ */
+    values[7] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    values[8] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  9: values[8] = __Pyx_Arg_FASTCALL(__pyx_args, 8);
+        CYTHON_FALLTHROUGH;
+        case  8: values[7] = __Pyx_Arg_FASTCALL(__pyx_args, 7);
+        CYTHON_FALLTHROUGH;
+        case  7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
+        CYTHON_FALLTHROUGH;
+        case  6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
+        CYTHON_FALLTHROUGH;
+        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("integrated_call", 0, 7, 9, 1); __PYX_ERR(12, 528, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_host)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("integrated_call", 0, 7, 9, 2); __PYX_ERR(12, 528, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_deadline)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("integrated_call", 0, 7, 9, 3); __PYX_ERR(12, 528, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("integrated_call", 0, 7, 9, 4); __PYX_ERR(12, 528, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  5:
+        if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[5]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("integrated_call", 0, 7, 9, 5); __PYX_ERR(12, 528, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  6:
+        if (likely((values[6] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operationses_and_tags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[6]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("integrated_call", 0, 7, 9, 6); __PYX_ERR(12, 528, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  7:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context);
+          if (value) { values[7] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  8:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_registered_call_handle);
+          if (value) { values[8] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 528, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "integrated_call") < 0)) __PYX_ERR(12, 528, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  9: values[8] = __Pyx_Arg_FASTCALL(__pyx_args, 8);
+        CYTHON_FALLTHROUGH;
+        case  8: values[7] = __Pyx_Arg_FASTCALL(__pyx_args, 7);
+        CYTHON_FALLTHROUGH;
+        case  7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
+        values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
+        values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_flags = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(12, 529, __pyx_L3_error)
+    __pyx_v_method = values[1];
+    __pyx_v_host = values[2];
+    __pyx_v_deadline = values[3];
+    __pyx_v_metadata = values[4];
+    __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)values[5]);
+    __pyx_v_operationses_and_tags = values[6];
+    __pyx_v_context = values[7];
+    __pyx_v_registered_call_handle = values[8];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("integrated_call", 0, 7, 9, __pyx_nargs); __PYX_ERR(12, 528, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.integrated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_credentials), __pyx_ptype_7_cython_6cygrpc_CallCredentials, 1, "credentials", 0))) __PYX_ERR(12, 530, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_4integrated_call(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v_flags, __pyx_v_method, __pyx_v_host, __pyx_v_deadline, __pyx_v_metadata, __pyx_v_credentials, __pyx_v_operationses_and_tags, __pyx_v_context, __pyx_v_registered_call_handle);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":528
+ *       return target
+ * 
+ *   def integrated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_4integrated_call(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, int __pyx_v_flags, PyObject *__pyx_v_method, PyObject *__pyx_v_host, PyObject *__pyx_v_deadline, PyObject *__pyx_v_metadata, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials, PyObject *__pyx_v_operationses_and_tags, PyObject *__pyx_v_context, PyObject *__pyx_v_registered_call_handle) {
+  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("integrated_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":532
+ *       CallCredentials credentials, operationses_and_tags,
+ *       object context = None, object registered_call_handle = None):
+ *     return _integrated_call(             # <<<<<<<<<<<<<<
+ *         self._state, flags, method, host, deadline, metadata, credentials,
+ *         operationses_and_tags, context, registered_call_handle)
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":533
+ *       object context = None, object registered_call_handle = None):
+ *     return _integrated_call(
+ *         self._state, flags, method, host, deadline, metadata, credentials,             # <<<<<<<<<<<<<<
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->_state);
+  __Pyx_INCREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":532
+ *       CallCredentials credentials, operationses_and_tags,
+ *       object context = None, object registered_call_handle = None):
+ *     return _integrated_call(             # <<<<<<<<<<<<<<
+ *         self._state, flags, method, host, deadline, metadata, credentials,
+ *         operationses_and_tags, context, registered_call_handle)
+ */
+  __pyx_t_2 = ((PyObject *)__pyx_f_7_cython_6cygrpc__integrated_call(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), __pyx_v_flags, __pyx_v_method, __pyx_v_host, __pyx_v_deadline, __pyx_v_metadata, __pyx_v_credentials, __pyx_v_operationses_and_tags, __pyx_v_context, __pyx_v_registered_call_handle)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 532, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":528
+ *       return target
+ * 
+ *   def integrated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.integrated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":536
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def next_call_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       if tag is not None:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_7next_call_event(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_7next_call_event = {"next_call_event", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_7next_call_event, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_7next_call_event(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("next_call_event (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("next_call_event", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "next_call_event", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_6next_call_event(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":537
+ * 
+ *   def next_call_event(self):
+ *     def on_success(tag):             # <<<<<<<<<<<<<<
+ *       if tag is not None:
+ *         _process_integrated_call_tag(self._state, tag)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_15next_call_event_1on_success(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_15next_call_event_1on_success = {"on_success", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_15next_call_event_1on_success, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_15next_call_event_1on_success(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_tag = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("on_success (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 537, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "on_success") < 0)) __PYX_ERR(12, 537, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_tag = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("on_success", 1, 1, 1, __pyx_nargs); __PYX_ERR(12, 537, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.next_call_event.on_success", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_15next_call_event_on_success(__pyx_self, __pyx_v_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_15next_call_event_on_success(PyObject *__pyx_self, PyObject *__pyx_v_tag) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *__pyx_outer_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("on_success", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":538
+ *   def next_call_event(self):
+ *     def on_success(tag):
+ *       if tag is not None:             # <<<<<<<<<<<<<<
+ *         _process_integrated_call_tag(self._state, tag)
+ *     if is_fork_support_enabled():
+ */
+  __pyx_t_1 = (__pyx_v_tag != Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":539
+ *     def on_success(tag):
+ *       if tag is not None:
+ *         _process_integrated_call_tag(self._state, tag)             # <<<<<<<<<<<<<<
+ *     if is_fork_support_enabled():
+ *       queue_deadline = time.time() + 1.0
+ */
+    if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(12, 539, __pyx_L1_error) }
+    __pyx_t_2 = ((PyObject *)__pyx_cur_scope->__pyx_v_self->_state);
+    __Pyx_INCREF(__pyx_t_2);
+    if (!(likely(((__pyx_v_tag) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_tag, __pyx_ptype_7_cython_6cygrpc__BatchOperationTag))))) __PYX_ERR(12, 539, __pyx_L1_error)
+    __pyx_f_7_cython_6cygrpc__process_integrated_call_tag(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_2), ((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_tag)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 539, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":538
+ *   def next_call_event(self):
+ *     def on_success(tag):
+ *       if tag is not None:             # <<<<<<<<<<<<<<
+ *         _process_integrated_call_tag(self._state, tag)
+ *     if is_fork_support_enabled():
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":537
+ * 
+ *   def next_call_event(self):
+ *     def on_success(tag):             # <<<<<<<<<<<<<<
+ *       if tag is not None:
+ *         _process_integrated_call_tag(self._state, tag)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.next_call_event.on_success", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":536
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def next_call_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       if tag is not None:
+ */
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_6next_call_event(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *__pyx_cur_scope;
+  PyObject *__pyx_v_on_success = 0;
+  PyObject *__pyx_v_queue_deadline = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("next_call_event", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(12, 536, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":537
+ * 
+ *   def next_call_event(self):
+ *     def on_success(tag):             # <<<<<<<<<<<<<<
+ *       if tag is not None:
+ *         _process_integrated_call_tag(self._state, tag)
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_15next_call_event_1on_success, 0, __pyx_n_s_next_call_event_locals_on_succes, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__20)); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 537, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_on_success = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":540
+ *       if tag is not None:
+ *         _process_integrated_call_tag(self._state, tag)
+ *     if is_fork_support_enabled():             # <<<<<<<<<<<<<<
+ *       queue_deadline = time.time() + 1.0
+ *     else:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_is_fork_support_enabled); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 540, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 540, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(12, 540, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":541
+ *         _process_integrated_call_tag(self._state, tag)
+ *     if is_fork_support_enabled():
+ *       queue_deadline = time.time() + 1.0             # <<<<<<<<<<<<<<
+ *     else:
+ *       queue_deadline = None
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_time); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 541, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_time); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 541, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 541, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __pyx_t_3 = __Pyx_PyFloat_AddObjC(__pyx_t_1, __pyx_float_1_0, 1.0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 541, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_v_queue_deadline = __pyx_t_3;
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":540
+ *       if tag is not None:
+ *         _process_integrated_call_tag(self._state, tag)
+ *     if is_fork_support_enabled():             # <<<<<<<<<<<<<<
+ *       queue_deadline = time.time() + 1.0
+ *     else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":543
+ *       queue_deadline = time.time() + 1.0
+ *     else:
+ *       queue_deadline = None             # <<<<<<<<<<<<<<
+ *     # NOTE(gnossen): It is acceptable for on_failure to be None here because
+ *     # failure conditions can only ever happen on the main thread and this
+ */
+  /*else*/ {
+    __Pyx_INCREF(Py_None);
+    __pyx_v_queue_deadline = Py_None;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":547
+ *     # failure conditions can only ever happen on the main thread and this
+ *     # method is only ever invoked on the channel spin thread.
+ *     return _next_call_event(self._state, self._state.c_call_completion_queue,             # <<<<<<<<<<<<<<
+ *                             on_success, None, queue_deadline)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_3 = ((PyObject *)__pyx_cur_scope->__pyx_v_self->_state);
+  __Pyx_INCREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":548
+ *     # method is only ever invoked on the channel spin thread.
+ *     return _next_call_event(self._state, self._state.c_call_completion_queue,
+ *                             on_success, None, queue_deadline)             # <<<<<<<<<<<<<<
+ * 
+ *   def segregated_call(
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__next_call_event(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_3), __pyx_cur_scope->__pyx_v_self->_state->c_call_completion_queue, __pyx_v_on_success, Py_None, __pyx_v_queue_deadline); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 547, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":536
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def next_call_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       if tag is not None:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.next_call_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_on_success);
+  __Pyx_XDECREF(__pyx_v_queue_deadline);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":550
+ *                             on_success, None, queue_deadline)
+ * 
+ *   def segregated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_9segregated_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_9segregated_call = {"segregated_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_9segregated_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_9segregated_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  int __pyx_v_flags;
+  PyObject *__pyx_v_method = 0;
+  PyObject *__pyx_v_host = 0;
+  PyObject *__pyx_v_deadline = 0;
+  PyObject *__pyx_v_metadata = 0;
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials = 0;
+  PyObject *__pyx_v_operationses_and_tags = 0;
+  PyObject *__pyx_v_context = 0;
+  PyObject *__pyx_v_registered_call_handle = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("segregated_call (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_flags,&__pyx_n_s_method,&__pyx_n_s_host,&__pyx_n_s_deadline,&__pyx_n_s_metadata,&__pyx_n_s_credentials,&__pyx_n_s_operationses_and_tags,&__pyx_n_s_context,&__pyx_n_s_registered_call_handle,0};
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":553
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ *       object context = None, object registered_call_handle = None):             # <<<<<<<<<<<<<<
+ *     return _segregated_call(
+ *         self._state, flags, method, host, deadline, metadata, credentials,
+ */
+    values[7] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    values[8] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  9: values[8] = __Pyx_Arg_FASTCALL(__pyx_args, 8);
+        CYTHON_FALLTHROUGH;
+        case  8: values[7] = __Pyx_Arg_FASTCALL(__pyx_args, 7);
+        CYTHON_FALLTHROUGH;
+        case  7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
+        CYTHON_FALLTHROUGH;
+        case  6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
+        CYTHON_FALLTHROUGH;
+        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("segregated_call", 0, 7, 9, 1); __PYX_ERR(12, 550, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_host)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("segregated_call", 0, 7, 9, 2); __PYX_ERR(12, 550, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_deadline)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("segregated_call", 0, 7, 9, 3); __PYX_ERR(12, 550, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("segregated_call", 0, 7, 9, 4); __PYX_ERR(12, 550, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  5:
+        if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[5]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("segregated_call", 0, 7, 9, 5); __PYX_ERR(12, 550, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  6:
+        if (likely((values[6] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operationses_and_tags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[6]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("segregated_call", 0, 7, 9, 6); __PYX_ERR(12, 550, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  7:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context);
+          if (value) { values[7] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  8:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_registered_call_handle);
+          if (value) { values[8] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 550, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "segregated_call") < 0)) __PYX_ERR(12, 550, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  9: values[8] = __Pyx_Arg_FASTCALL(__pyx_args, 8);
+        CYTHON_FALLTHROUGH;
+        case  8: values[7] = __Pyx_Arg_FASTCALL(__pyx_args, 7);
+        CYTHON_FALLTHROUGH;
+        case  7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
+        values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
+        values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_flags = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(12, 551, __pyx_L3_error)
+    __pyx_v_method = values[1];
+    __pyx_v_host = values[2];
+    __pyx_v_deadline = values[3];
+    __pyx_v_metadata = values[4];
+    __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)values[5]);
+    __pyx_v_operationses_and_tags = values[6];
+    __pyx_v_context = values[7];
+    __pyx_v_registered_call_handle = values[8];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("segregated_call", 0, 7, 9, __pyx_nargs); __PYX_ERR(12, 550, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.segregated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_credentials), __pyx_ptype_7_cython_6cygrpc_CallCredentials, 1, "credentials", 0))) __PYX_ERR(12, 552, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_8segregated_call(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v_flags, __pyx_v_method, __pyx_v_host, __pyx_v_deadline, __pyx_v_metadata, __pyx_v_credentials, __pyx_v_operationses_and_tags, __pyx_v_context, __pyx_v_registered_call_handle);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":550
+ *                             on_success, None, queue_deadline)
+ * 
+ *   def segregated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_8segregated_call(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, int __pyx_v_flags, PyObject *__pyx_v_method, PyObject *__pyx_v_host, PyObject *__pyx_v_deadline, PyObject *__pyx_v_metadata, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials, PyObject *__pyx_v_operationses_and_tags, PyObject *__pyx_v_context, PyObject *__pyx_v_registered_call_handle) {
+  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("segregated_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":554
+ *       CallCredentials credentials, operationses_and_tags,
+ *       object context = None, object registered_call_handle = None):
+ *     return _segregated_call(             # <<<<<<<<<<<<<<
+ *         self._state, flags, method, host, deadline, metadata, credentials,
+ *         operationses_and_tags, context, registered_call_handle)
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":555
+ *       object context = None, object registered_call_handle = None):
+ *     return _segregated_call(
+ *         self._state, flags, method, host, deadline, metadata, credentials,             # <<<<<<<<<<<<<<
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->_state);
+  __Pyx_INCREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":554
+ *       CallCredentials credentials, operationses_and_tags,
+ *       object context = None, object registered_call_handle = None):
+ *     return _segregated_call(             # <<<<<<<<<<<<<<
+ *         self._state, flags, method, host, deadline, metadata, credentials,
+ *         operationses_and_tags, context, registered_call_handle)
+ */
+  __pyx_t_2 = ((PyObject *)__pyx_f_7_cython_6cygrpc__segregated_call(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), __pyx_v_flags, __pyx_v_method, __pyx_v_host, __pyx_v_deadline, __pyx_v_metadata, __pyx_v_credentials, __pyx_v_operationses_and_tags, __pyx_v_context, __pyx_v_registered_call_handle)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 554, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":550
+ *                             on_success, None, queue_deadline)
+ * 
+ *   def segregated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.segregated_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":558
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def check_connectivity_state(self, bint try_to_connect):             # <<<<<<<<<<<<<<
+ *     with self._state.condition:
+ *       if self._state.open:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_11check_connectivity_state(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_11check_connectivity_state = {"check_connectivity_state", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_11check_connectivity_state, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_11check_connectivity_state(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  int __pyx_v_try_to_connect;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("check_connectivity_state (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_try_to_connect,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_try_to_connect)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 558, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "check_connectivity_state") < 0)) __PYX_ERR(12, 558, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_try_to_connect = __Pyx_PyObject_IsTrue(values[0]); if (unlikely((__pyx_v_try_to_connect == (int)-1) && PyErr_Occurred())) __PYX_ERR(12, 558, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("check_connectivity_state", 1, 1, 1, __pyx_nargs); __PYX_ERR(12, 558, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.check_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_10check_connectivity_state(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v_try_to_connect);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_10check_connectivity_state(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, int __pyx_v_try_to_connect) {
+  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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("check_connectivity_state", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":559
+ * 
+ *   def check_connectivity_state(self, bint try_to_connect):
+ *     with self._state.condition:             # <<<<<<<<<<<<<<
+ *       if self._state.open:
+ *         return grpc_channel_check_connectivity_state(
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_self->_state->condition, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 559, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_self->_state->condition, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 559, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 559, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":560
+ *   def check_connectivity_state(self, bint try_to_connect):
+ *     with self._state.condition:
+ *       if self._state.open:             # <<<<<<<<<<<<<<
+ *         return grpc_channel_check_connectivity_state(
+ *             self._state.c_channel, try_to_connect)
+ */
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_self->_state->open); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(12, 560, __pyx_L7_error)
+          if (likely(__pyx_t_9)) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":561
+ *     with self._state.condition:
+ *       if self._state.open:
+ *         return grpc_channel_check_connectivity_state(             # <<<<<<<<<<<<<<
+ *             self._state.c_channel, try_to_connect)
+ *       else:
+ */
+            __Pyx_XDECREF(__pyx_r);
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":562
+ *       if self._state.open:
+ *         return grpc_channel_check_connectivity_state(
+ *             self._state.c_channel, try_to_connect)             # <<<<<<<<<<<<<<
+ *       else:
+ *         raise ValueError('Cannot invoke RPC: %s' % self._state.closed_reason)
+ */
+            __pyx_t_2 = __Pyx_PyInt_From_grpc_connectivity_state(grpc_channel_check_connectivity_state(__pyx_v_self->_state->c_channel, __pyx_v_try_to_connect)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 561, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_r = __pyx_t_2;
+            __pyx_t_2 = 0;
+            goto __pyx_L11_try_return;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":560
+ *   def check_connectivity_state(self, bint try_to_connect):
+ *     with self._state.condition:
+ *       if self._state.open:             # <<<<<<<<<<<<<<
+ *         return grpc_channel_check_connectivity_state(
+ *             self._state.c_channel, try_to_connect)
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":564
+ *             self._state.c_channel, try_to_connect)
+ *       else:
+ *         raise ValueError('Cannot invoke RPC: %s' % self._state.closed_reason)             # <<<<<<<<<<<<<<
+ * 
+ *   def watch_connectivity_state(
+ */
+          /*else*/ {
+            __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Cannot_invoke_RPC_s, __pyx_v_self->_state->closed_reason); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 564, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 564, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __PYX_ERR(12, 564, __pyx_L7_error)
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":559
+ * 
+ *   def check_connectivity_state(self, bint try_to_connect):
+ *     with self._state.condition:             # <<<<<<<<<<<<<<
+ *       if self._state.open:
+ *         return grpc_channel_check_connectivity_state(
+ */
+        }
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc.Channel.check_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_4) < 0) __PYX_ERR(12, 559, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_10 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(12, 559, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_10, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(12, 559, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(12, 559, __pyx_L9_except_error)
+          __pyx_t_12 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_2, __pyx_t_4);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(12, 559, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L11_try_return:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L4_return;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(12, 559, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L4_return: {
+        __pyx_t_8 = __pyx_r;
+        __pyx_r = 0;
+        if (__pyx_t_1) {
+          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_7)) __PYX_ERR(12, 559, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+        __pyx_r = __pyx_t_8;
+        __pyx_t_8 = 0;
+        goto __pyx_L0;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L17;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L17:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":558
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def check_connectivity_state(self, bint try_to_connect):             # <<<<<<<<<<<<<<
+ *     with self._state.condition:
+ *       if self._state.open:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.check_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":566
+ *         raise ValueError('Cannot invoke RPC: %s' % self._state.closed_reason)
+ * 
+ *   def watch_connectivity_state(             # <<<<<<<<<<<<<<
+ *       self, grpc_connectivity_state last_observed_state, object deadline):
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_13watch_connectivity_state(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_13watch_connectivity_state = {"watch_connectivity_state", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_13watch_connectivity_state, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_13watch_connectivity_state(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_connectivity_state __pyx_v_last_observed_state;
+  PyObject *__pyx_v_deadline = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("watch_connectivity_state (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_last_observed_state,&__pyx_n_s_deadline,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_last_observed_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 566, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_deadline)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 566, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("watch_connectivity_state", 1, 2, 2, 1); __PYX_ERR(12, 566, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "watch_connectivity_state") < 0)) __PYX_ERR(12, 566, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_last_observed_state = ((grpc_connectivity_state)__Pyx_PyInt_As_grpc_connectivity_state(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 567, __pyx_L3_error)
+    __pyx_v_deadline = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("watch_connectivity_state", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 566, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.watch_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_12watch_connectivity_state(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v_last_observed_state, __pyx_v_deadline);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_12watch_connectivity_state(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, grpc_connectivity_state __pyx_v_last_observed_state, PyObject *__pyx_v_deadline) {
+  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("watch_connectivity_state", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":568
+ *   def watch_connectivity_state(
+ *       self, grpc_connectivity_state last_observed_state, object deadline):
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)             # <<<<<<<<<<<<<<
+ * 
+ *   def close(self, code, details):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->_state);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__watch_connectivity_state(((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)__pyx_t_1), __pyx_v_last_observed_state, __pyx_v_deadline); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 568, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":566
+ *         raise ValueError('Cannot invoke RPC: %s' % self._state.closed_reason)
+ * 
+ *   def watch_connectivity_state(             # <<<<<<<<<<<<<<
+ *       self, grpc_connectivity_state last_observed_state, object deadline):
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.watch_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":570
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)
+ * 
+ *   def close(self, code, details):             # <<<<<<<<<<<<<<
+ *     _close(self, code, details, False)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_15close(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_15close = {"close", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_15close, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_15close(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_code = 0;
+  PyObject *__pyx_v_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("close (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,&__pyx_n_s_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 570, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 570, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("close", 1, 2, 2, 1); __PYX_ERR(12, 570, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "close") < 0)) __PYX_ERR(12, 570, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_code = values[0];
+    __pyx_v_details = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("close", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 570, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_14close(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v_code, __pyx_v_details);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_14close(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  grpc_status_code __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("close", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":571
+ * 
+ *   def close(self, code, details):
+ *     _close(self, code, details, False)             # <<<<<<<<<<<<<<
+ * 
+ *   def close_on_fork(self, code, details):
+ */
+  __pyx_t_1 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_v_code)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 571, __pyx_L1_error)
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__close(__pyx_v_self, __pyx_t_1, __pyx_v_details, Py_False); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 571, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":570
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)
+ * 
+ *   def close(self, code, details):             # <<<<<<<<<<<<<<
+ *     _close(self, code, details, False)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":573
+ *     _close(self, code, details, False)
+ * 
+ *   def close_on_fork(self, code, details):             # <<<<<<<<<<<<<<
+ *     _close(self, code, details, True)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_17close_on_fork(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_17close_on_fork = {"close_on_fork", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_17close_on_fork, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_17close_on_fork(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_code = 0;
+  PyObject *__pyx_v_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("close_on_fork (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,&__pyx_n_s_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 573, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 573, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("close_on_fork", 1, 2, 2, 1); __PYX_ERR(12, 573, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "close_on_fork") < 0)) __PYX_ERR(12, 573, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_code = values[0];
+    __pyx_v_details = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("close_on_fork", 1, 2, 2, __pyx_nargs); __PYX_ERR(12, 573, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.close_on_fork", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_16close_on_fork(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v_code, __pyx_v_details);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_16close_on_fork(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  grpc_status_code __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("close_on_fork", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":574
+ * 
+ *   def close_on_fork(self, code, details):
+ *     _close(self, code, details, True)             # <<<<<<<<<<<<<<
+ * 
+ *   def get_registered_call_handle(self, method):
+ */
+  __pyx_t_1 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_v_code)); if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 574, __pyx_L1_error)
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__close(__pyx_v_self, __pyx_t_1, __pyx_v_details, Py_True); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 574, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":573
+ *     _close(self, code, details, False)
+ * 
+ *   def close_on_fork(self, code, details):             # <<<<<<<<<<<<<<
+ *     _close(self, code, details, True)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.close_on_fork", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":576
+ *     _close(self, code, details, True)
+ * 
+ *   def get_registered_call_handle(self, method):             # <<<<<<<<<<<<<<
+ *     """
+ *     Get or registers a call handler for a method.
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_19get_registered_call_handle(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_7Channel_18get_registered_call_handle, "\n    Get or registers a call handler for a method.\n\n    This method is not thread-safe.\n\n    Args:\n      method: Required, the method name for the RPC.\n\n    Returns:\n      The registered call handle pointer in the form of a Python Long. \n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_19get_registered_call_handle = {"get_registered_call_handle", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_19get_registered_call_handle, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_7Channel_18get_registered_call_handle};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_19get_registered_call_handle(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_method = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_registered_call_handle (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(12, 576, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "get_registered_call_handle") < 0)) __PYX_ERR(12, 576, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_method = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("get_registered_call_handle", 1, 1, 1, __pyx_nargs); __PYX_ERR(12, 576, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.get_registered_call_handle", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_18get_registered_call_handle(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v_method);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_18get_registered_call_handle(struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, PyObject *__pyx_v_method) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_registered_call_handle", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":588
+ *       The registered call handle pointer in the form of a Python Long.
+ *     """
+ *     if method not in self._registered_call_handles.keys():             # <<<<<<<<<<<<<<
+ *       self._registered_call_handles[method] = CallHandle(self._state, method)
+ *     return self._registered_call_handles[method].call_handle
+ */
+  if (unlikely(__pyx_v_self->_registered_call_handles == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "keys");
+    __PYX_ERR(12, 588, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_PyDict_Keys(__pyx_v_self->_registered_call_handles); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 588, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_v_method, __pyx_t_1, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(12, 588, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":589
+ *     """
+ *     if method not in self._registered_call_handles.keys():
+ *       self._registered_call_handles[method] = CallHandle(self._state, method)             # <<<<<<<<<<<<<<
+ *     return self._registered_call_handles[method].call_handle
+ */
+    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 589, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF((PyObject *)__pyx_v_self->_state);
+    __Pyx_GIVEREF((PyObject *)__pyx_v_self->_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->_state))) __PYX_ERR(12, 589, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_method);
+    __Pyx_GIVEREF(__pyx_v_method);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_method)) __PYX_ERR(12, 589, __pyx_L1_error);
+    __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallHandle), __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 589, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(__pyx_v_self->_registered_call_handles == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      __PYX_ERR(12, 589, __pyx_L1_error)
+    }
+    if (unlikely((PyDict_SetItem(__pyx_v_self->_registered_call_handles, __pyx_v_method, __pyx_t_3) < 0))) __PYX_ERR(12, 589, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":588
+ *       The registered call handle pointer in the form of a Python Long.
+ *     """
+ *     if method not in self._registered_call_handles.keys():             # <<<<<<<<<<<<<<
+ *       self._registered_call_handles[method] = CallHandle(self._state, method)
+ *     return self._registered_call_handles[method].call_handle
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":590
+ *     if method not in self._registered_call_handles.keys():
+ *       self._registered_call_handles[method] = CallHandle(self._state, method)
+ *     return self._registered_call_handles[method].call_handle             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  if (unlikely(__pyx_v_self->_registered_call_handles == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(12, 590, __pyx_L1_error)
+  }
+  __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_self->_registered_call_handles, __pyx_v_method); if (unlikely(!__pyx_t_3)) __PYX_ERR(12, 590, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_call_handle); if (unlikely(!__pyx_t_1)) __PYX_ERR(12, 590, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":576
+ *     _close(self, code, details, True)
+ * 
+ *   def get_registered_call_handle(self, method):             # <<<<<<<<<<<<<<
+ *     """
+ *     Get or registers a call handler for a method.
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.get_registered_call_handle", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_21__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_21__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_21__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_21__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_20__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_20__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_23__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7Channel_23__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_23__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7Channel_23__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_7Channel_22__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_Channel *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_7Channel_22__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Channel *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.Channel.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":16
+ * 
+ * 
+ * def channelz_get_top_channels(start_channel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_top_channels(
+ *         start_channel_id,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_1channelz_get_top_channels(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_1channelz_get_top_channels = {"channelz_get_top_channels", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_1channelz_get_top_channels, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_1channelz_get_top_channels(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_start_channel_id = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channelz_get_top_channels (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_start_channel_id,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_start_channel_id)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 16, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channelz_get_top_channels") < 0)) __PYX_ERR(13, 16, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_start_channel_id = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channelz_get_top_channels", 1, 1, 1, __pyx_nargs); __PYX_ERR(13, 16, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_top_channels", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_channelz_get_top_channels(__pyx_self, __pyx_v_start_channel_id);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_channelz_get_top_channels(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_start_channel_id) {
+  char *__pyx_v_c_returned_str;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __pyx_t_7_cython_6cygrpc_intptr_t __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("channelz_get_top_channels", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":18
+ * def channelz_get_top_channels(start_channel_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_top_channels(
+ *         start_channel_id,             # <<<<<<<<<<<<<<
+ *     )
+ *     if c_returned_str == NULL:
+ */
+  __pyx_t_1 = PyInt_AsSsize_t(__pyx_v_start_channel_id); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 18, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":17
+ * 
+ * def channelz_get_top_channels(start_channel_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_top_channels(             # <<<<<<<<<<<<<<
+ *         start_channel_id,
+ *     )
+ */
+  __pyx_v_c_returned_str = grpc_channelz_get_top_channels(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":20
+ *         start_channel_id,
+ *     )
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get top channels, please ensure your' \
+ *                          ' start_channel_id==%s is valid' % start_channel_id)
+ */
+  __pyx_t_2 = (__pyx_v_c_returned_str == NULL);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":22
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get top channels, please ensure your' \
+ *                          ' start_channel_id==%s is valid' % start_channel_id)             # <<<<<<<<<<<<<<
+ *     return c_returned_str
+ * 
+ */
+    __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Failed_to_get_top_channels_pleas, __pyx_v_start_channel_id); if (unlikely(!__pyx_t_3)) __PYX_ERR(13, 22, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":21
+ *     )
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get top channels, please ensure your' \             # <<<<<<<<<<<<<<
+ *                          ' start_channel_id==%s is valid' % start_channel_id)
+ *     return c_returned_str
+ */
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 21, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __PYX_ERR(13, 21, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":20
+ *         start_channel_id,
+ *     )
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get top channels, please ensure your' \
+ *                          ' start_channel_id==%s is valid' % start_channel_id)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":23
+ *         raise ValueError('Failed to get top channels, please ensure your' \
+ *                          ' start_channel_id==%s is valid' % start_channel_id)
+ *     return c_returned_str             # <<<<<<<<<<<<<<
+ * 
+ * def channelz_get_servers(start_server_id):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_c_returned_str); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 23, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_r = __pyx_t_4;
+  __pyx_t_4 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":16
+ * 
+ * 
+ * def channelz_get_top_channels(start_channel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_top_channels(
+ *         start_channel_id,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_top_channels", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":25
+ *     return c_returned_str
+ * 
+ * def channelz_get_servers(start_server_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_servers(start_server_id)
+ *     if c_returned_str == NULL:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_3channelz_get_servers(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_3channelz_get_servers = {"channelz_get_servers", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_3channelz_get_servers, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_3channelz_get_servers(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_start_server_id = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channelz_get_servers (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_start_server_id,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_start_server_id)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 25, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channelz_get_servers") < 0)) __PYX_ERR(13, 25, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_start_server_id = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channelz_get_servers", 1, 1, 1, __pyx_nargs); __PYX_ERR(13, 25, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_servers", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_2channelz_get_servers(__pyx_self, __pyx_v_start_server_id);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_2channelz_get_servers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_start_server_id) {
+  char *__pyx_v_c_returned_str;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __pyx_t_7_cython_6cygrpc_intptr_t __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("channelz_get_servers", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":26
+ * 
+ * def channelz_get_servers(start_server_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_servers(start_server_id)             # <<<<<<<<<<<<<<
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get servers, please ensure your' \
+ */
+  __pyx_t_1 = PyInt_AsSsize_t(__pyx_v_start_server_id); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 26, __pyx_L1_error)
+  __pyx_v_c_returned_str = grpc_channelz_get_servers(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":27
+ * def channelz_get_servers(start_server_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_servers(start_server_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get servers, please ensure your' \
+ *                          ' start_server_id==%s is valid' % start_server_id)
+ */
+  __pyx_t_2 = (__pyx_v_c_returned_str == NULL);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":29
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get servers, please ensure your' \
+ *                          ' start_server_id==%s is valid' % start_server_id)             # <<<<<<<<<<<<<<
+ *     return c_returned_str
+ * 
+ */
+    __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Failed_to_get_servers_please_ens, __pyx_v_start_server_id); if (unlikely(!__pyx_t_3)) __PYX_ERR(13, 29, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":28
+ *     cdef char *c_returned_str = grpc_channelz_get_servers(start_server_id)
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get servers, please ensure your' \             # <<<<<<<<<<<<<<
+ *                          ' start_server_id==%s is valid' % start_server_id)
+ *     return c_returned_str
+ */
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 28, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __PYX_ERR(13, 28, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":27
+ * def channelz_get_servers(start_server_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_servers(start_server_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get servers, please ensure your' \
+ *                          ' start_server_id==%s is valid' % start_server_id)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":30
+ *         raise ValueError('Failed to get servers, please ensure your' \
+ *                          ' start_server_id==%s is valid' % start_server_id)
+ *     return c_returned_str             # <<<<<<<<<<<<<<
+ * 
+ * def channelz_get_server(server_id):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_c_returned_str); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 30, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_r = __pyx_t_4;
+  __pyx_t_4 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":25
+ *     return c_returned_str
+ * 
+ * def channelz_get_servers(start_server_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_servers(start_server_id)
+ *     if c_returned_str == NULL:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_servers", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":32
+ *     return c_returned_str
+ * 
+ * def channelz_get_server(server_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_server(server_id)
+ *     if c_returned_str == NULL:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_5channelz_get_server(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_5channelz_get_server = {"channelz_get_server", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_5channelz_get_server, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_5channelz_get_server(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_server_id = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channelz_get_server (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_server_id,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_server_id)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 32, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channelz_get_server") < 0)) __PYX_ERR(13, 32, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_server_id = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channelz_get_server", 1, 1, 1, __pyx_nargs); __PYX_ERR(13, 32, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_server", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4channelz_get_server(__pyx_self, __pyx_v_server_id);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4channelz_get_server(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_server_id) {
+  char *__pyx_v_c_returned_str;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __pyx_t_7_cython_6cygrpc_intptr_t __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("channelz_get_server", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":33
+ * 
+ * def channelz_get_server(server_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_server(server_id)             # <<<<<<<<<<<<<<
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the server, please ensure your' \
+ */
+  __pyx_t_1 = PyInt_AsSsize_t(__pyx_v_server_id); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 33, __pyx_L1_error)
+  __pyx_v_c_returned_str = grpc_channelz_get_server(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":34
+ * def channelz_get_server(server_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_server(server_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get the server, please ensure your' \
+ *                          ' server_id==%s is valid' % server_id)
+ */
+  __pyx_t_2 = (__pyx_v_c_returned_str == NULL);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":36
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the server, please ensure your' \
+ *                          ' server_id==%s is valid' % server_id)             # <<<<<<<<<<<<<<
+ *     return c_returned_str
+ * 
+ */
+    __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Failed_to_get_the_server_please, __pyx_v_server_id); if (unlikely(!__pyx_t_3)) __PYX_ERR(13, 36, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":35
+ *     cdef char *c_returned_str = grpc_channelz_get_server(server_id)
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the server, please ensure your' \             # <<<<<<<<<<<<<<
+ *                          ' server_id==%s is valid' % server_id)
+ *     return c_returned_str
+ */
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 35, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __PYX_ERR(13, 35, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":34
+ * def channelz_get_server(server_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_server(server_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get the server, please ensure your' \
+ *                          ' server_id==%s is valid' % server_id)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":37
+ *         raise ValueError('Failed to get the server, please ensure your' \
+ *                          ' server_id==%s is valid' % server_id)
+ *     return c_returned_str             # <<<<<<<<<<<<<<
+ * 
+ * def channelz_get_server_sockets(server_id, start_socket_id, max_results):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_c_returned_str); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 37, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_r = __pyx_t_4;
+  __pyx_t_4 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":32
+ *     return c_returned_str
+ * 
+ * def channelz_get_server(server_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_server(server_id)
+ *     if c_returned_str == NULL:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_server", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":39
+ *     return c_returned_str
+ * 
+ * def channelz_get_server_sockets(server_id, start_socket_id, max_results):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_server_sockets(
+ *         server_id,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_7channelz_get_server_sockets(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_7channelz_get_server_sockets = {"channelz_get_server_sockets", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7channelz_get_server_sockets, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_7channelz_get_server_sockets(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_server_id = 0;
+  PyObject *__pyx_v_start_socket_id = 0;
+  PyObject *__pyx_v_max_results = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channelz_get_server_sockets (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_server_id,&__pyx_n_s_start_socket_id,&__pyx_n_s_max_results,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_server_id)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 39, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_start_socket_id)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 39, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("channelz_get_server_sockets", 1, 3, 3, 1); __PYX_ERR(13, 39, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_results)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 39, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("channelz_get_server_sockets", 1, 3, 3, 2); __PYX_ERR(13, 39, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channelz_get_server_sockets") < 0)) __PYX_ERR(13, 39, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_server_id = values[0];
+    __pyx_v_start_socket_id = values[1];
+    __pyx_v_max_results = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channelz_get_server_sockets", 1, 3, 3, __pyx_nargs); __PYX_ERR(13, 39, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_server_sockets", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6channelz_get_server_sockets(__pyx_self, __pyx_v_server_id, __pyx_v_start_socket_id, __pyx_v_max_results);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6channelz_get_server_sockets(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_server_id, PyObject *__pyx_v_start_socket_id, PyObject *__pyx_v_max_results) {
+  char *__pyx_v_c_returned_str;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __pyx_t_7_cython_6cygrpc_intptr_t __pyx_t_1;
+  __pyx_t_7_cython_6cygrpc_intptr_t __pyx_t_2;
+  __pyx_t_7_cython_6cygrpc_intptr_t __pyx_t_3;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("channelz_get_server_sockets", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":41
+ * def channelz_get_server_sockets(server_id, start_socket_id, max_results):
+ *     cdef char *c_returned_str = grpc_channelz_get_server_sockets(
+ *         server_id,             # <<<<<<<<<<<<<<
+ *         start_socket_id,
+ *         max_results,
+ */
+  __pyx_t_1 = PyInt_AsSsize_t(__pyx_v_server_id); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 41, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":42
+ *     cdef char *c_returned_str = grpc_channelz_get_server_sockets(
+ *         server_id,
+ *         start_socket_id,             # <<<<<<<<<<<<<<
+ *         max_results,
+ *     )
+ */
+  __pyx_t_2 = PyInt_AsSsize_t(__pyx_v_start_socket_id); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 42, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":43
+ *         server_id,
+ *         start_socket_id,
+ *         max_results,             # <<<<<<<<<<<<<<
+ *     )
+ *     if c_returned_str == NULL:
+ */
+  __pyx_t_3 = PyInt_AsSsize_t(__pyx_v_max_results); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 43, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":40
+ * 
+ * def channelz_get_server_sockets(server_id, start_socket_id, max_results):
+ *     cdef char *c_returned_str = grpc_channelz_get_server_sockets(             # <<<<<<<<<<<<<<
+ *         server_id,
+ *         start_socket_id,
+ */
+  __pyx_v_c_returned_str = grpc_channelz_get_server_sockets(__pyx_t_1, __pyx_t_2, __pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":45
+ *         max_results,
+ *     )
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get server sockets, please ensure your' \
+ *                          ' server_id==%s and start_socket_id==%s and' \
+ */
+  __pyx_t_4 = (__pyx_v_c_returned_str == NULL);
+  if (unlikely(__pyx_t_4)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":49
+ *                          ' server_id==%s and start_socket_id==%s and' \
+ *                          ' max_results==%s is valid' %
+ *                          (server_id, start_socket_id, max_results))             # <<<<<<<<<<<<<<
+ *     return c_returned_str
+ * 
+ */
+    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(13, 49, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_INCREF(__pyx_v_server_id);
+    __Pyx_GIVEREF(__pyx_v_server_id);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_server_id)) __PYX_ERR(13, 49, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_start_socket_id);
+    __Pyx_GIVEREF(__pyx_v_start_socket_id);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_start_socket_id)) __PYX_ERR(13, 49, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_max_results);
+    __Pyx_GIVEREF(__pyx_v_max_results);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_max_results)) __PYX_ERR(13, 49, __pyx_L1_error);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":48
+ *         raise ValueError('Failed to get server sockets, please ensure your' \
+ *                          ' server_id==%s and start_socket_id==%s and' \
+ *                          ' max_results==%s is valid' %             # <<<<<<<<<<<<<<
+ *                          (server_id, start_socket_id, max_results))
+ *     return c_returned_str
+ */
+    __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Failed_to_get_server_sockets_ple, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(13, 48, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":46
+ *     )
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get server sockets, please ensure your' \             # <<<<<<<<<<<<<<
+ *                          ' server_id==%s and start_socket_id==%s and' \
+ *                          ' max_results==%s is valid' %
+ */
+    __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(13, 46, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __PYX_ERR(13, 46, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":45
+ *         max_results,
+ *     )
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get server sockets, please ensure your' \
+ *                          ' server_id==%s and start_socket_id==%s and' \
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":50
+ *                          ' max_results==%s is valid' %
+ *                          (server_id, start_socket_id, max_results))
+ *     return c_returned_str             # <<<<<<<<<<<<<<
+ * 
+ * def channelz_get_channel(channel_id):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_c_returned_str); if (unlikely(!__pyx_t_5)) __PYX_ERR(13, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_r = __pyx_t_5;
+  __pyx_t_5 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":39
+ *     return c_returned_str
+ * 
+ * def channelz_get_server_sockets(server_id, start_socket_id, max_results):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_server_sockets(
+ *         server_id,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_server_sockets", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":52
+ *     return c_returned_str
+ * 
+ * def channelz_get_channel(channel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_channel(channel_id)
+ *     if c_returned_str == NULL:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9channelz_get_channel(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9channelz_get_channel = {"channelz_get_channel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9channelz_get_channel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9channelz_get_channel(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_channel_id = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channelz_get_channel (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_channel_id,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel_id)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 52, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channelz_get_channel") < 0)) __PYX_ERR(13, 52, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_channel_id = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channelz_get_channel", 1, 1, 1, __pyx_nargs); __PYX_ERR(13, 52, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_channel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8channelz_get_channel(__pyx_self, __pyx_v_channel_id);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8channelz_get_channel(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_channel_id) {
+  char *__pyx_v_c_returned_str;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __pyx_t_7_cython_6cygrpc_intptr_t __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("channelz_get_channel", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":53
+ * 
+ * def channelz_get_channel(channel_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_channel(channel_id)             # <<<<<<<<<<<<<<
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the channel, please ensure your' \
+ */
+  __pyx_t_1 = PyInt_AsSsize_t(__pyx_v_channel_id); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 53, __pyx_L1_error)
+  __pyx_v_c_returned_str = grpc_channelz_get_channel(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":54
+ * def channelz_get_channel(channel_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_channel(channel_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get the channel, please ensure your' \
+ *                          ' channel_id==%s is valid' % (channel_id))
+ */
+  __pyx_t_2 = (__pyx_v_c_returned_str == NULL);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":56
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the channel, please ensure your' \
+ *                          ' channel_id==%s is valid' % (channel_id))             # <<<<<<<<<<<<<<
+ *     return c_returned_str
+ * 
+ */
+    __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Failed_to_get_the_channel_please, __pyx_v_channel_id); if (unlikely(!__pyx_t_3)) __PYX_ERR(13, 56, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":55
+ *     cdef char *c_returned_str = grpc_channelz_get_channel(channel_id)
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the channel, please ensure your' \             # <<<<<<<<<<<<<<
+ *                          ' channel_id==%s is valid' % (channel_id))
+ *     return c_returned_str
+ */
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 55, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __PYX_ERR(13, 55, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":54
+ * def channelz_get_channel(channel_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_channel(channel_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get the channel, please ensure your' \
+ *                          ' channel_id==%s is valid' % (channel_id))
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":57
+ *         raise ValueError('Failed to get the channel, please ensure your' \
+ *                          ' channel_id==%s is valid' % (channel_id))
+ *     return c_returned_str             # <<<<<<<<<<<<<<
+ * 
+ * def channelz_get_subchannel(subchannel_id):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_c_returned_str); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_r = __pyx_t_4;
+  __pyx_t_4 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":52
+ *     return c_returned_str
+ * 
+ * def channelz_get_channel(channel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_channel(channel_id)
+ *     if c_returned_str == NULL:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_channel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":59
+ *     return c_returned_str
+ * 
+ * def channelz_get_subchannel(subchannel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_subchannel(subchannel_id)
+ *     if c_returned_str == NULL:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_11channelz_get_subchannel(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_11channelz_get_subchannel = {"channelz_get_subchannel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11channelz_get_subchannel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_11channelz_get_subchannel(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_subchannel_id = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channelz_get_subchannel (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_subchannel_id,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_subchannel_id)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 59, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channelz_get_subchannel") < 0)) __PYX_ERR(13, 59, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_subchannel_id = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channelz_get_subchannel", 1, 1, 1, __pyx_nargs); __PYX_ERR(13, 59, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_subchannel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10channelz_get_subchannel(__pyx_self, __pyx_v_subchannel_id);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10channelz_get_subchannel(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_subchannel_id) {
+  char *__pyx_v_c_returned_str;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __pyx_t_7_cython_6cygrpc_intptr_t __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("channelz_get_subchannel", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":60
+ * 
+ * def channelz_get_subchannel(subchannel_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_subchannel(subchannel_id)             # <<<<<<<<<<<<<<
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the subchannel, please ensure your' \
+ */
+  __pyx_t_1 = PyInt_AsSsize_t(__pyx_v_subchannel_id); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 60, __pyx_L1_error)
+  __pyx_v_c_returned_str = grpc_channelz_get_subchannel(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":61
+ * def channelz_get_subchannel(subchannel_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_subchannel(subchannel_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get the subchannel, please ensure your' \
+ *                          ' subchannel_id==%s is valid' % (subchannel_id))
+ */
+  __pyx_t_2 = (__pyx_v_c_returned_str == NULL);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":63
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the subchannel, please ensure your' \
+ *                          ' subchannel_id==%s is valid' % (subchannel_id))             # <<<<<<<<<<<<<<
+ *     return c_returned_str
+ * 
+ */
+    __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Failed_to_get_the_subchannel_ple, __pyx_v_subchannel_id); if (unlikely(!__pyx_t_3)) __PYX_ERR(13, 63, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":62
+ *     cdef char *c_returned_str = grpc_channelz_get_subchannel(subchannel_id)
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the subchannel, please ensure your' \             # <<<<<<<<<<<<<<
+ *                          ' subchannel_id==%s is valid' % (subchannel_id))
+ *     return c_returned_str
+ */
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 62, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __PYX_ERR(13, 62, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":61
+ * def channelz_get_subchannel(subchannel_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_subchannel(subchannel_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get the subchannel, please ensure your' \
+ *                          ' subchannel_id==%s is valid' % (subchannel_id))
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":64
+ *         raise ValueError('Failed to get the subchannel, please ensure your' \
+ *                          ' subchannel_id==%s is valid' % (subchannel_id))
+ *     return c_returned_str             # <<<<<<<<<<<<<<
+ * 
+ * def channelz_get_socket(socket_id):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_c_returned_str); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 64, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_r = __pyx_t_4;
+  __pyx_t_4 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":59
+ *     return c_returned_str
+ * 
+ * def channelz_get_subchannel(subchannel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_subchannel(subchannel_id)
+ *     if c_returned_str == NULL:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_subchannel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":66
+ *     return c_returned_str
+ * 
+ * def channelz_get_socket(socket_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_socket(socket_id)
+ *     if c_returned_str == NULL:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_13channelz_get_socket(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_13channelz_get_socket = {"channelz_get_socket", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13channelz_get_socket, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_13channelz_get_socket(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_socket_id = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channelz_get_socket (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_socket_id,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_socket_id)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(13, 66, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channelz_get_socket") < 0)) __PYX_ERR(13, 66, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_socket_id = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channelz_get_socket", 1, 1, 1, __pyx_nargs); __PYX_ERR(13, 66, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_socket", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12channelz_get_socket(__pyx_self, __pyx_v_socket_id);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12channelz_get_socket(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_socket_id) {
+  char *__pyx_v_c_returned_str;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __pyx_t_7_cython_6cygrpc_intptr_t __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("channelz_get_socket", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":67
+ * 
+ * def channelz_get_socket(socket_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_socket(socket_id)             # <<<<<<<<<<<<<<
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the socket, please ensure your' \
+ */
+  __pyx_t_1 = PyInt_AsSsize_t(__pyx_v_socket_id); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(13, 67, __pyx_L1_error)
+  __pyx_v_c_returned_str = grpc_channelz_get_socket(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":68
+ * def channelz_get_socket(socket_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_socket(socket_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get the socket, please ensure your' \
+ *                          ' socket_id==%s is valid' % (socket_id))
+ */
+  __pyx_t_2 = (__pyx_v_c_returned_str == NULL);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":70
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the socket, please ensure your' \
+ *                          ' socket_id==%s is valid' % (socket_id))             # <<<<<<<<<<<<<<
+ *     return c_returned_str
+ */
+    __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Failed_to_get_the_socket_please, __pyx_v_socket_id); if (unlikely(!__pyx_t_3)) __PYX_ERR(13, 70, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":69
+ *     cdef char *c_returned_str = grpc_channelz_get_socket(socket_id)
+ *     if c_returned_str == NULL:
+ *         raise ValueError('Failed to get the socket, please ensure your' \             # <<<<<<<<<<<<<<
+ *                          ' socket_id==%s is valid' % (socket_id))
+ *     return c_returned_str
+ */
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 69, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __PYX_ERR(13, 69, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":68
+ * def channelz_get_socket(socket_id):
+ *     cdef char *c_returned_str = grpc_channelz_get_socket(socket_id)
+ *     if c_returned_str == NULL:             # <<<<<<<<<<<<<<
+ *         raise ValueError('Failed to get the socket, please ensure your' \
+ *                          ' socket_id==%s is valid' % (socket_id))
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":71
+ *         raise ValueError('Failed to get the socket, please ensure your' \
+ *                          ' socket_id==%s is valid' % (socket_id))
+ *     return c_returned_str             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_c_returned_str); if (unlikely(!__pyx_t_4)) __PYX_ERR(13, 71, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_r = __pyx_t_4;
+  __pyx_t_4 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":66
+ *     return c_returned_str
+ * 
+ * def channelz_get_socket(socket_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_socket(socket_id)
+ *     if c_returned_str == NULL:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.channelz_get_socket", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":16
+ * 
+ * 
+ * def dump_xds_configs():             # <<<<<<<<<<<<<<
+ *     cdef grpc_slice client_config_in_slice
+ *     with nogil:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15dump_xds_configs(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15dump_xds_configs = {"dump_xds_configs", (PyCFunction)__pyx_pw_7_cython_6cygrpc_15dump_xds_configs, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15dump_xds_configs(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("dump_xds_configs (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_14dump_xds_configs(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_14dump_xds_configs(CYTHON_UNUSED PyObject *__pyx_self) {
+  grpc_slice __pyx_v_client_config_in_slice;
+  PyObject *__pyx_v_result = 0;
+  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("dump_xds_configs", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":18
+ * def dump_xds_configs():
+ *     cdef grpc_slice client_config_in_slice
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *         client_config_in_slice = grpc_dump_xds_configs()
+ *     cdef bytes result = _slice_bytes(client_config_in_slice)
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":19
+ *     cdef grpc_slice client_config_in_slice
+ *     with nogil:
+ *         client_config_in_slice = grpc_dump_xds_configs()             # <<<<<<<<<<<<<<
+ *     cdef bytes result = _slice_bytes(client_config_in_slice)
+ *     return result
+ */
+        __pyx_v_client_config_in_slice = grpc_dump_xds_configs();
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":18
+ * def dump_xds_configs():
+ *     cdef grpc_slice client_config_in_slice
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *         client_config_in_slice = grpc_dump_xds_configs()
+ *     cdef bytes result = _slice_bytes(client_config_in_slice)
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":20
+ *     with nogil:
+ *         client_config_in_slice = grpc_dump_xds_configs()
+ *     cdef bytes result = _slice_bytes(client_config_in_slice)             # <<<<<<<<<<<<<<
+ *     return result
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__slice_bytes(__pyx_v_client_config_in_slice); if (unlikely(!__pyx_t_1)) __PYX_ERR(14, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_result = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":21
+ *         client_config_in_slice = grpc_dump_xds_configs()
+ *     cdef bytes result = _slice_bytes(client_config_in_slice)
+ *     return result             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_result);
+  __pyx_r = __pyx_v_result;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":16
+ * 
+ * 
+ * def dump_xds_configs():             # <<<<<<<<<<<<<<
+ *     cdef grpc_slice client_config_in_slice
+ *     with nogil:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.dump_xds_configs", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_result);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":16
+ * 
+ * 
+ * def _spawn_callback_in_thread(cb_func, args):             # <<<<<<<<<<<<<<
+ *   t = ForkManagedThread(target=cb_func, args=args)
+ *   t.setDaemon(True)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17_spawn_callback_in_thread(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17_spawn_callback_in_thread = {"_spawn_callback_in_thread", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17_spawn_callback_in_thread, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17_spawn_callback_in_thread(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_cb_func = 0;
+  PyObject *__pyx_v_args = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_spawn_callback_in_thread (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_cb_func,&__pyx_n_s_args,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cb_func)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 16, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 16, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_spawn_callback_in_thread", 1, 2, 2, 1); __PYX_ERR(5, 16, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_spawn_callback_in_thread") < 0)) __PYX_ERR(5, 16, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_cb_func = values[0];
+    __pyx_v_args = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_spawn_callback_in_thread", 1, 2, 2, __pyx_nargs); __PYX_ERR(5, 16, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._spawn_callback_in_thread", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_spawn_callback_in_thread(__pyx_self, __pyx_v_cb_func, __pyx_v_args);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_spawn_callback_in_thread(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_cb_func, PyObject *__pyx_v_args) {
+  PyObject *__pyx_v_t = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("_spawn_callback_in_thread", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":17
+ * 
+ * def _spawn_callback_in_thread(cb_func, args):
+ *   t = ForkManagedThread(target=cb_func, args=args)             # <<<<<<<<<<<<<<
+ *   t.setDaemon(True)
+ *   t.start()
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_ForkManagedThread); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_target, __pyx_v_cb_func) < 0) __PYX_ERR(5, 17, __pyx_L1_error)
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_args, __pyx_v_args) < 0) __PYX_ERR(5, 17, __pyx_L1_error)
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_t = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":18
+ * def _spawn_callback_in_thread(cb_func, args):
+ *   t = ForkManagedThread(target=cb_func, args=args)
+ *   t.setDaemon(True)             # <<<<<<<<<<<<<<
+ *   t.start()
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_t, __pyx_n_s_setDaemon); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, Py_True};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 18, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":19
+ *   t = ForkManagedThread(target=cb_func, args=args)
+ *   t.setDaemon(True)
+ *   t.start()             # <<<<<<<<<<<<<<
+ * 
+ * async_callback_func = _spawn_callback_in_thread
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_t, __pyx_n_s_start); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 19, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":16
+ * 
+ * 
+ * def _spawn_callback_in_thread(cb_func, args):             # <<<<<<<<<<<<<<
+ *   t = ForkManagedThread(target=cb_func, args=args)
+ *   t.setDaemon(True)
+ */
+
+  /* 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("_cython.cygrpc._spawn_callback_in_thread", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_t);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":23
+ * async_callback_func = _spawn_callback_in_thread
+ * 
+ * def set_async_callback_func(callback_func):             # <<<<<<<<<<<<<<
+ *   global async_callback_func
+ *   async_callback_func = callback_func
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19set_async_callback_func(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19set_async_callback_func = {"set_async_callback_func", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19set_async_callback_func, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19set_async_callback_func(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_callback_func = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_async_callback_func (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_callback_func,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_callback_func)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 23, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_async_callback_func") < 0)) __PYX_ERR(5, 23, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_callback_func = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_async_callback_func", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 23, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.set_async_callback_func", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18set_async_callback_func(__pyx_self, __pyx_v_callback_func);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18set_async_callback_func(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_callback_func) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("set_async_callback_func", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":25
+ * def set_async_callback_func(callback_func):
+ *   global async_callback_func
+ *   async_callback_func = callback_func             # <<<<<<<<<<<<<<
+ * 
+ * def _spawn_callback_async(callback, args):
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_async_callback_func, __pyx_v_callback_func) < 0) __PYX_ERR(5, 25, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":23
+ * async_callback_func = _spawn_callback_in_thread
+ * 
+ * def set_async_callback_func(callback_func):             # <<<<<<<<<<<<<<
+ *   global async_callback_func
+ *   async_callback_func = callback_func
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.set_async_callback_func", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":27
+ *   async_callback_func = callback_func
+ * 
+ * def _spawn_callback_async(callback, args):             # <<<<<<<<<<<<<<
+ *   async_callback_func(callback, args)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_spawn_callback_async(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21_spawn_callback_async = {"_spawn_callback_async", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_spawn_callback_async, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_spawn_callback_async(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_callback = 0;
+  PyObject *__pyx_v_args = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_spawn_callback_async (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_callback,&__pyx_n_s_args,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_callback)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 27, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 27, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_spawn_callback_async", 1, 2, 2, 1); __PYX_ERR(5, 27, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_spawn_callback_async") < 0)) __PYX_ERR(5, 27, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_callback = values[0];
+    __pyx_v_args = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_spawn_callback_async", 1, 2, 2, __pyx_nargs); __PYX_ERR(5, 27, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._spawn_callback_async", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_spawn_callback_async(__pyx_self, __pyx_v_callback, __pyx_v_args);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_spawn_callback_async(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_callback, PyObject *__pyx_v_args) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("_spawn_callback_async", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":28
+ * 
+ * def _spawn_callback_async(callback, args):
+ *   async_callback_func(callback, args)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_async_callback_func); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_v_callback, __pyx_v_args};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 28, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":27
+ *   async_callback_func = callback_func
+ * 
+ * def _spawn_callback_async(callback, args):             # <<<<<<<<<<<<<<
+ *   async_callback_func(callback, args)
+ * 
+ */
+
+  /* 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("_cython.cygrpc._spawn_callback_async", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":33
+ * cdef class CallCredentials:
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+static grpc_call_credentials *__pyx_f_7_cython_6cygrpc_15CallCredentials_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_self) {
+  grpc_call_credentials *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":34
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:
+ *     raise NotImplementedError()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_builtin_NotImplementedError); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __PYX_ERR(5, 34, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":33
+ * cdef class CallCredentials:
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CallCredentials.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CallCredentials_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CallCredentials_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CallCredentials_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CallCredentials_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CallCredentials___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CallCredentials___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self_c_credentials_cannot_be_con, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CallCredentials_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CallCredentials_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CallCredentials_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CallCredentials_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CallCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CallCredentials_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CallCredentials_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self_c_credentials_cannot_be_con, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":47
+ *   cdef size_t metadata_count
+ *   cdef grpc_metadata *c_metadata
+ *   def callback(metadata, grpc_status_code status, bytes error_details):             # <<<<<<<<<<<<<<
+ *     cdef char* c_error_details = NULL
+ *     if error_details is not None:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_13_get_metadata_1callback(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_13_get_metadata_1callback = {"callback", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13_get_metadata_1callback, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_13_get_metadata_1callback(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_metadata = 0;
+  grpc_status_code __pyx_v_status;
+  PyObject *__pyx_v_error_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("callback (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_metadata,&__pyx_n_s_status,&__pyx_n_s_error_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 47, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_status)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 47, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("callback", 1, 3, 3, 1); __PYX_ERR(5, 47, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_error_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 47, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("callback", 1, 3, 3, 2); __PYX_ERR(5, 47, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "callback") < 0)) __PYX_ERR(5, 47, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_metadata = values[0];
+    __pyx_v_status = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(values[1])); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 47, __pyx_L3_error)
+    __pyx_v_error_details = ((PyObject*)values[2]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("callback", 1, 3, 3, __pyx_nargs); __PYX_ERR(5, 47, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._get_metadata.callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_error_details), (&PyBytes_Type), 1, "error_details", 1))) __PYX_ERR(5, 47, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_13_get_metadata_callback(__pyx_self, __pyx_v_metadata, __pyx_v_status, __pyx_v_error_details);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_13_get_metadata_callback(PyObject *__pyx_self, PyObject *__pyx_v_metadata, grpc_status_code __pyx_v_status, PyObject *__pyx_v_error_details) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata *__pyx_outer_scope;
+  char *__pyx_v_c_error_details;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  char *__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("callback", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":48
+ *   cdef grpc_metadata *c_metadata
+ *   def callback(metadata, grpc_status_code status, bytes error_details):
+ *     cdef char* c_error_details = NULL             # <<<<<<<<<<<<<<
+ *     if error_details is not None:
+ *       c_error_details = <char*> error_details
+ */
+  __pyx_v_c_error_details = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":49
+ *   def callback(metadata, grpc_status_code status, bytes error_details):
+ *     cdef char* c_error_details = NULL
+ *     if error_details is not None:             # <<<<<<<<<<<<<<
+ *       c_error_details = <char*> error_details
+ *     if status == StatusCode.ok:
+ */
+  __pyx_t_1 = (__pyx_v_error_details != ((PyObject*)Py_None));
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":50
+ *     cdef char* c_error_details = NULL
+ *     if error_details is not None:
+ *       c_error_details = <char*> error_details             # <<<<<<<<<<<<<<
+ *     if status == StatusCode.ok:
+ *       _store_c_metadata(metadata, &c_metadata, &metadata_count)
+ */
+    if (unlikely(__pyx_v_error_details == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+      __PYX_ERR(5, 50, __pyx_L1_error)
+    }
+    __pyx_t_2 = __Pyx_PyBytes_AsWritableString(__pyx_v_error_details); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) __PYX_ERR(5, 50, __pyx_L1_error)
+    __pyx_v_c_error_details = ((char *)__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":49
+ *   def callback(metadata, grpc_status_code status, bytes error_details):
+ *     cdef char* c_error_details = NULL
+ *     if error_details is not None:             # <<<<<<<<<<<<<<
+ *       c_error_details = <char*> error_details
+ *     if status == StatusCode.ok:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":51
+ *     if error_details is not None:
+ *       c_error_details = <char*> error_details
+ *     if status == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *       _store_c_metadata(metadata, &c_metadata, &metadata_count)
+ *       with nogil:
+ */
+  __pyx_t_3 = __Pyx_PyInt_From_grpc_status_code(__pyx_v_status); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 51, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 51, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_ok); if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 51, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 51, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(5, 51, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":52
+ *       c_error_details = <char*> error_details
+ *     if status == StatusCode.ok:
+ *       _store_c_metadata(metadata, &c_metadata, &metadata_count)             # <<<<<<<<<<<<<<
+ *       with nogil:
+ *         cb(user_data, c_metadata, metadata_count, status, NULL)
+ */
+    __pyx_f_7_cython_6cygrpc__store_c_metadata(__pyx_v_metadata, (&__pyx_cur_scope->__pyx_v_c_metadata), (&__pyx_cur_scope->__pyx_v_metadata_count)); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 52, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":53
+ *     if status == StatusCode.ok:
+ *       _store_c_metadata(metadata, &c_metadata, &metadata_count)
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         cb(user_data, c_metadata, metadata_count, status, NULL)
+ *       _release_c_metadata(c_metadata, metadata_count)
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":54
+ *       _store_c_metadata(metadata, &c_metadata, &metadata_count)
+ *       with nogil:
+ *         cb(user_data, c_metadata, metadata_count, status, NULL)             # <<<<<<<<<<<<<<
+ *       _release_c_metadata(c_metadata, metadata_count)
+ *     else:
+ */
+          __pyx_cur_scope->__pyx_v_cb(__pyx_cur_scope->__pyx_v_user_data, __pyx_cur_scope->__pyx_v_c_metadata, __pyx_cur_scope->__pyx_v_metadata_count, __pyx_v_status, NULL);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":53
+ *     if status == StatusCode.ok:
+ *       _store_c_metadata(metadata, &c_metadata, &metadata_count)
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         cb(user_data, c_metadata, metadata_count, status, NULL)
+ *       _release_c_metadata(c_metadata, metadata_count)
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L7;
+          }
+          __pyx_L7:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":55
+ *       with nogil:
+ *         cb(user_data, c_metadata, metadata_count, status, NULL)
+ *       _release_c_metadata(c_metadata, metadata_count)             # <<<<<<<<<<<<<<
+ *     else:
+ *       with nogil:
+ */
+    __pyx_f_7_cython_6cygrpc__release_c_metadata(__pyx_cur_scope->__pyx_v_c_metadata, __pyx_cur_scope->__pyx_v_metadata_count); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 55, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":51
+ *     if error_details is not None:
+ *       c_error_details = <char*> error_details
+ *     if status == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *       _store_c_metadata(metadata, &c_metadata, &metadata_count)
+ *       with nogil:
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":57
+ *       _release_c_metadata(c_metadata, metadata_count)
+ *     else:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         cb(user_data, NULL, 0, status, c_error_details)
+ *   args = context.service_url, context.method_name, callback,
+ */
+  /*else*/ {
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":58
+ *     else:
+ *       with nogil:
+ *         cb(user_data, NULL, 0, status, c_error_details)             # <<<<<<<<<<<<<<
+ *   args = context.service_url, context.method_name, callback,
+ *   plugin = <object>state
+ */
+          __pyx_cur_scope->__pyx_v_cb(__pyx_cur_scope->__pyx_v_user_data, NULL, 0, __pyx_v_status, __pyx_v_c_error_details);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":57
+ *       _release_c_metadata(c_metadata, metadata_count)
+ *     else:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         cb(user_data, NULL, 0, status, c_error_details)
+ *   args = context.service_url, context.method_name, callback,
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L10;
+          }
+          __pyx_L10:;
+        }
+    }
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":47
+ *   cdef size_t metadata_count
+ *   cdef grpc_metadata *c_metadata
+ *   def callback(metadata, grpc_status_code status, bytes error_details):             # <<<<<<<<<<<<<<
+ *     cdef char* c_error_details = NULL
+ *     if error_details is not None:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._get_metadata.callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":37
+ * 
+ * 
+ * cdef int _get_metadata(void *state,             # <<<<<<<<<<<<<<
+ *                        grpc_auth_metadata_context context,
+ *                        grpc_credentials_plugin_metadata_cb cb,
+ */
+
+static int __pyx_f_7_cython_6cygrpc__get_metadata(void *__pyx_v_state, grpc_auth_metadata_context __pyx_v_context, grpc_credentials_plugin_metadata_cb __pyx_v_cb, void *__pyx_v_user_data, CYTHON_UNUSED grpc_metadata *__pyx_v_creds_md, CYTHON_UNUSED size_t *__pyx_v_num_creds_md, CYTHON_UNUSED grpc_status_code *__pyx_v_status, CYTHON_UNUSED char const **__pyx_v_error_details) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata *__pyx_cur_scope;
+  PyObject *__pyx_v_callback = 0;
+  PyObject *__pyx_v_args = NULL;
+  PyObject *__pyx_v_plugin = 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;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_RefNannySetupContext("_get_metadata", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(5, 37, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_cb = __pyx_v_cb;
+  __pyx_cur_scope->__pyx_v_user_data = __pyx_v_user_data;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":47
+ *   cdef size_t metadata_count
+ *   cdef grpc_metadata *c_metadata
+ *   def callback(metadata, grpc_status_code status, bytes error_details):             # <<<<<<<<<<<<<<
+ *     cdef char* c_error_details = NULL
+ *     if error_details is not None:
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_13_get_metadata_1callback, 0, __pyx_n_s_get_metadata_locals_callback, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__22)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 47, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_callback = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":59
+ *       with nogil:
+ *         cb(user_data, NULL, 0, status, c_error_details)
+ *   args = context.service_url, context.method_name, callback,             # <<<<<<<<<<<<<<
+ *   plugin = <object>state
+ *   if plugin._stored_ctx is not None:
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_context.service_url); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_context.method_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(5, 59, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(5, 59, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_callback);
+  __Pyx_GIVEREF(__pyx_v_callback);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_callback)) __PYX_ERR(5, 59, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_v_args = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":60
+ *         cb(user_data, NULL, 0, status, c_error_details)
+ *   args = context.service_url, context.method_name, callback,
+ *   plugin = <object>state             # <<<<<<<<<<<<<<
+ *   if plugin._stored_ctx is not None:
+ *     plugin._stored_ctx.copy().run(_spawn_callback_async, plugin, args)
+ */
+  __pyx_t_3 = ((PyObject *)__pyx_v_state);
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_v_plugin = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":61
+ *   args = context.service_url, context.method_name, callback,
+ *   plugin = <object>state
+ *   if plugin._stored_ctx is not None:             # <<<<<<<<<<<<<<
+ *     plugin._stored_ctx.copy().run(_spawn_callback_async, plugin, args)
+ *   else:
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin, __pyx_n_s_stored_ctx); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 61, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = (__pyx_t_3 != Py_None);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (__pyx_t_4) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":62
+ *   plugin = <object>state
+ *   if plugin._stored_ctx is not None:
+ *     plugin._stored_ctx.copy().run(_spawn_callback_async, plugin, args)             # <<<<<<<<<<<<<<
+ *   else:
+ *     _spawn_callback_async(<object>state, args)
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin, __pyx_n_s_stored_ctx); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 62, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_copy); if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 62, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_5))) {
+      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
+      if (likely(__pyx_t_1)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+        __Pyx_INCREF(__pyx_t_1);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_5, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 62, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_run); if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 62, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_spawn_callback_async); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 62, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_5))) {
+      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
+      if (likely(__pyx_t_1)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+        __Pyx_INCREF(__pyx_t_1);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_5, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_1, __pyx_t_2, __pyx_v_plugin, __pyx_v_args};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 62, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":61
+ *   args = context.service_url, context.method_name, callback,
+ *   plugin = <object>state
+ *   if plugin._stored_ctx is not None:             # <<<<<<<<<<<<<<
+ *     plugin._stored_ctx.copy().run(_spawn_callback_async, plugin, args)
+ *   else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":64
+ *     plugin._stored_ctx.copy().run(_spawn_callback_async, plugin, args)
+ *   else:
+ *     _spawn_callback_async(<object>state, args)             # <<<<<<<<<<<<<<
+ *   return 0  # Asynchronous return
+ * 
+ */
+  /*else*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_spawn_callback_async); if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 64, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_2 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_5))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_5);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_5, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_2, ((PyObject *)__pyx_v_state), __pyx_v_args};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 64, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":65
+ *   else:
+ *     _spawn_callback_async(<object>state, args)
+ *   return 0  # Asynchronous return             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":37
+ * 
+ * 
+ * cdef int _get_metadata(void *state,             # <<<<<<<<<<<<<<
+ *                        grpc_auth_metadata_context context,
+ *                        grpc_credentials_plugin_metadata_cb cb,
+ */
+
+  /* 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("_cython.cygrpc._get_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_callback);
+  __Pyx_XDECREF(__pyx_v_args);
+  __Pyx_XDECREF(__pyx_v_plugin);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":68
+ * 
+ * 
+ * cdef void _destroy(void *state) except * with gil:             # <<<<<<<<<<<<<<
+ *   cpython.Py_DECREF(<object>state)
+ *   grpc_shutdown()
+ */
+
+static void __pyx_f_7_cython_6cygrpc__destroy(void *__pyx_v_state) {
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":69
+ * 
+ * cdef void _destroy(void *state) except * with gil:
+ *   cpython.Py_DECREF(<object>state)             # <<<<<<<<<<<<<<
+ *   grpc_shutdown()
+ * 
+ */
+  Py_DECREF(((PyObject *)__pyx_v_state));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":70
+ * cdef void _destroy(void *state) except * with gil:
+ *   cpython.Py_DECREF(<object>state)
+ *   grpc_shutdown()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  grpc_shutdown();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":68
+ * 
+ * 
+ * cdef void _destroy(void *state) except * with gil:             # <<<<<<<<<<<<<<
+ *   cpython.Py_DECREF(<object>state)
+ *   grpc_shutdown()
+ */
+
+  /* function exit code */
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":75
+ * cdef class MetadataPluginCallCredentials(CallCredentials):
+ * 
+ *   def __cinit__(self, metadata_plugin, name):             # <<<<<<<<<<<<<<
+ *     self._metadata_plugin = metadata_plugin
+ *     self._name = name
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_metadata_plugin = 0;
+  PyObject *__pyx_v_name = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_metadata_plugin,&__pyx_n_s_name,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata_plugin)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 75, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_name)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 75, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(5, 75, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 75, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_metadata_plugin = values[0];
+    __pyx_v_name = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(5, 75, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.MetadataPluginCallCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)__pyx_v_self), __pyx_v_metadata_plugin, __pyx_v_name);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self, PyObject *__pyx_v_metadata_plugin, PyObject *__pyx_v_name) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":76
+ * 
+ *   def __cinit__(self, metadata_plugin, name):
+ *     self._metadata_plugin = metadata_plugin             # <<<<<<<<<<<<<<
+ *     self._name = name
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_metadata_plugin);
+  __Pyx_GIVEREF(__pyx_v_metadata_plugin);
+  __Pyx_GOTREF(__pyx_v_self->_metadata_plugin);
+  __Pyx_DECREF(__pyx_v_self->_metadata_plugin);
+  __pyx_v_self->_metadata_plugin = __pyx_v_metadata_plugin;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":77
+ *   def __cinit__(self, metadata_plugin, name):
+ *     self._metadata_plugin = metadata_plugin
+ *     self._name = name             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:
+ */
+  if (!(likely(PyBytes_CheckExact(__pyx_v_name))||((__pyx_v_name) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_name))) __PYX_ERR(5, 77, __pyx_L1_error)
+  __pyx_t_1 = __pyx_v_name;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_name);
+  __Pyx_DECREF(__pyx_v_self->_name);
+  __pyx_v_self->_name = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":75
+ * cdef class MetadataPluginCallCredentials(CallCredentials):
+ * 
+ *   def __cinit__(self, metadata_plugin, name):             # <<<<<<<<<<<<<<
+ *     self._metadata_plugin = metadata_plugin
+ *     self._name = name
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.MetadataPluginCallCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":79
+ *     self._name = name
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef grpc_metadata_credentials_plugin c_metadata_plugin
+ *     c_metadata_plugin.get_metadata = _get_metadata
+ */
+
+static grpc_call_credentials *__pyx_f_7_cython_6cygrpc_29MetadataPluginCallCredentials_c(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self) {
+  grpc_metadata_credentials_plugin __pyx_v_c_metadata_plugin;
+  grpc_call_credentials *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  char const *__pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":81
+ *   cdef grpc_call_credentials *c(self) except *:
+ *     cdef grpc_metadata_credentials_plugin c_metadata_plugin
+ *     c_metadata_plugin.get_metadata = _get_metadata             # <<<<<<<<<<<<<<
+ *     c_metadata_plugin.destroy = _destroy
+ *     c_metadata_plugin.state = <void *>self._metadata_plugin
+ */
+  __pyx_v_c_metadata_plugin.get_metadata = __pyx_f_7_cython_6cygrpc__get_metadata;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":82
+ *     cdef grpc_metadata_credentials_plugin c_metadata_plugin
+ *     c_metadata_plugin.get_metadata = _get_metadata
+ *     c_metadata_plugin.destroy = _destroy             # <<<<<<<<<<<<<<
+ *     c_metadata_plugin.state = <void *>self._metadata_plugin
+ *     c_metadata_plugin.type = self._name
+ */
+  __pyx_v_c_metadata_plugin.destroy = __pyx_f_7_cython_6cygrpc__destroy;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":83
+ *     c_metadata_plugin.get_metadata = _get_metadata
+ *     c_metadata_plugin.destroy = _destroy
+ *     c_metadata_plugin.state = <void *>self._metadata_plugin             # <<<<<<<<<<<<<<
+ *     c_metadata_plugin.type = self._name
+ *     cpython.Py_INCREF(self._metadata_plugin)
+ */
+  __pyx_v_c_metadata_plugin.state = ((void *)__pyx_v_self->_metadata_plugin);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":84
+ *     c_metadata_plugin.destroy = _destroy
+ *     c_metadata_plugin.state = <void *>self._metadata_plugin
+ *     c_metadata_plugin.type = self._name             # <<<<<<<<<<<<<<
+ *     cpython.Py_INCREF(self._metadata_plugin)
+ *     fork_handlers_and_grpc_init()
+ */
+  if (unlikely(__pyx_v_self->_name == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+    __PYX_ERR(5, 84, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_PyBytes_AsString(__pyx_v_self->_name); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) __PYX_ERR(5, 84, __pyx_L1_error)
+  __pyx_v_c_metadata_plugin.type = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":85
+ *     c_metadata_plugin.state = <void *>self._metadata_plugin
+ *     c_metadata_plugin.type = self._name
+ *     cpython.Py_INCREF(self._metadata_plugin)             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     # TODO(yihuazhang): Expose min_security_level via the Python API so that
+ */
+  __pyx_t_2 = __pyx_v_self->_metadata_plugin;
+  __Pyx_INCREF(__pyx_t_2);
+  Py_INCREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":86
+ *     c_metadata_plugin.type = self._name
+ *     cpython.Py_INCREF(self._metadata_plugin)
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     # TODO(yihuazhang): Expose min_security_level via the Python API so that
+ *     # applications can decide what minimum security level their plugins require.
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 86, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 86, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":89
+ *     # TODO(yihuazhang): Expose min_security_level via the Python API so that
+ *     # applications can decide what minimum security level their plugins require.
+ *     return grpc_metadata_credentials_create_from_plugin(c_metadata_plugin, GRPC_PRIVACY_AND_INTEGRITY, NULL)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = grpc_metadata_credentials_create_from_plugin(__pyx_v_c_metadata_plugin, GRPC_PRIVACY_AND_INTEGRITY, NULL);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":79
+ *     self._name = name
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef grpc_metadata_credentials_plugin c_metadata_plugin
+ *     c_metadata_plugin.get_metadata = _get_metadata
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.MetadataPluginCallCredentials.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":36
+ * cdef class MetadataPluginCallCredentials(CallCredentials):
+ * 
+ *   cdef readonly object _metadata_plugin             # <<<<<<<<<<<<<<
+ *   cdef readonly bytes _name
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_16_metadata_plugin_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_16_metadata_plugin_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_16_metadata_plugin___get__(((struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_16_metadata_plugin___get__(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_metadata_plugin);
+  __pyx_r = __pyx_v_self->_metadata_plugin;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":37
+ * 
+ *   cdef readonly object _metadata_plugin
+ *   cdef readonly bytes _name             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call_credentials *c(self) except *
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_5_name_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_5_name_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_5_name___get__(((struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_5_name___get__(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_name);
+  __pyx_r = __pyx_v_self->_name;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29MetadataPluginCallCredentials_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.MetadataPluginCallCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29MetadataPluginCallCredentials_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.MetadataPluginCallCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29MetadataPluginCallCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.MetadataPluginCallCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":92
+ * 
+ * 
+ * cdef grpc_call_credentials *_composition(call_credentialses):             # <<<<<<<<<<<<<<
+ *   call_credentials_iterator = iter(call_credentialses)
+ *   cdef CallCredentials composition = next(call_credentials_iterator)
+ */
+
+static grpc_call_credentials *__pyx_f_7_cython_6cygrpc__composition(PyObject *__pyx_v_call_credentialses) {
+  PyObject *__pyx_v_call_credentials_iterator = NULL;
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_composition = 0;
+  grpc_call_credentials *__pyx_v_c_composition;
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_additional_call_credentials = 0;
+  grpc_call_credentials *__pyx_v_c_additional_call_credentials;
+  grpc_call_credentials *__pyx_v_c_next_composition;
+  grpc_call_credentials *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  grpc_call_credentials *__pyx_t_2;
+  Py_ssize_t __pyx_t_3;
+  PyObject *(*__pyx_t_4)(PyObject *);
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_composition", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":93
+ * 
+ * cdef grpc_call_credentials *_composition(call_credentialses):
+ *   call_credentials_iterator = iter(call_credentialses)             # <<<<<<<<<<<<<<
+ *   cdef CallCredentials composition = next(call_credentials_iterator)
+ *   cdef grpc_call_credentials *c_composition = composition.c()
+ */
+  __pyx_t_1 = PyObject_GetIter(__pyx_v_call_credentialses); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 93, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_call_credentials_iterator = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":94
+ * cdef grpc_call_credentials *_composition(call_credentialses):
+ *   call_credentials_iterator = iter(call_credentialses)
+ *   cdef CallCredentials composition = next(call_credentials_iterator)             # <<<<<<<<<<<<<<
+ *   cdef grpc_call_credentials *c_composition = composition.c()
+ *   cdef CallCredentials additional_call_credentials
+ */
+  __pyx_t_1 = __Pyx_PyIter_Next(__pyx_v_call_credentials_iterator); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 94, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7_cython_6cygrpc_CallCredentials))))) __PYX_ERR(5, 94, __pyx_L1_error)
+  __pyx_v_composition = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":95
+ *   call_credentials_iterator = iter(call_credentialses)
+ *   cdef CallCredentials composition = next(call_credentials_iterator)
+ *   cdef grpc_call_credentials *c_composition = composition.c()             # <<<<<<<<<<<<<<
+ *   cdef CallCredentials additional_call_credentials
+ *   cdef grpc_call_credentials *c_additional_call_credentials
+ */
+  __pyx_t_2 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials *)__pyx_v_composition->__pyx_vtab)->c(__pyx_v_composition); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 95, __pyx_L1_error)
+  __pyx_v_c_composition = __pyx_t_2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":99
+ *   cdef grpc_call_credentials *c_additional_call_credentials
+ *   cdef grpc_call_credentials *c_next_composition
+ *   for additional_call_credentials in call_credentials_iterator:             # <<<<<<<<<<<<<<
+ *     c_additional_call_credentials = additional_call_credentials.c()
+ *     c_next_composition = grpc_composite_call_credentials_create(
+ */
+  if (likely(PyList_CheckExact(__pyx_v_call_credentials_iterator)) || PyTuple_CheckExact(__pyx_v_call_credentials_iterator)) {
+    __pyx_t_1 = __pyx_v_call_credentials_iterator; __Pyx_INCREF(__pyx_t_1);
+    __pyx_t_3 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_call_credentials_iterator); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 99, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 99, __pyx_L1_error)
+  }
+  for (;;) {
+    if (likely(!__pyx_t_4)) {
+      if (likely(PyList_CheckExact(__pyx_t_1))) {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(5, 99, __pyx_L1_error)
+          #endif
+          if (__pyx_t_3 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(5, 99, __pyx_L1_error)
+        #else
+        __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 99, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_5);
+        #endif
+      } else {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(5, 99, __pyx_L1_error)
+          #endif
+          if (__pyx_t_3 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(5, 99, __pyx_L1_error)
+        #else
+        __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 99, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_5);
+        #endif
+      }
+    } else {
+      __pyx_t_5 = __pyx_t_4(__pyx_t_1);
+      if (unlikely(!__pyx_t_5)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else __PYX_ERR(5, 99, __pyx_L1_error)
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_5);
+    }
+    if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_7_cython_6cygrpc_CallCredentials))))) __PYX_ERR(5, 99, __pyx_L1_error)
+    __Pyx_XDECREF_SET(__pyx_v_additional_call_credentials, ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)__pyx_t_5));
+    __pyx_t_5 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":100
+ *   cdef grpc_call_credentials *c_next_composition
+ *   for additional_call_credentials in call_credentials_iterator:
+ *     c_additional_call_credentials = additional_call_credentials.c()             # <<<<<<<<<<<<<<
+ *     c_next_composition = grpc_composite_call_credentials_create(
+ *         c_composition, c_additional_call_credentials, NULL)
+ */
+    __pyx_t_2 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials *)__pyx_v_additional_call_credentials->__pyx_vtab)->c(__pyx_v_additional_call_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 100, __pyx_L1_error)
+    __pyx_v_c_additional_call_credentials = __pyx_t_2;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":101
+ *   for additional_call_credentials in call_credentials_iterator:
+ *     c_additional_call_credentials = additional_call_credentials.c()
+ *     c_next_composition = grpc_composite_call_credentials_create(             # <<<<<<<<<<<<<<
+ *         c_composition, c_additional_call_credentials, NULL)
+ *     grpc_call_credentials_release(c_composition)
+ */
+    __pyx_v_c_next_composition = grpc_composite_call_credentials_create(__pyx_v_c_composition, __pyx_v_c_additional_call_credentials, NULL);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":103
+ *     c_next_composition = grpc_composite_call_credentials_create(
+ *         c_composition, c_additional_call_credentials, NULL)
+ *     grpc_call_credentials_release(c_composition)             # <<<<<<<<<<<<<<
+ *     grpc_call_credentials_release(c_additional_call_credentials)
+ *     c_composition = c_next_composition
+ */
+    grpc_call_credentials_release(__pyx_v_c_composition);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":104
+ *         c_composition, c_additional_call_credentials, NULL)
+ *     grpc_call_credentials_release(c_composition)
+ *     grpc_call_credentials_release(c_additional_call_credentials)             # <<<<<<<<<<<<<<
+ *     c_composition = c_next_composition
+ *   return c_composition
+ */
+    grpc_call_credentials_release(__pyx_v_c_additional_call_credentials);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":105
+ *     grpc_call_credentials_release(c_composition)
+ *     grpc_call_credentials_release(c_additional_call_credentials)
+ *     c_composition = c_next_composition             # <<<<<<<<<<<<<<
+ *   return c_composition
+ * 
+ */
+    __pyx_v_c_composition = __pyx_v_c_next_composition;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":99
+ *   cdef grpc_call_credentials *c_additional_call_credentials
+ *   cdef grpc_call_credentials *c_next_composition
+ *   for additional_call_credentials in call_credentials_iterator:             # <<<<<<<<<<<<<<
+ *     c_additional_call_credentials = additional_call_credentials.c()
+ *     c_next_composition = grpc_composite_call_credentials_create(
+ */
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":106
+ *     grpc_call_credentials_release(c_additional_call_credentials)
+ *     c_composition = c_next_composition
+ *   return c_composition             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_c_composition;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":92
+ * 
+ * 
+ * cdef grpc_call_credentials *_composition(call_credentialses):             # <<<<<<<<<<<<<<
+ *   call_credentials_iterator = iter(call_credentialses)
+ *   cdef CallCredentials composition = next(call_credentials_iterator)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._composition", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_call_credentials_iterator);
+  __Pyx_XDECREF((PyObject *)__pyx_v_composition);
+  __Pyx_XDECREF((PyObject *)__pyx_v_additional_call_credentials);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":111
+ * cdef class CompositeCallCredentials(CallCredentials):
+ * 
+ *   def __cinit__(self, call_credentialses):             # <<<<<<<<<<<<<<
+ *     self._call_credentialses = call_credentialses
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_call_credentialses = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call_credentialses,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_credentialses)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 111, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 111, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_call_credentialses = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 111, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeCallCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *)__pyx_v_self), __pyx_v_call_credentialses);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self, PyObject *__pyx_v_call_credentialses) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":112
+ * 
+ *   def __cinit__(self, call_credentialses):
+ *     self._call_credentialses = call_credentialses             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_v_call_credentialses))||((__pyx_v_call_credentialses) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_call_credentialses))) __PYX_ERR(5, 112, __pyx_L1_error)
+  __pyx_t_1 = __pyx_v_call_credentialses;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_call_credentialses);
+  __Pyx_DECREF(__pyx_v_self->_call_credentialses);
+  __pyx_v_self->_call_credentialses = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":111
+ * cdef class CompositeCallCredentials(CallCredentials):
+ * 
+ *   def __cinit__(self, call_credentialses):             # <<<<<<<<<<<<<<
+ *     self._call_credentialses = call_credentialses
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeCallCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":114
+ *     self._call_credentialses = call_credentialses
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     return _composition(self._call_credentialses)
+ * 
+ */
+
+static grpc_call_credentials *__pyx_f_7_cython_6cygrpc_24CompositeCallCredentials_c(struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self) {
+  grpc_call_credentials *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  grpc_call_credentials *__pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":115
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:
+ *     return _composition(self._call_credentialses)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __pyx_v_self->_call_credentialses;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__composition(__pyx_t_1); if (unlikely(__pyx_t_2 == ((grpc_call_credentials *)NULL) && PyErr_Occurred())) __PYX_ERR(5, 115, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_r = __pyx_t_2;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":114
+ *     self._call_credentialses = call_credentialses
+ * 
+ *   cdef grpc_call_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     return _composition(self._call_credentialses)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeCallCredentials.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":47
+ * cdef class CompositeCallCredentials(CallCredentials):
+ * 
+ *   cdef readonly tuple _call_credentialses             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_call_credentials *c(self) except *
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_19_call_credentialses_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_19_call_credentialses_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_19_call_credentialses___get__(((struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_19_call_credentialses___get__(struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_call_credentialses);
+  __pyx_r = __pyx_v_self->_call_credentialses;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_24CompositeCallCredentials_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeCallCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_24CompositeCallCredentials_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeCallCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_24CompositeCallCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeCallCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":120
+ * cdef class ChannelCredentials:
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_18ChannelCredentials_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_self) {
+  grpc_channel_credentials *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":121
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ *     raise NotImplementedError()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_builtin_NotImplementedError); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 121, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __PYX_ERR(5, 121, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":120
+ * cdef class ChannelCredentials:
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ChannelCredentials.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18ChannelCredentials_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18ChannelCredentials_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18ChannelCredentials_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18ChannelCredentials_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18ChannelCredentials___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18ChannelCredentials___reduce_cython__(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_v_state = 0;
+  PyObject *__pyx_v__dict = 0;
+  int __pyx_v_use_setstate;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__reduce_cython__", 1);
+
+  /* "(tree fragment)":5
+ *     cdef object _dict
+ *     cdef bint use_setstate
+ *     state = ()             # <<<<<<<<<<<<<<
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ */
+  __Pyx_INCREF(__pyx_empty_tuple);
+  __pyx_v_state = __pyx_empty_tuple;
+
+  /* "(tree fragment)":6
+ *     cdef bint use_setstate
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)             # <<<<<<<<<<<<<<
+ *     if _dict is not None:
+ *         state += (_dict,)
+ */
+  __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v__dict = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":7
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+  __pyx_t_2 = (__pyx_v__dict != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":8
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ *         state += (_dict,)             # <<<<<<<<<<<<<<
+ *         use_setstate = True
+ *     else:
+ */
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_v__dict);
+    __Pyx_GIVEREF(__pyx_v__dict);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(10, 8, __pyx_L1_error);
+    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3));
+    __pyx_t_3 = 0;
+
+    /* "(tree fragment)":9
+ *     if _dict is not None:
+ *         state += (_dict,)
+ *         use_setstate = True             # <<<<<<<<<<<<<<
+ *     else:
+ *         use_setstate = False
+ */
+    __pyx_v_use_setstate = 1;
+
+    /* "(tree fragment)":7
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+    goto __pyx_L3;
+  }
+
+  /* "(tree fragment)":11
+ *         use_setstate = True
+ *     else:
+ *         use_setstate = False             # <<<<<<<<<<<<<<
+ *     if use_setstate:
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, None), state
+ */
+  /*else*/ {
+    __pyx_v_use_setstate = 0;
+  }
+  __pyx_L3:;
+
+  /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = False
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, None), state
+ *     else:
+ */
+  if (__pyx_v_use_setstate) {
+
+    /* "(tree fragment)":13
+ *         use_setstate = False
+ *     if use_setstate:
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, None), state             # <<<<<<<<<<<<<<
+ *     else:
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, state)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_ChannelCredential); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_238750788);
+    __Pyx_GIVEREF(__pyx_int_238750788);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_238750788)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_3);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_3 = 0;
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_4;
+    __pyx_t_4 = 0;
+    goto __pyx_L0;
+
+    /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = False
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, None), state
+ *     else:
+ */
+  }
+
+  /* "(tree fragment)":15
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, None), state
+ *     else:
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, state)             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle_ChannelCredentials__set_state(self, __pyx_state)
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_ChannelCredential); if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_238750788);
+    __Pyx_GIVEREF(__pyx_int_238750788);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_238750788)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_4);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_4 = 0;
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_3;
+    __pyx_t_3 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.ChannelCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_state);
+  __Pyx_XDECREF(__pyx_v__dict);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_ChannelCredentials__set_state(self, __pyx_state)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18ChannelCredentials_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18ChannelCredentials_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18ChannelCredentials_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18ChannelCredentials_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 16, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 16, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 16, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18ChannelCredentials_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18ChannelCredentials_2__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+  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("__setstate_cython__", 1);
+
+  /* "(tree fragment)":17
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle_ChannelCredentials__set_state(self, __pyx_state)             # <<<<<<<<<<<<<<
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 17, __pyx_L1_error)
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle_ChannelCredentials__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_ChannelCredentials__set_state(self, __pyx_state)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":126
+ * cdef class SSLSessionCacheLRU:
+ * 
+ *   def __cinit__(self, capacity):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self._cache = grpc_ssl_session_cache_create_lru(capacity)
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_capacity = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_capacity,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_capacity)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 126, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 126, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_capacity = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 126, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SSLSessionCacheLRU.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU___cinit__(((struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *)__pyx_v_self), __pyx_v_capacity);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU___cinit__(struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self, PyObject *__pyx_v_capacity) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  size_t __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":127
+ * 
+ *   def __cinit__(self, capacity):
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     self._cache = grpc_ssl_session_cache_create_lru(capacity)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 127, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 127, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":128
+ *   def __cinit__(self, capacity):
+ *     fork_handlers_and_grpc_init()
+ *     self._cache = grpc_ssl_session_cache_create_lru(capacity)             # <<<<<<<<<<<<<<
+ * 
+ *   def __int__(self):
+ */
+  __pyx_t_5 = __Pyx_PyInt_As_size_t(__pyx_v_capacity); if (unlikely((__pyx_t_5 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(5, 128, __pyx_L1_error)
+  __pyx_v_self->_cache = grpc_ssl_session_cache_create_lru(__pyx_t_5);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":126
+ * cdef class SSLSessionCacheLRU:
+ * 
+ *   def __cinit__(self, capacity):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self._cache = grpc_ssl_session_cache_create_lru(capacity)
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.SSLSessionCacheLRU.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":130
+ *     self._cache = grpc_ssl_session_cache_create_lru(capacity)
+ * 
+ *   def __int__(self):             # <<<<<<<<<<<<<<
+ *     return <uintptr_t>self._cache
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_3__int__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_3__int__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__int__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_2__int__(((struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_2__int__(struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__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("__int__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":131
+ * 
+ *   def __int__(self):
+ *     return <uintptr_t>self._cache             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_FromSize_t(((__pyx_t_7_cython_6cygrpc_uintptr_t)__pyx_v_self->_cache)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 131, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":130
+ *     self._cache = grpc_ssl_session_cache_create_lru(capacity)
+ * 
+ *   def __int__(self):             # <<<<<<<<<<<<<<
+ *     return <uintptr_t>self._cache
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SSLSessionCacheLRU.__int__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":133
+ *     return <uintptr_t>self._cache
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self._cache != NULL:
+ *         grpc_ssl_session_cache_destroy(self._cache)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_5__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_5__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_4__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_4__dealloc__(struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":134
+ * 
+ *   def __dealloc__(self):
+ *     if self._cache != NULL:             # <<<<<<<<<<<<<<
+ *         grpc_ssl_session_cache_destroy(self._cache)
+ *     grpc_shutdown()
+ */
+  __pyx_t_1 = (__pyx_v_self->_cache != NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":135
+ *   def __dealloc__(self):
+ *     if self._cache != NULL:
+ *         grpc_ssl_session_cache_destroy(self._cache)             # <<<<<<<<<<<<<<
+ *     grpc_shutdown()
+ * 
+ */
+    grpc_ssl_session_cache_destroy(__pyx_v_self->_cache);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":134
+ * 
+ *   def __dealloc__(self):
+ *     if self._cache != NULL:             # <<<<<<<<<<<<<<
+ *         grpc_ssl_session_cache_destroy(self._cache)
+ *     grpc_shutdown()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":136
+ *     if self._cache != NULL:
+ *         grpc_ssl_session_cache_destroy(self._cache)
+ *     grpc_shutdown()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  grpc_shutdown();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":133
+ *     return <uintptr_t>self._cache
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self._cache != NULL:
+ *         grpc_ssl_session_cache_destroy(self._cache)
+ */
+
+  /* function exit code */
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18SSLSessionCacheLRU_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_6__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SSLSessionCacheLRU.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18SSLSessionCacheLRU_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SSLSessionCacheLRU.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_8__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18SSLSessionCacheLRU_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SSLSessionCacheLRU.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":141
+ * cdef class SSLChannelCredentials(ChannelCredentials):
+ * 
+ *   def __cinit__(self, pem_root_certificates, private_key, certificate_chain):             # <<<<<<<<<<<<<<
+ *     if pem_root_certificates is not None and not isinstance(pem_root_certificates, bytes):
+ *       raise TypeError('expected certificate to be bytes, got %s' % (type(pem_root_certificates)))
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_pem_root_certificates = 0;
+  PyObject *__pyx_v_private_key = 0;
+  PyObject *__pyx_v_certificate_chain = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pem_root_certificates,&__pyx_n_s_private_key,&__pyx_n_s_certificate_chain,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pem_root_certificates)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 141, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_private_key)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 141, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(5, 141, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_certificate_chain)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 141, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(5, 141, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 141, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+    }
+    __pyx_v_pem_root_certificates = values[0];
+    __pyx_v_private_key = values[1];
+    __pyx_v_certificate_chain = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(5, 141, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SSLChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)__pyx_v_self), __pyx_v_pem_root_certificates, __pyx_v_private_key, __pyx_v_certificate_chain);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self, PyObject *__pyx_v_pem_root_certificates, PyObject *__pyx_v_private_key, PyObject *__pyx_v_certificate_chain) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":142
+ * 
+ *   def __cinit__(self, pem_root_certificates, private_key, certificate_chain):
+ *     if pem_root_certificates is not None and not isinstance(pem_root_certificates, bytes):             # <<<<<<<<<<<<<<
+ *       raise TypeError('expected certificate to be bytes, got %s' % (type(pem_root_certificates)))
+ *     self._pem_root_certificates = pem_root_certificates
+ */
+  __pyx_t_2 = (__pyx_v_pem_root_certificates != Py_None);
+  if (__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_2 = PyBytes_Check(__pyx_v_pem_root_certificates); 
+  __pyx_t_3 = (!__pyx_t_2);
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_L4_bool_binop_done:;
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":143
+ *   def __cinit__(self, pem_root_certificates, private_key, certificate_chain):
+ *     if pem_root_certificates is not None and not isinstance(pem_root_certificates, bytes):
+ *       raise TypeError('expected certificate to be bytes, got %s' % (type(pem_root_certificates)))             # <<<<<<<<<<<<<<
+ *     self._pem_root_certificates = pem_root_certificates
+ *     self._private_key = private_key
+ */
+    __pyx_t_4 = __Pyx_PyString_FormatSafe(__pyx_kp_s_expected_certificate_to_be_bytes, ((PyObject *)Py_TYPE(__pyx_v_pem_root_certificates))); if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 143, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 143, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __PYX_ERR(5, 143, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":142
+ * 
+ *   def __cinit__(self, pem_root_certificates, private_key, certificate_chain):
+ *     if pem_root_certificates is not None and not isinstance(pem_root_certificates, bytes):             # <<<<<<<<<<<<<<
+ *       raise TypeError('expected certificate to be bytes, got %s' % (type(pem_root_certificates)))
+ *     self._pem_root_certificates = pem_root_certificates
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":144
+ *     if pem_root_certificates is not None and not isinstance(pem_root_certificates, bytes):
+ *       raise TypeError('expected certificate to be bytes, got %s' % (type(pem_root_certificates)))
+ *     self._pem_root_certificates = pem_root_certificates             # <<<<<<<<<<<<<<
+ *     self._private_key = private_key
+ *     self._certificate_chain = certificate_chain
+ */
+  __Pyx_INCREF(__pyx_v_pem_root_certificates);
+  __Pyx_GIVEREF(__pyx_v_pem_root_certificates);
+  __Pyx_GOTREF(__pyx_v_self->_pem_root_certificates);
+  __Pyx_DECREF(__pyx_v_self->_pem_root_certificates);
+  __pyx_v_self->_pem_root_certificates = __pyx_v_pem_root_certificates;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":145
+ *       raise TypeError('expected certificate to be bytes, got %s' % (type(pem_root_certificates)))
+ *     self._pem_root_certificates = pem_root_certificates
+ *     self._private_key = private_key             # <<<<<<<<<<<<<<
+ *     self._certificate_chain = certificate_chain
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_private_key);
+  __Pyx_GIVEREF(__pyx_v_private_key);
+  __Pyx_GOTREF(__pyx_v_self->_private_key);
+  __Pyx_DECREF(__pyx_v_self->_private_key);
+  __pyx_v_self->_private_key = __pyx_v_private_key;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":146
+ *     self._pem_root_certificates = pem_root_certificates
+ *     self._private_key = private_key
+ *     self._certificate_chain = certificate_chain             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+  __Pyx_INCREF(__pyx_v_certificate_chain);
+  __Pyx_GIVEREF(__pyx_v_certificate_chain);
+  __Pyx_GOTREF(__pyx_v_self->_certificate_chain);
+  __Pyx_DECREF(__pyx_v_self->_certificate_chain);
+  __pyx_v_self->_certificate_chain = __pyx_v_certificate_chain;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":141
+ * cdef class SSLChannelCredentials(ChannelCredentials):
+ * 
+ *   def __cinit__(self, pem_root_certificates, private_key, certificate_chain):             # <<<<<<<<<<<<<<
+ *     if pem_root_certificates is not None and not isinstance(pem_root_certificates, bytes):
+ *       raise TypeError('expected certificate to be bytes, got %s' % (type(pem_root_certificates)))
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc.SSLChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":148
+ *     self._certificate_chain = certificate_chain
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef const char *c_pem_root_certificates
+ *     cdef grpc_ssl_pem_key_cert_pair c_pem_key_certificate_pair
+ */
+
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_21SSLChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self) {
+  char const *__pyx_v_c_pem_root_certificates;
+  grpc_ssl_pem_key_cert_pair __pyx_v_c_pem_key_certificate_pair;
+  grpc_channel_credentials *__pyx_r;
+  int __pyx_t_1;
+  char const *__pyx_t_2;
+  int __pyx_t_3;
+  char const *__pyx_t_4;
+  char const *__pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":151
+ *     cdef const char *c_pem_root_certificates
+ *     cdef grpc_ssl_pem_key_cert_pair c_pem_key_certificate_pair
+ *     if self._pem_root_certificates is None:             # <<<<<<<<<<<<<<
+ *       c_pem_root_certificates = NULL
+ *     else:
+ */
+  __pyx_t_1 = (__pyx_v_self->_pem_root_certificates == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":152
+ *     cdef grpc_ssl_pem_key_cert_pair c_pem_key_certificate_pair
+ *     if self._pem_root_certificates is None:
+ *       c_pem_root_certificates = NULL             # <<<<<<<<<<<<<<
+ *     else:
+ *       c_pem_root_certificates = self._pem_root_certificates
+ */
+    __pyx_v_c_pem_root_certificates = NULL;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":151
+ *     cdef const char *c_pem_root_certificates
+ *     cdef grpc_ssl_pem_key_cert_pair c_pem_key_certificate_pair
+ *     if self._pem_root_certificates is None:             # <<<<<<<<<<<<<<
+ *       c_pem_root_certificates = NULL
+ *     else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":154
+ *       c_pem_root_certificates = NULL
+ *     else:
+ *       c_pem_root_certificates = self._pem_root_certificates             # <<<<<<<<<<<<<<
+ *     if self._private_key is None and self._certificate_chain is None:
+ *       with nogil:
+ */
+  /*else*/ {
+    __pyx_t_2 = __Pyx_PyObject_AsString(__pyx_v_self->_pem_root_certificates); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) __PYX_ERR(5, 154, __pyx_L1_error)
+    __pyx_v_c_pem_root_certificates = __pyx_t_2;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":155
+ *     else:
+ *       c_pem_root_certificates = self._pem_root_certificates
+ *     if self._private_key is None and self._certificate_chain is None:             # <<<<<<<<<<<<<<
+ *       with nogil:
+ *         return grpc_ssl_credentials_create(
+ */
+  __pyx_t_3 = (__pyx_v_self->_private_key == Py_None);
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_1 = __pyx_t_3;
+    goto __pyx_L5_bool_binop_done;
+  }
+  __pyx_t_3 = (__pyx_v_self->_certificate_chain == Py_None);
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_L5_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":156
+ *       c_pem_root_certificates = self._pem_root_certificates
+ *     if self._private_key is None and self._certificate_chain is None:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         return grpc_ssl_credentials_create(
+ *             c_pem_root_certificates, NULL, NULL, NULL)
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":157
+ *     if self._private_key is None and self._certificate_chain is None:
+ *       with nogil:
+ *         return grpc_ssl_credentials_create(             # <<<<<<<<<<<<<<
+ *             c_pem_root_certificates, NULL, NULL, NULL)
+ *     else:
+ */
+          __pyx_r = grpc_ssl_credentials_create(__pyx_v_c_pem_root_certificates, NULL, NULL, NULL);
+          goto __pyx_L7_return;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":156
+ *       c_pem_root_certificates = self._pem_root_certificates
+ *     if self._private_key is None and self._certificate_chain is None:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         return grpc_ssl_credentials_create(
+ *             c_pem_root_certificates, NULL, NULL, NULL)
+ */
+        /*finally:*/ {
+          __pyx_L7_return: {
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L0;
+          }
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":155
+ *     else:
+ *       c_pem_root_certificates = self._pem_root_certificates
+ *     if self._private_key is None and self._certificate_chain is None:             # <<<<<<<<<<<<<<
+ *       with nogil:
+ *         return grpc_ssl_credentials_create(
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":160
+ *             c_pem_root_certificates, NULL, NULL, NULL)
+ *     else:
+ *       if self._private_key:             # <<<<<<<<<<<<<<
+ *         c_pem_key_certificate_pair.private_key = self._private_key
+ *       else:
+ */
+  /*else*/ {
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->_private_key); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(5, 160, __pyx_L1_error)
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":161
+ *     else:
+ *       if self._private_key:
+ *         c_pem_key_certificate_pair.private_key = self._private_key             # <<<<<<<<<<<<<<
+ *       else:
+ *         c_pem_key_certificate_pair.private_key = NULL
+ */
+      __pyx_t_4 = __Pyx_PyObject_AsString(__pyx_v_self->_private_key); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) __PYX_ERR(5, 161, __pyx_L1_error)
+      __pyx_v_c_pem_key_certificate_pair.private_key = __pyx_t_4;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":160
+ *             c_pem_root_certificates, NULL, NULL, NULL)
+ *     else:
+ *       if self._private_key:             # <<<<<<<<<<<<<<
+ *         c_pem_key_certificate_pair.private_key = self._private_key
+ *       else:
+ */
+      goto __pyx_L10;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":163
+ *         c_pem_key_certificate_pair.private_key = self._private_key
+ *       else:
+ *         c_pem_key_certificate_pair.private_key = NULL             # <<<<<<<<<<<<<<
+ *       if self._certificate_chain:
+ *         c_pem_key_certificate_pair.certificate_chain = self._certificate_chain
+ */
+    /*else*/ {
+      __pyx_v_c_pem_key_certificate_pair.private_key = NULL;
+    }
+    __pyx_L10:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":164
+ *       else:
+ *         c_pem_key_certificate_pair.private_key = NULL
+ *       if self._certificate_chain:             # <<<<<<<<<<<<<<
+ *         c_pem_key_certificate_pair.certificate_chain = self._certificate_chain
+ *       else:
+ */
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->_certificate_chain); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(5, 164, __pyx_L1_error)
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":165
+ *         c_pem_key_certificate_pair.private_key = NULL
+ *       if self._certificate_chain:
+ *         c_pem_key_certificate_pair.certificate_chain = self._certificate_chain             # <<<<<<<<<<<<<<
+ *       else:
+ *         c_pem_key_certificate_pair.certificate_chain = NULL
+ */
+      __pyx_t_5 = __Pyx_PyObject_AsString(__pyx_v_self->_certificate_chain); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) __PYX_ERR(5, 165, __pyx_L1_error)
+      __pyx_v_c_pem_key_certificate_pair.cert_chain = __pyx_t_5;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":164
+ *       else:
+ *         c_pem_key_certificate_pair.private_key = NULL
+ *       if self._certificate_chain:             # <<<<<<<<<<<<<<
+ *         c_pem_key_certificate_pair.certificate_chain = self._certificate_chain
+ *       else:
+ */
+      goto __pyx_L11;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":167
+ *         c_pem_key_certificate_pair.certificate_chain = self._certificate_chain
+ *       else:
+ *         c_pem_key_certificate_pair.certificate_chain = NULL             # <<<<<<<<<<<<<<
+ *       with nogil:
+ *         return grpc_ssl_credentials_create(
+ */
+    /*else*/ {
+      __pyx_v_c_pem_key_certificate_pair.cert_chain = NULL;
+    }
+    __pyx_L11:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":168
+ *       else:
+ *         c_pem_key_certificate_pair.certificate_chain = NULL
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         return grpc_ssl_credentials_create(
+ *             c_pem_root_certificates, &c_pem_key_certificate_pair, NULL, NULL)
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":169
+ *         c_pem_key_certificate_pair.certificate_chain = NULL
+ *       with nogil:
+ *         return grpc_ssl_credentials_create(             # <<<<<<<<<<<<<<
+ *             c_pem_root_certificates, &c_pem_key_certificate_pair, NULL, NULL)
+ * 
+ */
+          __pyx_r = grpc_ssl_credentials_create(__pyx_v_c_pem_root_certificates, (&__pyx_v_c_pem_key_certificate_pair), NULL, NULL);
+          goto __pyx_L12_return;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":168
+ *       else:
+ *         c_pem_key_certificate_pair.certificate_chain = NULL
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         return grpc_ssl_credentials_create(
+ *             c_pem_root_certificates, &c_pem_key_certificate_pair, NULL, NULL)
+ */
+        /*finally:*/ {
+          __pyx_L12_return: {
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L0;
+          }
+        }
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":148
+ *     self._certificate_chain = certificate_chain
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef const char *c_pem_root_certificates
+ *     cdef grpc_ssl_pem_key_cert_pair c_pem_key_certificate_pair
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SSLChannelCredentials.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":64
+ * cdef class SSLChannelCredentials(ChannelCredentials):
+ * 
+ *   cdef readonly object _pem_root_certificates             # <<<<<<<<<<<<<<
+ *   cdef readonly object _private_key
+ *   cdef readonly object _certificate_chain
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_22_pem_root_certificates_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_22_pem_root_certificates_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_22_pem_root_certificates___get__(((struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_22_pem_root_certificates___get__(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_pem_root_certificates);
+  __pyx_r = __pyx_v_self->_pem_root_certificates;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":65
+ * 
+ *   cdef readonly object _pem_root_certificates
+ *   cdef readonly object _private_key             # <<<<<<<<<<<<<<
+ *   cdef readonly object _certificate_chain
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_12_private_key_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_12_private_key_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_12_private_key___get__(((struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_12_private_key___get__(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_private_key);
+  __pyx_r = __pyx_v_self->_private_key;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":66
+ *   cdef readonly object _pem_root_certificates
+ *   cdef readonly object _private_key
+ *   cdef readonly object _certificate_chain             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_18_certificate_chain_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_18_certificate_chain_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_18_certificate_chain___get__(((struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_18_certificate_chain___get__(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_certificate_chain);
+  __pyx_r = __pyx_v_self->_certificate_chain;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21SSLChannelCredentials_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SSLChannelCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21SSLChannelCredentials_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SSLChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21SSLChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SSLChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":175
+ * cdef class CompositeChannelCredentials(ChannelCredentials):
+ * 
+ *   def __cinit__(self, call_credentialses, channel_credentials):             # <<<<<<<<<<<<<<
+ *     self._call_credentialses = call_credentialses
+ *     self._channel_credentials = channel_credentials
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_call_credentialses = 0;
+  PyObject *__pyx_v_channel_credentials = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call_credentialses,&__pyx_n_s_channel_credentials,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_credentialses)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 175, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 175, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(5, 175, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 175, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_call_credentialses = values[0];
+    __pyx_v_channel_credentials = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(5, 175, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)__pyx_v_self), __pyx_v_call_credentialses, __pyx_v_channel_credentials);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self, PyObject *__pyx_v_call_credentialses, PyObject *__pyx_v_channel_credentials) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":176
+ * 
+ *   def __cinit__(self, call_credentialses, channel_credentials):
+ *     self._call_credentialses = call_credentialses             # <<<<<<<<<<<<<<
+ *     self._channel_credentials = channel_credentials
+ * 
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_v_call_credentialses))||((__pyx_v_call_credentialses) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v_call_credentialses))) __PYX_ERR(5, 176, __pyx_L1_error)
+  __pyx_t_1 = __pyx_v_call_credentialses;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_call_credentialses);
+  __Pyx_DECREF(__pyx_v_self->_call_credentialses);
+  __pyx_v_self->_call_credentialses = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":177
+ *   def __cinit__(self, call_credentialses, channel_credentials):
+ *     self._call_credentialses = call_credentialses
+ *     self._channel_credentials = channel_credentials             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+  if (!(likely(((__pyx_v_channel_credentials) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_channel_credentials, __pyx_ptype_7_cython_6cygrpc_ChannelCredentials))))) __PYX_ERR(5, 177, __pyx_L1_error)
+  __pyx_t_1 = __pyx_v_channel_credentials;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_channel_credentials);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_channel_credentials);
+  __pyx_v_self->_channel_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":175
+ * cdef class CompositeChannelCredentials(ChannelCredentials):
+ * 
+ *   def __cinit__(self, call_credentialses, channel_credentials):             # <<<<<<<<<<<<<<
+ *     self._call_credentialses = call_credentialses
+ *     self._channel_credentials = channel_credentials
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":179
+ *     self._channel_credentials = channel_credentials
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef grpc_channel_credentials *c_channel_credentials
+ *     c_channel_credentials = self._channel_credentials.c()
+ */
+
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_27CompositeChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self) {
+  grpc_channel_credentials *__pyx_v_c_channel_credentials;
+  grpc_call_credentials *__pyx_v_c_call_credentials_composition;
+  grpc_channel_credentials *__pyx_v_c_composition;
+  grpc_channel_credentials *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  grpc_channel_credentials *__pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  grpc_call_credentials *__pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":181
+ *   cdef grpc_channel_credentials *c(self) except *:
+ *     cdef grpc_channel_credentials *c_channel_credentials
+ *     c_channel_credentials = self._channel_credentials.c()             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_credentials *c_call_credentials_composition = _composition(
+ *         self._call_credentialses)
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials *)__pyx_v_self->_channel_credentials->__pyx_vtab)->c(__pyx_v_self->_channel_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 181, __pyx_L1_error)
+  __pyx_v_c_channel_credentials = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":183
+ *     c_channel_credentials = self._channel_credentials.c()
+ *     cdef grpc_call_credentials *c_call_credentials_composition = _composition(
+ *         self._call_credentialses)             # <<<<<<<<<<<<<<
+ *     cdef grpc_channel_credentials *composition
+ *     c_composition = grpc_composite_channel_credentials_create(
+ */
+  __pyx_t_2 = __pyx_v_self->_call_credentialses;
+  __Pyx_INCREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":182
+ *     cdef grpc_channel_credentials *c_channel_credentials
+ *     c_channel_credentials = self._channel_credentials.c()
+ *     cdef grpc_call_credentials *c_call_credentials_composition = _composition(             # <<<<<<<<<<<<<<
+ *         self._call_credentialses)
+ *     cdef grpc_channel_credentials *composition
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc__composition(__pyx_t_2); if (unlikely(__pyx_t_3 == ((grpc_call_credentials *)NULL) && PyErr_Occurred())) __PYX_ERR(5, 182, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_c_call_credentials_composition = __pyx_t_3;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":185
+ *         self._call_credentialses)
+ *     cdef grpc_channel_credentials *composition
+ *     c_composition = grpc_composite_channel_credentials_create(             # <<<<<<<<<<<<<<
+ *         c_channel_credentials, c_call_credentials_composition, NULL)
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ */
+  __pyx_v_c_composition = grpc_composite_channel_credentials_create(__pyx_v_c_channel_credentials, __pyx_v_c_call_credentials_composition, NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":187
+ *     c_composition = grpc_composite_channel_credentials_create(
+ *         c_channel_credentials, c_call_credentials_composition, NULL)
+ *     grpc_channel_credentials_release(c_channel_credentials)             # <<<<<<<<<<<<<<
+ *     grpc_call_credentials_release(c_call_credentials_composition)
+ *     return c_composition
+ */
+  grpc_channel_credentials_release(__pyx_v_c_channel_credentials);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":188
+ *         c_channel_credentials, c_call_credentials_composition, NULL)
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ *     grpc_call_credentials_release(c_call_credentials_composition)             # <<<<<<<<<<<<<<
+ *     return c_composition
+ * 
+ */
+  grpc_call_credentials_release(__pyx_v_c_call_credentials_composition);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":189
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ *     grpc_call_credentials_release(c_call_credentials_composition)
+ *     return c_composition             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_c_composition;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":179
+ *     self._channel_credentials = channel_credentials
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef grpc_channel_credentials *c_channel_credentials
+ *     c_channel_credentials = self._channel_credentials.c()
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeChannelCredentials.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":73
+ * cdef class CompositeChannelCredentials(ChannelCredentials):
+ * 
+ *   cdef readonly tuple _call_credentialses             # <<<<<<<<<<<<<<
+ *   cdef readonly ChannelCredentials _channel_credentials
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_19_call_credentialses_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_19_call_credentialses_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_19_call_credentialses___get__(((struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_19_call_credentialses___get__(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_call_credentialses);
+  __pyx_r = __pyx_v_self->_call_credentialses;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":74
+ * 
+ *   cdef readonly tuple _call_credentialses
+ *   cdef readonly ChannelCredentials _channel_credentials             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_20_channel_credentials_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_20_channel_credentials_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_20_channel_credentials___get__(((struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_20_channel_credentials___get__(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->_channel_credentials);
+  __pyx_r = ((PyObject *)__pyx_v_self->_channel_credentials);
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_27CompositeChannelCredentials_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeChannelCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_27CompositeChannelCredentials_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_27CompositeChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CompositeChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":194
+ * cdef class XDSChannelCredentials(ChannelCredentials):
+ * 
+ *     def __cinit__(self, fallback_credentials):             # <<<<<<<<<<<<<<
+ *         self._fallback_credentials = fallback_credentials
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_fallback_credentials = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fallback_credentials,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fallback_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 194, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 194, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_fallback_credentials = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 194, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.XDSChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *)__pyx_v_self), __pyx_v_fallback_credentials);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self, PyObject *__pyx_v_fallback_credentials) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":195
+ * 
+ *     def __cinit__(self, fallback_credentials):
+ *         self._fallback_credentials = fallback_credentials             # <<<<<<<<<<<<<<
+ * 
+ *     cdef grpc_channel_credentials *c(self) except *:
+ */
+  if (!(likely(((__pyx_v_fallback_credentials) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_fallback_credentials, __pyx_ptype_7_cython_6cygrpc_ChannelCredentials))))) __PYX_ERR(5, 195, __pyx_L1_error)
+  __pyx_t_1 = __pyx_v_fallback_credentials;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_fallback_credentials);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_fallback_credentials);
+  __pyx_v_self->_fallback_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":194
+ * cdef class XDSChannelCredentials(ChannelCredentials):
+ * 
+ *     def __cinit__(self, fallback_credentials):             # <<<<<<<<<<<<<<
+ *         self._fallback_credentials = fallback_credentials
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.XDSChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":197
+ *         self._fallback_credentials = fallback_credentials
+ * 
+ *     cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *       cdef grpc_channel_credentials *c_fallback_creds = self._fallback_credentials.c()
+ *       cdef grpc_channel_credentials *xds_creds = grpc_xds_credentials_create(c_fallback_creds)
+ */
+
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_21XDSChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self) {
+  grpc_channel_credentials *__pyx_v_c_fallback_creds;
+  grpc_channel_credentials *__pyx_v_xds_creds;
+  grpc_channel_credentials *__pyx_r;
+  grpc_channel_credentials *__pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":198
+ * 
+ *     cdef grpc_channel_credentials *c(self) except *:
+ *       cdef grpc_channel_credentials *c_fallback_creds = self._fallback_credentials.c()             # <<<<<<<<<<<<<<
+ *       cdef grpc_channel_credentials *xds_creds = grpc_xds_credentials_create(c_fallback_creds)
+ *       grpc_channel_credentials_release(c_fallback_creds)
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials *)__pyx_v_self->_fallback_credentials->__pyx_vtab)->c(__pyx_v_self->_fallback_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 198, __pyx_L1_error)
+  __pyx_v_c_fallback_creds = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":199
+ *     cdef grpc_channel_credentials *c(self) except *:
+ *       cdef grpc_channel_credentials *c_fallback_creds = self._fallback_credentials.c()
+ *       cdef grpc_channel_credentials *xds_creds = grpc_xds_credentials_create(c_fallback_creds)             # <<<<<<<<<<<<<<
+ *       grpc_channel_credentials_release(c_fallback_creds)
+ *       return xds_creds
+ */
+  __pyx_v_xds_creds = grpc_xds_credentials_create(__pyx_v_c_fallback_creds);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":200
+ *       cdef grpc_channel_credentials *c_fallback_creds = self._fallback_credentials.c()
+ *       cdef grpc_channel_credentials *xds_creds = grpc_xds_credentials_create(c_fallback_creds)
+ *       grpc_channel_credentials_release(c_fallback_creds)             # <<<<<<<<<<<<<<
+ *       return xds_creds
+ * 
+ */
+  grpc_channel_credentials_release(__pyx_v_c_fallback_creds);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":201
+ *       cdef grpc_channel_credentials *xds_creds = grpc_xds_credentials_create(c_fallback_creds)
+ *       grpc_channel_credentials_release(c_fallback_creds)
+ *       return xds_creds             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_xds_creds;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":197
+ *         self._fallback_credentials = fallback_credentials
+ * 
+ *     cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *       cdef grpc_channel_credentials *c_fallback_creds = self._fallback_credentials.c()
+ *       cdef grpc_channel_credentials *xds_creds = grpc_xds_credentials_create(c_fallback_creds)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.XDSChannelCredentials.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi":81
+ * cdef class XDSChannelCredentials(ChannelCredentials):
+ * 
+ *   cdef readonly ChannelCredentials _fallback_credentials             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_21_fallback_credentials_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_21_fallback_credentials_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_21_fallback_credentials___get__(((struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_21_fallback_credentials___get__(struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->_fallback_credentials);
+  __pyx_r = ((PyObject *)__pyx_v_self->_fallback_credentials);
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21XDSChannelCredentials_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.XDSChannelCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21XDSChannelCredentials_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.XDSChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21XDSChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.XDSChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":206
+ * cdef class ServerCertificateConfig:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self.c_cert_config = NULL
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig___cinit__(struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":207
+ * 
+ *   def __cinit__(self):
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     self.c_cert_config = NULL
+ *     self.c_pem_root_certs = NULL
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 207, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 207, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":208
+ *   def __cinit__(self):
+ *     fork_handlers_and_grpc_init()
+ *     self.c_cert_config = NULL             # <<<<<<<<<<<<<<
+ *     self.c_pem_root_certs = NULL
+ *     self.c_ssl_pem_key_cert_pairs = NULL
+ */
+  __pyx_v_self->c_cert_config = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":209
+ *     fork_handlers_and_grpc_init()
+ *     self.c_cert_config = NULL
+ *     self.c_pem_root_certs = NULL             # <<<<<<<<<<<<<<
+ *     self.c_ssl_pem_key_cert_pairs = NULL
+ *     self.references = []
+ */
+  __pyx_v_self->c_pem_root_certs = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":210
+ *     self.c_cert_config = NULL
+ *     self.c_pem_root_certs = NULL
+ *     self.c_ssl_pem_key_cert_pairs = NULL             # <<<<<<<<<<<<<<
+ *     self.references = []
+ * 
+ */
+  __pyx_v_self->c_ssl_pem_key_cert_pairs = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":211
+ *     self.c_pem_root_certs = NULL
+ *     self.c_ssl_pem_key_cert_pairs = NULL
+ *     self.references = []             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 211, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->references);
+  __Pyx_DECREF(__pyx_v_self->references);
+  __pyx_v_self->references = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":206
+ * cdef class ServerCertificateConfig:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self.c_cert_config = NULL
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.ServerCertificateConfig.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":213
+ *     self.references = []
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     grpc_ssl_server_certificate_config_destroy(self.c_cert_config)
+ *     gpr_free(self.c_ssl_pem_key_cert_pairs)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_self) {
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":214
+ * 
+ *   def __dealloc__(self):
+ *     grpc_ssl_server_certificate_config_destroy(self.c_cert_config)             # <<<<<<<<<<<<<<
+ *     gpr_free(self.c_ssl_pem_key_cert_pairs)
+ *     grpc_shutdown()
+ */
+  grpc_ssl_server_certificate_config_destroy(__pyx_v_self->c_cert_config);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":215
+ *   def __dealloc__(self):
+ *     grpc_ssl_server_certificate_config_destroy(self.c_cert_config)
+ *     gpr_free(self.c_ssl_pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *     grpc_shutdown()
+ * 
+ */
+  gpr_free(__pyx_v_self->c_ssl_pem_key_cert_pairs);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":216
+ *     grpc_ssl_server_certificate_config_destroy(self.c_cert_config)
+ *     gpr_free(self.c_ssl_pem_key_cert_pairs)
+ *     grpc_shutdown()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  grpc_shutdown();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":213
+ *     self.references = []
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     grpc_ssl_server_certificate_config_destroy(self.c_cert_config)
+ *     gpr_free(self.c_ssl_pem_key_cert_pairs)
+ */
+
+  /* function exit code */
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23ServerCertificateConfig_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ServerCertificateConfig.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23ServerCertificateConfig_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ServerCertificateConfig.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ServerCertificateConfig_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ServerCertificateConfig.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":221
+ * cdef class ServerCredentials:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self.c_credentials = NULL
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_17ServerCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_17ServerCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ServerCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_17ServerCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":222
+ * 
+ *   def __cinit__(self):
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     self.c_credentials = NULL
+ *     self.references = []
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 222, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 222, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":223
+ *   def __cinit__(self):
+ *     fork_handlers_and_grpc_init()
+ *     self.c_credentials = NULL             # <<<<<<<<<<<<<<
+ *     self.references = []
+ *     self.initial_cert_config = None
+ */
+  __pyx_v_self->c_credentials = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":224
+ *     fork_handlers_and_grpc_init()
+ *     self.c_credentials = NULL
+ *     self.references = []             # <<<<<<<<<<<<<<
+ *     self.initial_cert_config = None
+ *     self.cert_config_fetcher = None
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 224, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->references);
+  __Pyx_DECREF(__pyx_v_self->references);
+  __pyx_v_self->references = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":225
+ *     self.c_credentials = NULL
+ *     self.references = []
+ *     self.initial_cert_config = None             # <<<<<<<<<<<<<<
+ *     self.cert_config_fetcher = None
+ *     self.initial_cert_config_fetched = False
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->initial_cert_config);
+  __Pyx_DECREF(__pyx_v_self->initial_cert_config);
+  __pyx_v_self->initial_cert_config = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":226
+ *     self.references = []
+ *     self.initial_cert_config = None
+ *     self.cert_config_fetcher = None             # <<<<<<<<<<<<<<
+ *     self.initial_cert_config_fetched = False
+ * 
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->cert_config_fetcher);
+  __Pyx_DECREF(__pyx_v_self->cert_config_fetcher);
+  __pyx_v_self->cert_config_fetcher = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":227
+ *     self.initial_cert_config = None
+ *     self.cert_config_fetcher = None
+ *     self.initial_cert_config_fetched = False             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+  __pyx_v_self->initial_cert_config_fetched = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":221
+ * cdef class ServerCredentials:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self.c_credentials = NULL
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.ServerCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":229
+ *     self.initial_cert_config_fetched = False
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self.c_credentials != NULL:
+ *       grpc_server_credentials_release(self.c_credentials)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_17ServerCredentials_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_17ServerCredentials_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_17ServerCredentials_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_17ServerCredentials_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":230
+ * 
+ *   def __dealloc__(self):
+ *     if self.c_credentials != NULL:             # <<<<<<<<<<<<<<
+ *       grpc_server_credentials_release(self.c_credentials)
+ *     grpc_shutdown()
+ */
+  __pyx_t_1 = (__pyx_v_self->c_credentials != NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":231
+ *   def __dealloc__(self):
+ *     if self.c_credentials != NULL:
+ *       grpc_server_credentials_release(self.c_credentials)             # <<<<<<<<<<<<<<
+ *     grpc_shutdown()
+ * 
+ */
+    grpc_server_credentials_release(__pyx_v_self->c_credentials);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":230
+ * 
+ *   def __dealloc__(self):
+ *     if self.c_credentials != NULL:             # <<<<<<<<<<<<<<
+ *       grpc_server_credentials_release(self.c_credentials)
+ *     grpc_shutdown()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":232
+ *     if self.c_credentials != NULL:
+ *       grpc_server_credentials_release(self.c_credentials)
+ *     grpc_shutdown()             # <<<<<<<<<<<<<<
+ * 
+ * cdef const char* _get_c_pem_root_certs(pem_root_certs):
+ */
+  grpc_shutdown();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":229
+ *     self.initial_cert_config_fetched = False
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self.c_credentials != NULL:
+ *       grpc_server_credentials_release(self.c_credentials)
+ */
+
+  /* function exit code */
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ServerCredentials_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ServerCredentials_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ServerCredentials_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ServerCredentials_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ServerCredentials_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ServerCredentials_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ServerCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ServerCredentials_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ServerCredentials_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ServerCredentials_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ServerCredentials_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ServerCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ServerCredentials_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ServerCredentials_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ServerCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":234
+ *     grpc_shutdown()
+ * 
+ * cdef const char* _get_c_pem_root_certs(pem_root_certs):             # <<<<<<<<<<<<<<
+ *   if pem_root_certs is None:
+ *     return NULL
+ */
+
+static char const *__pyx_f_7_cython_6cygrpc__get_c_pem_root_certs(PyObject *__pyx_v_pem_root_certs) {
+  char const *__pyx_r;
+  int __pyx_t_1;
+  char const *__pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":235
+ * 
+ * cdef const char* _get_c_pem_root_certs(pem_root_certs):
+ *   if pem_root_certs is None:             # <<<<<<<<<<<<<<
+ *     return NULL
+ *   else:
+ */
+  __pyx_t_1 = (__pyx_v_pem_root_certs == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":236
+ * cdef const char* _get_c_pem_root_certs(pem_root_certs):
+ *   if pem_root_certs is None:
+ *     return NULL             # <<<<<<<<<<<<<<
+ *   else:
+ *     return pem_root_certs
+ */
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":235
+ * 
+ * cdef const char* _get_c_pem_root_certs(pem_root_certs):
+ *   if pem_root_certs is None:             # <<<<<<<<<<<<<<
+ *     return NULL
+ *   else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":238
+ *     return NULL
+ *   else:
+ *     return pem_root_certs             # <<<<<<<<<<<<<<
+ * 
+ * cdef grpc_ssl_pem_key_cert_pair* _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs):
+ */
+  /*else*/ {
+    __pyx_t_2 = __Pyx_PyObject_AsString(__pyx_v_pem_root_certs); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) __PYX_ERR(5, 238, __pyx_L1_error)
+    __pyx_r = __pyx_t_2;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":234
+ *     grpc_shutdown()
+ * 
+ * cdef const char* _get_c_pem_root_certs(pem_root_certs):             # <<<<<<<<<<<<<<
+ *   if pem_root_certs is None:
+ *     return NULL
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._get_c_pem_root_certs", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":240
+ *     return pem_root_certs
+ * 
+ * cdef grpc_ssl_pem_key_cert_pair* _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs):             # <<<<<<<<<<<<<<
+ *   # return a malloc'ed grpc_ssl_pem_key_cert_pair from a _list_ of SslPemKeyCertPair
+ *   for pair in pem_key_cert_pairs:
+ */
+
+static grpc_ssl_pem_key_cert_pair *__pyx_f_7_cython_6cygrpc__create_c_ssl_pem_key_cert_pairs(PyObject *__pyx_v_pem_key_cert_pairs) {
+  PyObject *__pyx_v_pair = NULL;
+  size_t __pyx_v_c_ssl_pem_key_cert_pairs_count;
+  grpc_ssl_pem_key_cert_pair *__pyx_v_c_ssl_pem_key_cert_pairs;
+  size_t __pyx_v_i;
+  grpc_ssl_pem_key_cert_pair *__pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  size_t __pyx_t_7;
+  size_t __pyx_t_8;
+  size_t __pyx_t_9;
+  grpc_ssl_pem_key_cert_pair __pyx_t_10;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_create_c_ssl_pem_key_cert_pairs", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":242
+ * cdef grpc_ssl_pem_key_cert_pair* _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs):
+ *   # return a malloc'ed grpc_ssl_pem_key_cert_pair from a _list_ of SslPemKeyCertPair
+ *   for pair in pem_key_cert_pairs:             # <<<<<<<<<<<<<<
+ *     if not isinstance(pair, SslPemKeyCertPair):
+ *       raise TypeError("expected pem_key_cert_pairs to be sequence of "
+ */
+  if (likely(PyList_CheckExact(__pyx_v_pem_key_cert_pairs)) || PyTuple_CheckExact(__pyx_v_pem_key_cert_pairs)) {
+    __pyx_t_1 = __pyx_v_pem_key_cert_pairs; __Pyx_INCREF(__pyx_t_1);
+    __pyx_t_2 = 0;
+    __pyx_t_3 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pem_key_cert_pairs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 242, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 242, __pyx_L1_error)
+  }
+  for (;;) {
+    if (likely(!__pyx_t_3)) {
+      if (likely(PyList_CheckExact(__pyx_t_1))) {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(5, 242, __pyx_L1_error)
+          #endif
+          if (__pyx_t_2 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(5, 242, __pyx_L1_error)
+        #else
+        __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 242, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        #endif
+      } else {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(5, 242, __pyx_L1_error)
+          #endif
+          if (__pyx_t_2 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(5, 242, __pyx_L1_error)
+        #else
+        __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 242, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        #endif
+      }
+    } else {
+      __pyx_t_4 = __pyx_t_3(__pyx_t_1);
+      if (unlikely(!__pyx_t_4)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else __PYX_ERR(5, 242, __pyx_L1_error)
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_4);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_pair, __pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":243
+ *   # return a malloc'ed grpc_ssl_pem_key_cert_pair from a _list_ of SslPemKeyCertPair
+ *   for pair in pem_key_cert_pairs:
+ *     if not isinstance(pair, SslPemKeyCertPair):             # <<<<<<<<<<<<<<
+ *       raise TypeError("expected pem_key_cert_pairs to be sequence of "
+ *                       "SslPemKeyCertPair")
+ */
+    __pyx_t_5 = __Pyx_TypeCheck(__pyx_v_pair, __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair); 
+    __pyx_t_6 = (!__pyx_t_5);
+    if (unlikely(__pyx_t_6)) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":244
+ *   for pair in pem_key_cert_pairs:
+ *     if not isinstance(pair, SslPemKeyCertPair):
+ *       raise TypeError("expected pem_key_cert_pairs to be sequence of "             # <<<<<<<<<<<<<<
+ *                       "SslPemKeyCertPair")
+ *   cdef size_t c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ */
+      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 244, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __PYX_ERR(5, 244, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":243
+ *   # return a malloc'ed grpc_ssl_pem_key_cert_pair from a _list_ of SslPemKeyCertPair
+ *   for pair in pem_key_cert_pairs:
+ *     if not isinstance(pair, SslPemKeyCertPair):             # <<<<<<<<<<<<<<
+ *       raise TypeError("expected pem_key_cert_pairs to be sequence of "
+ *                       "SslPemKeyCertPair")
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":242
+ * cdef grpc_ssl_pem_key_cert_pair* _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs):
+ *   # return a malloc'ed grpc_ssl_pem_key_cert_pair from a _list_ of SslPemKeyCertPair
+ *   for pair in pem_key_cert_pairs:             # <<<<<<<<<<<<<<
+ *     if not isinstance(pair, SslPemKeyCertPair):
+ *       raise TypeError("expected pem_key_cert_pairs to be sequence of "
+ */
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":246
+ *       raise TypeError("expected pem_key_cert_pairs to be sequence of "
+ *                       "SslPemKeyCertPair")
+ *   cdef size_t c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   cdef grpc_ssl_pem_key_cert_pair* c_ssl_pem_key_cert_pairs = NULL
+ *   with nogil:
+ */
+  __pyx_t_2 = PyObject_Length(__pyx_v_pem_key_cert_pairs); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(5, 246, __pyx_L1_error)
+  __pyx_v_c_ssl_pem_key_cert_pairs_count = __pyx_t_2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":247
+ *                       "SslPemKeyCertPair")
+ *   cdef size_t c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   cdef grpc_ssl_pem_key_cert_pair* c_ssl_pem_key_cert_pairs = NULL             # <<<<<<<<<<<<<<
+ *   with nogil:
+ *     c_ssl_pem_key_cert_pairs = (
+ */
+  __pyx_v_c_ssl_pem_key_cert_pairs = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":248
+ *   cdef size_t c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   cdef grpc_ssl_pem_key_cert_pair* c_ssl_pem_key_cert_pairs = NULL
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     c_ssl_pem_key_cert_pairs = (
+ *       <grpc_ssl_pem_key_cert_pair *>gpr_malloc(
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":250
+ *   with nogil:
+ *     c_ssl_pem_key_cert_pairs = (
+ *       <grpc_ssl_pem_key_cert_pair *>gpr_malloc(             # <<<<<<<<<<<<<<
+ *         sizeof(grpc_ssl_pem_key_cert_pair) * c_ssl_pem_key_cert_pairs_count))
+ *   for i in range(c_ssl_pem_key_cert_pairs_count):
+ */
+        __pyx_v_c_ssl_pem_key_cert_pairs = ((grpc_ssl_pem_key_cert_pair *)gpr_malloc(((sizeof(grpc_ssl_pem_key_cert_pair)) * __pyx_v_c_ssl_pem_key_cert_pairs_count)));
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":248
+ *   cdef size_t c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   cdef grpc_ssl_pem_key_cert_pair* c_ssl_pem_key_cert_pairs = NULL
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     c_ssl_pem_key_cert_pairs = (
+ *       <grpc_ssl_pem_key_cert_pair *>gpr_malloc(
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L9;
+        }
+        __pyx_L9:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":252
+ *       <grpc_ssl_pem_key_cert_pair *>gpr_malloc(
+ *         sizeof(grpc_ssl_pem_key_cert_pair) * c_ssl_pem_key_cert_pairs_count))
+ *   for i in range(c_ssl_pem_key_cert_pairs_count):             # <<<<<<<<<<<<<<
+ *     c_ssl_pem_key_cert_pairs[i] = (
+ *       (<SslPemKeyCertPair>pem_key_cert_pairs[i]).c_pair)
+ */
+  __pyx_t_7 = __pyx_v_c_ssl_pem_key_cert_pairs_count;
+  __pyx_t_8 = __pyx_t_7;
+  for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
+    __pyx_v_i = __pyx_t_9;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":254
+ *   for i in range(c_ssl_pem_key_cert_pairs_count):
+ *     c_ssl_pem_key_cert_pairs[i] = (
+ *       (<SslPemKeyCertPair>pem_key_cert_pairs[i]).c_pair)             # <<<<<<<<<<<<<<
+ *   return c_ssl_pem_key_cert_pairs
+ * 
+ */
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_pem_key_cert_pairs, __pyx_v_i, size_t, 0, __Pyx_PyInt_FromSize_t, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 254, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_10 = ((struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)__pyx_t_1)->c_pair;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":253
+ *         sizeof(grpc_ssl_pem_key_cert_pair) * c_ssl_pem_key_cert_pairs_count))
+ *   for i in range(c_ssl_pem_key_cert_pairs_count):
+ *     c_ssl_pem_key_cert_pairs[i] = (             # <<<<<<<<<<<<<<
+ *       (<SslPemKeyCertPair>pem_key_cert_pairs[i]).c_pair)
+ *   return c_ssl_pem_key_cert_pairs
+ */
+    (__pyx_v_c_ssl_pem_key_cert_pairs[__pyx_v_i]) = __pyx_t_10;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":255
+ *     c_ssl_pem_key_cert_pairs[i] = (
+ *       (<SslPemKeyCertPair>pem_key_cert_pairs[i]).c_pair)
+ *   return c_ssl_pem_key_cert_pairs             # <<<<<<<<<<<<<<
+ * 
+ * def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs,
+ */
+  __pyx_r = __pyx_v_c_ssl_pem_key_cert_pairs;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":240
+ *     return pem_root_certs
+ * 
+ * cdef grpc_ssl_pem_key_cert_pair* _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs):             # <<<<<<<<<<<<<<
+ *   # return a malloc'ed grpc_ssl_pem_key_cert_pair from a _list_ of SslPemKeyCertPair
+ *   for pair in pem_key_cert_pairs:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._create_c_ssl_pem_key_cert_pairs", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_pair);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":257
+ *   return c_ssl_pem_key_cert_pairs
+ * 
+ * def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs,             # <<<<<<<<<<<<<<
+ *                            bint force_client_auth):
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23server_credentials_ssl(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23server_credentials_ssl = {"server_credentials_ssl", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23server_credentials_ssl, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23server_credentials_ssl(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_pem_root_certs = 0;
+  PyObject *__pyx_v_pem_key_cert_pairs = 0;
+  int __pyx_v_force_client_auth;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("server_credentials_ssl (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pem_root_certs,&__pyx_n_s_pem_key_cert_pairs,&__pyx_n_s_force_client_auth,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pem_root_certs)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 257, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pem_key_cert_pairs)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 257, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("server_credentials_ssl", 1, 3, 3, 1); __PYX_ERR(5, 257, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_force_client_auth)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 257, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("server_credentials_ssl", 1, 3, 3, 2); __PYX_ERR(5, 257, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "server_credentials_ssl") < 0)) __PYX_ERR(5, 257, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_pem_root_certs = values[0];
+    __pyx_v_pem_key_cert_pairs = values[1];
+    __pyx_v_force_client_auth = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_force_client_auth == (int)-1) && PyErr_Occurred())) __PYX_ERR(5, 258, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("server_credentials_ssl", 1, 3, 3, __pyx_nargs); __PYX_ERR(5, 257, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.server_credentials_ssl", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_22server_credentials_ssl(__pyx_self, __pyx_v_pem_root_certs, __pyx_v_pem_key_cert_pairs, __pyx_v_force_client_auth);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_22server_credentials_ssl(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pem_root_certs, PyObject *__pyx_v_pem_key_cert_pairs, int __pyx_v_force_client_auth) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_credentials = 0;
+  char const *__pyx_v_c_pem_root_certs;
+  grpc_ssl_server_certificate_config *__pyx_v_c_cert_config;
+  grpc_ssl_server_credentials_options *__pyx_v_c_options;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  char const *__pyx_t_3;
+  Py_ssize_t __pyx_t_4;
+  grpc_ssl_pem_key_cert_pair *__pyx_t_5;
+  grpc_ssl_client_certificate_request_type __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("server_credentials_ssl", 0);
+  __Pyx_INCREF(__pyx_v_pem_root_certs);
+  __Pyx_INCREF(__pyx_v_pem_key_cert_pairs);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":259
+ * def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs,
+ *                            bint force_client_auth):
+ *   pem_root_certs = str_to_bytes(pem_root_certs)             # <<<<<<<<<<<<<<
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_str_to_bytes(__pyx_v_pem_root_certs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 259, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF_SET(__pyx_v_pem_root_certs, __pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":260
+ *                            bint force_client_auth):
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.references.append(pem_root_certs)
+ */
+  __pyx_t_1 = PySequence_List(__pyx_v_pem_key_cert_pairs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 260, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF_SET(__pyx_v_pem_key_cert_pairs, __pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":261
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ *   cdef ServerCredentials credentials = ServerCredentials()             # <<<<<<<<<<<<<<
+ *   credentials.references.append(pem_root_certs)
+ *   credentials.references.append(pem_key_cert_pairs)
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ServerCredentials)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 261, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":262
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.references.append(pem_root_certs)             # <<<<<<<<<<<<<<
+ *   credentials.references.append(pem_key_cert_pairs)
+ *   cdef const char * c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)
+ */
+  if (unlikely(__pyx_v_credentials->references == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(5, 262, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_credentials->references, __pyx_v_pem_root_certs); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(5, 262, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":263
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.references.append(pem_root_certs)
+ *   credentials.references.append(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   cdef const char * c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)
+ *   credentials.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ */
+  if (unlikely(__pyx_v_credentials->references == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(5, 263, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_credentials->references, __pyx_v_pem_key_cert_pairs); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(5, 263, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":264
+ *   credentials.references.append(pem_root_certs)
+ *   credentials.references.append(pem_key_cert_pairs)
+ *   cdef const char * c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)             # <<<<<<<<<<<<<<
+ *   credentials.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   credentials.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc__get_c_pem_root_certs(__pyx_v_pem_root_certs); if (unlikely(__pyx_t_3 == ((char const *)NULL) && PyErr_Occurred())) __PYX_ERR(5, 264, __pyx_L1_error)
+  __pyx_v_c_pem_root_certs = __pyx_t_3;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":265
+ *   credentials.references.append(pem_key_cert_pairs)
+ *   cdef const char * c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)
+ *   credentials.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   credentials.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)
+ *   cdef grpc_ssl_server_certificate_config *c_cert_config = NULL
+ */
+  __pyx_t_4 = PyObject_Length(__pyx_v_pem_key_cert_pairs); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(5, 265, __pyx_L1_error)
+  __pyx_v_credentials->c_ssl_pem_key_cert_pairs_count = __pyx_t_4;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":266
+ *   cdef const char * c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)
+ *   credentials.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   credentials.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   cdef grpc_ssl_server_certificate_config *c_cert_config = NULL
+ *   c_cert_config = grpc_ssl_server_certificate_config_create(
+ */
+  __pyx_t_5 = __pyx_f_7_cython_6cygrpc__create_c_ssl_pem_key_cert_pairs(__pyx_v_pem_key_cert_pairs); if (unlikely(__pyx_t_5 == ((grpc_ssl_pem_key_cert_pair *)NULL) && PyErr_Occurred())) __PYX_ERR(5, 266, __pyx_L1_error)
+  __pyx_v_credentials->c_ssl_pem_key_cert_pairs = __pyx_t_5;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":267
+ *   credentials.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   credentials.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)
+ *   cdef grpc_ssl_server_certificate_config *c_cert_config = NULL             # <<<<<<<<<<<<<<
+ *   c_cert_config = grpc_ssl_server_certificate_config_create(
+ *     c_pem_root_certs, credentials.c_ssl_pem_key_cert_pairs,
+ */
+  __pyx_v_c_cert_config = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":268
+ *   credentials.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)
+ *   cdef grpc_ssl_server_certificate_config *c_cert_config = NULL
+ *   c_cert_config = grpc_ssl_server_certificate_config_create(             # <<<<<<<<<<<<<<
+ *     c_pem_root_certs, credentials.c_ssl_pem_key_cert_pairs,
+ *     credentials.c_ssl_pem_key_cert_pairs_count)
+ */
+  __pyx_v_c_cert_config = grpc_ssl_server_certificate_config_create(__pyx_v_c_pem_root_certs, __pyx_v_credentials->c_ssl_pem_key_cert_pairs, __pyx_v_credentials->c_ssl_pem_key_cert_pairs_count);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":271
+ *     c_pem_root_certs, credentials.c_ssl_pem_key_cert_pairs,
+ *     credentials.c_ssl_pem_key_cert_pairs_count)
+ *   cdef grpc_ssl_server_credentials_options* c_options = NULL             # <<<<<<<<<<<<<<
+ *   # C-core assumes ownership of c_cert_config
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config(
+ */
+  __pyx_v_c_options = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":275
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config(
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
+ *     if force_client_auth else             # <<<<<<<<<<<<<<
+ *     GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
+ *     c_cert_config)
+ */
+  if (__pyx_v_force_client_auth) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":274
+ *   # C-core assumes ownership of c_cert_config
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config(
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY             # <<<<<<<<<<<<<<
+ *     if force_client_auth else
+ *     GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
+ */
+    __pyx_t_6 = GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY;
+  } else {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":276
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
+ *     if force_client_auth else
+ *     GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,             # <<<<<<<<<<<<<<
+ *     c_cert_config)
+ *   # C-core assumes ownership of c_options
+ */
+    __pyx_t_6 = GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":273
+ *   cdef grpc_ssl_server_credentials_options* c_options = NULL
+ *   # C-core assumes ownership of c_cert_config
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config(             # <<<<<<<<<<<<<<
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
+ *     if force_client_auth else
+ */
+  __pyx_v_c_options = grpc_ssl_server_credentials_create_options_using_config(__pyx_t_6, __pyx_v_c_cert_config);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":279
+ *     c_cert_config)
+ *   # C-core assumes ownership of c_options
+ *   credentials.c_credentials = grpc_ssl_server_credentials_create_with_options(c_options)             # <<<<<<<<<<<<<<
+ *   return credentials
+ * 
+ */
+  __pyx_v_credentials->c_credentials = grpc_ssl_server_credentials_create_with_options(__pyx_v_c_options);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":280
+ *   # C-core assumes ownership of c_options
+ *   credentials.c_credentials = grpc_ssl_server_credentials_create_with_options(c_options)
+ *   return credentials             # <<<<<<<<<<<<<<
+ * 
+ * def server_certificate_config_ssl(pem_root_certs, pem_key_cert_pairs):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_credentials);
+  __pyx_r = ((PyObject *)__pyx_v_credentials);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":257
+ *   return c_ssl_pem_key_cert_pairs
+ * 
+ * def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs,             # <<<<<<<<<<<<<<
+ *                            bint force_client_auth):
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.server_credentials_ssl", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_credentials);
+  __Pyx_XDECREF(__pyx_v_pem_root_certs);
+  __Pyx_XDECREF(__pyx_v_pem_key_cert_pairs);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":282
+ *   return credentials
+ * 
+ * def server_certificate_config_ssl(pem_root_certs, pem_key_cert_pairs):             # <<<<<<<<<<<<<<
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_25server_certificate_config_ssl(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_25server_certificate_config_ssl = {"server_certificate_config_ssl", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_25server_certificate_config_ssl, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_25server_certificate_config_ssl(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_pem_root_certs = 0;
+  PyObject *__pyx_v_pem_key_cert_pairs = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("server_certificate_config_ssl (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pem_root_certs,&__pyx_n_s_pem_key_cert_pairs,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pem_root_certs)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 282, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pem_key_cert_pairs)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 282, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("server_certificate_config_ssl", 1, 2, 2, 1); __PYX_ERR(5, 282, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "server_certificate_config_ssl") < 0)) __PYX_ERR(5, 282, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_pem_root_certs = values[0];
+    __pyx_v_pem_key_cert_pairs = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("server_certificate_config_ssl", 1, 2, 2, __pyx_nargs); __PYX_ERR(5, 282, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.server_certificate_config_ssl", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_24server_certificate_config_ssl(__pyx_self, __pyx_v_pem_root_certs, __pyx_v_pem_key_cert_pairs);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_24server_certificate_config_ssl(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pem_root_certs, PyObject *__pyx_v_pem_key_cert_pairs) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_cert_config = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  char const *__pyx_t_3;
+  Py_ssize_t __pyx_t_4;
+  grpc_ssl_pem_key_cert_pair *__pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("server_certificate_config_ssl", 0);
+  __Pyx_INCREF(__pyx_v_pem_root_certs);
+  __Pyx_INCREF(__pyx_v_pem_key_cert_pairs);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":283
+ * 
+ * def server_certificate_config_ssl(pem_root_certs, pem_key_cert_pairs):
+ *   pem_root_certs = str_to_bytes(pem_root_certs)             # <<<<<<<<<<<<<<
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ *   cdef ServerCertificateConfig cert_config = ServerCertificateConfig()
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_str_to_bytes(__pyx_v_pem_root_certs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 283, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF_SET(__pyx_v_pem_root_certs, __pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":284
+ * def server_certificate_config_ssl(pem_root_certs, pem_key_cert_pairs):
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   cdef ServerCertificateConfig cert_config = ServerCertificateConfig()
+ *   cert_config.references.append(pem_root_certs)
+ */
+  __pyx_t_1 = PySequence_List(__pyx_v_pem_key_cert_pairs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 284, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF_SET(__pyx_v_pem_key_cert_pairs, __pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":285
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ *   cdef ServerCertificateConfig cert_config = ServerCertificateConfig()             # <<<<<<<<<<<<<<
+ *   cert_config.references.append(pem_root_certs)
+ *   cert_config.references.append(pem_key_cert_pairs)
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 285, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_cert_config = ((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":286
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ *   cdef ServerCertificateConfig cert_config = ServerCertificateConfig()
+ *   cert_config.references.append(pem_root_certs)             # <<<<<<<<<<<<<<
+ *   cert_config.references.append(pem_key_cert_pairs)
+ *   cert_config.c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)
+ */
+  if (unlikely(__pyx_v_cert_config->references == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(5, 286, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_cert_config->references, __pyx_v_pem_root_certs); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(5, 286, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":287
+ *   cdef ServerCertificateConfig cert_config = ServerCertificateConfig()
+ *   cert_config.references.append(pem_root_certs)
+ *   cert_config.references.append(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   cert_config.c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)
+ *   cert_config.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ */
+  if (unlikely(__pyx_v_cert_config->references == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(5, 287, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_cert_config->references, __pyx_v_pem_key_cert_pairs); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(5, 287, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":288
+ *   cert_config.references.append(pem_root_certs)
+ *   cert_config.references.append(pem_key_cert_pairs)
+ *   cert_config.c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)             # <<<<<<<<<<<<<<
+ *   cert_config.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   cert_config.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc__get_c_pem_root_certs(__pyx_v_pem_root_certs); if (unlikely(__pyx_t_3 == ((char const *)NULL) && PyErr_Occurred())) __PYX_ERR(5, 288, __pyx_L1_error)
+  __pyx_v_cert_config->c_pem_root_certs = __pyx_t_3;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":289
+ *   cert_config.references.append(pem_key_cert_pairs)
+ *   cert_config.c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)
+ *   cert_config.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   cert_config.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)
+ *   cert_config.c_cert_config = grpc_ssl_server_certificate_config_create(
+ */
+  __pyx_t_4 = PyObject_Length(__pyx_v_pem_key_cert_pairs); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(5, 289, __pyx_L1_error)
+  __pyx_v_cert_config->c_ssl_pem_key_cert_pairs_count = __pyx_t_4;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":290
+ *   cert_config.c_pem_root_certs = _get_c_pem_root_certs(pem_root_certs)
+ *   cert_config.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   cert_config.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)             # <<<<<<<<<<<<<<
+ *   cert_config.c_cert_config = grpc_ssl_server_certificate_config_create(
+ *     cert_config.c_pem_root_certs, cert_config.c_ssl_pem_key_cert_pairs,
+ */
+  __pyx_t_5 = __pyx_f_7_cython_6cygrpc__create_c_ssl_pem_key_cert_pairs(__pyx_v_pem_key_cert_pairs); if (unlikely(__pyx_t_5 == ((grpc_ssl_pem_key_cert_pair *)NULL) && PyErr_Occurred())) __PYX_ERR(5, 290, __pyx_L1_error)
+  __pyx_v_cert_config->c_ssl_pem_key_cert_pairs = __pyx_t_5;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":291
+ *   cert_config.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ *   cert_config.c_ssl_pem_key_cert_pairs = _create_c_ssl_pem_key_cert_pairs(pem_key_cert_pairs)
+ *   cert_config.c_cert_config = grpc_ssl_server_certificate_config_create(             # <<<<<<<<<<<<<<
+ *     cert_config.c_pem_root_certs, cert_config.c_ssl_pem_key_cert_pairs,
+ *     cert_config.c_ssl_pem_key_cert_pairs_count)
+ */
+  __pyx_v_cert_config->c_cert_config = grpc_ssl_server_certificate_config_create(__pyx_v_cert_config->c_pem_root_certs, __pyx_v_cert_config->c_ssl_pem_key_cert_pairs, __pyx_v_cert_config->c_ssl_pem_key_cert_pairs_count);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":294
+ *     cert_config.c_pem_root_certs, cert_config.c_ssl_pem_key_cert_pairs,
+ *     cert_config.c_ssl_pem_key_cert_pairs_count)
+ *   return cert_config             # <<<<<<<<<<<<<<
+ * 
+ * def server_credentials_ssl_dynamic_cert_config(initial_cert_config,
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_cert_config);
+  __pyx_r = ((PyObject *)__pyx_v_cert_config);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":282
+ *   return credentials
+ * 
+ * def server_certificate_config_ssl(pem_root_certs, pem_key_cert_pairs):             # <<<<<<<<<<<<<<
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.server_certificate_config_ssl", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_cert_config);
+  __Pyx_XDECREF(__pyx_v_pem_root_certs);
+  __Pyx_XDECREF(__pyx_v_pem_key_cert_pairs);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":296
+ *   return cert_config
+ * 
+ * def server_credentials_ssl_dynamic_cert_config(initial_cert_config,             # <<<<<<<<<<<<<<
+ *                                                cert_config_fetcher,
+ *                                                bint force_client_auth):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_27server_credentials_ssl_dynamic_cert_config(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_27server_credentials_ssl_dynamic_cert_config = {"server_credentials_ssl_dynamic_cert_config", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_27server_credentials_ssl_dynamic_cert_config, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_27server_credentials_ssl_dynamic_cert_config(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_initial_cert_config = 0;
+  PyObject *__pyx_v_cert_config_fetcher = 0;
+  int __pyx_v_force_client_auth;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("server_credentials_ssl_dynamic_cert_config (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_initial_cert_config,&__pyx_n_s_cert_config_fetcher,&__pyx_n_s_force_client_auth,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_initial_cert_config)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 296, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_cert_config_fetcher)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 296, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("server_credentials_ssl_dynamic_cert_config", 1, 3, 3, 1); __PYX_ERR(5, 296, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_force_client_auth)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 296, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("server_credentials_ssl_dynamic_cert_config", 1, 3, 3, 2); __PYX_ERR(5, 296, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "server_credentials_ssl_dynamic_cert_config") < 0)) __PYX_ERR(5, 296, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_initial_cert_config = values[0];
+    __pyx_v_cert_config_fetcher = values[1];
+    __pyx_v_force_client_auth = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_force_client_auth == (int)-1) && PyErr_Occurred())) __PYX_ERR(5, 298, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("server_credentials_ssl_dynamic_cert_config", 1, 3, 3, __pyx_nargs); __PYX_ERR(5, 296, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.server_credentials_ssl_dynamic_cert_config", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_26server_credentials_ssl_dynamic_cert_config(__pyx_self, __pyx_v_initial_cert_config, __pyx_v_cert_config_fetcher, __pyx_v_force_client_auth);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_26server_credentials_ssl_dynamic_cert_config(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_initial_cert_config, PyObject *__pyx_v_cert_config_fetcher, int __pyx_v_force_client_auth) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_credentials = 0;
+  grpc_ssl_server_credentials_options *__pyx_v_c_options;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  grpc_ssl_client_certificate_request_type __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("server_credentials_ssl_dynamic_cert_config", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":299
+ *                                                cert_config_fetcher,
+ *                                                bint force_client_auth):
+ *   if not isinstance(initial_cert_config, grpc.ServerCertificateConfiguration):             # <<<<<<<<<<<<<<
+ *     raise TypeError(
+ *         'initial_cert_config must be a grpc.ServerCertificateConfiguration')
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_grpc); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 299, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ServerCertificateConfiguration); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 299, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = PyObject_IsInstance(__pyx_v_initial_cert_config, __pyx_t_2); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(5, 299, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_4 = (!__pyx_t_3);
+  if (unlikely(__pyx_t_4)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":300
+ *                                                bint force_client_auth):
+ *   if not isinstance(initial_cert_config, grpc.ServerCertificateConfiguration):
+ *     raise TypeError(             # <<<<<<<<<<<<<<
+ *         'initial_cert_config must be a grpc.ServerCertificateConfiguration')
+ *   if not callable(cert_config_fetcher):
+ */
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 300, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(5, 300, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":299
+ *                                                cert_config_fetcher,
+ *                                                bint force_client_auth):
+ *   if not isinstance(initial_cert_config, grpc.ServerCertificateConfiguration):             # <<<<<<<<<<<<<<
+ *     raise TypeError(
+ *         'initial_cert_config must be a grpc.ServerCertificateConfiguration')
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":302
+ *     raise TypeError(
+ *         'initial_cert_config must be a grpc.ServerCertificateConfiguration')
+ *   if not callable(cert_config_fetcher):             # <<<<<<<<<<<<<<
+ *     raise TypeError('cert_config_fetcher must be callable')
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ */
+  __pyx_t_4 = __Pyx_PyCallable_Check(__pyx_v_cert_config_fetcher); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(5, 302, __pyx_L1_error)
+  __pyx_t_3 = (!__pyx_t_4);
+  if (unlikely(__pyx_t_3)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":303
+ *         'initial_cert_config must be a grpc.ServerCertificateConfiguration')
+ *   if not callable(cert_config_fetcher):
+ *     raise TypeError('cert_config_fetcher must be callable')             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.initial_cert_config = initial_cert_config
+ */
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 303, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(5, 303, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":302
+ *     raise TypeError(
+ *         'initial_cert_config must be a grpc.ServerCertificateConfiguration')
+ *   if not callable(cert_config_fetcher):             # <<<<<<<<<<<<<<
+ *     raise TypeError('cert_config_fetcher must be callable')
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":304
+ *   if not callable(cert_config_fetcher):
+ *     raise TypeError('cert_config_fetcher must be callable')
+ *   cdef ServerCredentials credentials = ServerCredentials()             # <<<<<<<<<<<<<<
+ *   credentials.initial_cert_config = initial_cert_config
+ *   credentials.cert_config_fetcher = cert_config_fetcher
+ */
+  __pyx_t_2 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ServerCredentials)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 304, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":305
+ *     raise TypeError('cert_config_fetcher must be callable')
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.initial_cert_config = initial_cert_config             # <<<<<<<<<<<<<<
+ *   credentials.cert_config_fetcher = cert_config_fetcher
+ *   cdef grpc_ssl_server_credentials_options* c_options = NULL
+ */
+  __Pyx_INCREF(__pyx_v_initial_cert_config);
+  __Pyx_GIVEREF(__pyx_v_initial_cert_config);
+  __Pyx_GOTREF(__pyx_v_credentials->initial_cert_config);
+  __Pyx_DECREF(__pyx_v_credentials->initial_cert_config);
+  __pyx_v_credentials->initial_cert_config = __pyx_v_initial_cert_config;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":306
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.initial_cert_config = initial_cert_config
+ *   credentials.cert_config_fetcher = cert_config_fetcher             # <<<<<<<<<<<<<<
+ *   cdef grpc_ssl_server_credentials_options* c_options = NULL
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config_fetcher(
+ */
+  __Pyx_INCREF(__pyx_v_cert_config_fetcher);
+  __Pyx_GIVEREF(__pyx_v_cert_config_fetcher);
+  __Pyx_GOTREF(__pyx_v_credentials->cert_config_fetcher);
+  __Pyx_DECREF(__pyx_v_credentials->cert_config_fetcher);
+  __pyx_v_credentials->cert_config_fetcher = __pyx_v_cert_config_fetcher;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":307
+ *   credentials.initial_cert_config = initial_cert_config
+ *   credentials.cert_config_fetcher = cert_config_fetcher
+ *   cdef grpc_ssl_server_credentials_options* c_options = NULL             # <<<<<<<<<<<<<<
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config_fetcher(
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
+ */
+  __pyx_v_c_options = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":310
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config_fetcher(
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
+ *     if force_client_auth else             # <<<<<<<<<<<<<<
+ *     GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
+ *     _server_cert_config_fetcher_wrapper,
+ */
+  if (__pyx_v_force_client_auth) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":309
+ *   cdef grpc_ssl_server_credentials_options* c_options = NULL
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config_fetcher(
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY             # <<<<<<<<<<<<<<
+ *     if force_client_auth else
+ *     GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
+ */
+    __pyx_t_5 = GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY;
+  } else {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":311
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
+ *     if force_client_auth else
+ *     GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,             # <<<<<<<<<<<<<<
+ *     _server_cert_config_fetcher_wrapper,
+ *     <void*>credentials)
+ */
+    __pyx_t_5 = GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":308
+ *   credentials.cert_config_fetcher = cert_config_fetcher
+ *   cdef grpc_ssl_server_credentials_options* c_options = NULL
+ *   c_options = grpc_ssl_server_credentials_create_options_using_config_fetcher(             # <<<<<<<<<<<<<<
+ *     GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
+ *     if force_client_auth else
+ */
+  __pyx_v_c_options = grpc_ssl_server_credentials_create_options_using_config_fetcher(__pyx_t_5, __pyx_f_7_cython_6cygrpc__server_cert_config_fetcher_wrapper, ((void *)__pyx_v_credentials));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":315
+ *     <void*>credentials)
+ *   # C-core assumes ownership of c_options
+ *   credentials.c_credentials = grpc_ssl_server_credentials_create_with_options(c_options)             # <<<<<<<<<<<<<<
+ *   return credentials
+ * 
+ */
+  __pyx_v_credentials->c_credentials = grpc_ssl_server_credentials_create_with_options(__pyx_v_c_options);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":316
+ *   # C-core assumes ownership of c_options
+ *   credentials.c_credentials = grpc_ssl_server_credentials_create_with_options(c_options)
+ *   return credentials             # <<<<<<<<<<<<<<
+ * 
+ * cdef grpc_ssl_certificate_config_reload_status _server_cert_config_fetcher_wrapper(
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_credentials);
+  __pyx_r = ((PyObject *)__pyx_v_credentials);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":296
+ *   return cert_config
+ * 
+ * def server_credentials_ssl_dynamic_cert_config(initial_cert_config,             # <<<<<<<<<<<<<<
+ *                                                cert_config_fetcher,
+ *                                                bint force_client_auth):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.server_credentials_ssl_dynamic_cert_config", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_credentials);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":318
+ *   return credentials
+ * 
+ * cdef grpc_ssl_certificate_config_reload_status _server_cert_config_fetcher_wrapper(             # <<<<<<<<<<<<<<
+ *         void* user_data, grpc_ssl_server_certificate_config **config) noexcept with gil:
+ *   # This is a credentials.ServerCertificateConfig
+ */
+
+static grpc_ssl_certificate_config_reload_status __pyx_f_7_cython_6cygrpc__server_cert_config_fetcher_wrapper(void *__pyx_v_user_data, grpc_ssl_server_certificate_config **__pyx_v_config) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *__pyx_v_cert_config = 0;
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_credentials = NULL;
+  PyObject *__pyx_v_user_cb = NULL;
+  PyObject *__pyx_v_cert_config_wrapper = NULL;
+  grpc_ssl_certificate_config_reload_status __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  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;
+  unsigned int __pyx_t_8;
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  int __pyx_t_13;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_RefNannySetupContext("_server_cert_config_fetcher_wrapper", 0);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":321
+ *         void* user_data, grpc_ssl_server_certificate_config **config) noexcept with gil:
+ *   # This is a credentials.ServerCertificateConfig
+ *   cdef ServerCertificateConfig cert_config = None             # <<<<<<<<<<<<<<
+ *   if not user_data:
+ *     raise ValueError('internal error: user_data must be specified')
+ */
+  __Pyx_INCREF(Py_None);
+  __pyx_v_cert_config = ((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)Py_None);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":322
+ *   # This is a credentials.ServerCertificateConfig
+ *   cdef ServerCertificateConfig cert_config = None
+ *   if not user_data:             # <<<<<<<<<<<<<<
+ *     raise ValueError('internal error: user_data must be specified')
+ *   credentials = <ServerCredentials>user_data
+ */
+  __pyx_t_1 = (!(__pyx_v_user_data != 0));
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":323
+ *   cdef ServerCertificateConfig cert_config = None
+ *   if not user_data:
+ *     raise ValueError('internal error: user_data must be specified')             # <<<<<<<<<<<<<<
+ *   credentials = <ServerCredentials>user_data
+ *   if not credentials.initial_cert_config_fetched:
+ */
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 323, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(5, 323, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":322
+ *   # This is a credentials.ServerCertificateConfig
+ *   cdef ServerCertificateConfig cert_config = None
+ *   if not user_data:             # <<<<<<<<<<<<<<
+ *     raise ValueError('internal error: user_data must be specified')
+ *   credentials = <ServerCredentials>user_data
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":324
+ *   if not user_data:
+ *     raise ValueError('internal error: user_data must be specified')
+ *   credentials = <ServerCredentials>user_data             # <<<<<<<<<<<<<<
+ *   if not credentials.initial_cert_config_fetched:
+ *     # C-core is asking for the initial cert config
+ */
+  __pyx_t_2 = ((PyObject *)__pyx_v_user_data);
+  __Pyx_INCREF(__pyx_t_2);
+  __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":325
+ *     raise ValueError('internal error: user_data must be specified')
+ *   credentials = <ServerCredentials>user_data
+ *   if not credentials.initial_cert_config_fetched:             # <<<<<<<<<<<<<<
+ *     # C-core is asking for the initial cert config
+ *     credentials.initial_cert_config_fetched = True
+ */
+  __pyx_t_1 = (!__pyx_v_credentials->initial_cert_config_fetched);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":327
+ *   if not credentials.initial_cert_config_fetched:
+ *     # C-core is asking for the initial cert config
+ *     credentials.initial_cert_config_fetched = True             # <<<<<<<<<<<<<<
+ *     cert_config = credentials.initial_cert_config._certificate_configuration
+ *   else:
+ */
+    __pyx_v_credentials->initial_cert_config_fetched = 1;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":328
+ *     # C-core is asking for the initial cert config
+ *     credentials.initial_cert_config_fetched = True
+ *     cert_config = credentials.initial_cert_config._certificate_configuration             # <<<<<<<<<<<<<<
+ *   else:
+ *     user_cb = credentials.cert_config_fetcher
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_credentials->initial_cert_config, __pyx_n_s_certificate_configuration); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 328, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig))))) __PYX_ERR(5, 328, __pyx_L1_error)
+    __Pyx_DECREF_SET(__pyx_v_cert_config, ((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)__pyx_t_2));
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":325
+ *     raise ValueError('internal error: user_data must be specified')
+ *   credentials = <ServerCredentials>user_data
+ *   if not credentials.initial_cert_config_fetched:             # <<<<<<<<<<<<<<
+ *     # C-core is asking for the initial cert config
+ *     credentials.initial_cert_config_fetched = True
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":330
+ *     cert_config = credentials.initial_cert_config._certificate_configuration
+ *   else:
+ *     user_cb = credentials.cert_config_fetcher             # <<<<<<<<<<<<<<
+ *     try:
+ *       cert_config_wrapper = user_cb()
+ */
+  /*else*/ {
+    __pyx_t_2 = __pyx_v_credentials->cert_config_fetcher;
+    __Pyx_INCREF(__pyx_t_2);
+    __pyx_v_user_cb = __pyx_t_2;
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":331
+ *   else:
+ *     user_cb = credentials.cert_config_fetcher
+ *     try:             # <<<<<<<<<<<<<<
+ *       cert_config_wrapper = user_cb()
+ *     except Exception:
+ */
+    {
+      __Pyx_PyThreadState_declare
+      __Pyx_PyThreadState_assign
+      __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5);
+      __Pyx_XGOTREF(__pyx_t_3);
+      __Pyx_XGOTREF(__pyx_t_4);
+      __Pyx_XGOTREF(__pyx_t_5);
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":332
+ *     user_cb = credentials.cert_config_fetcher
+ *     try:
+ *       cert_config_wrapper = user_cb()             # <<<<<<<<<<<<<<
+ *     except Exception:
+ *       _LOGGER.exception('Error fetching certificate config')
+ */
+        __Pyx_INCREF(__pyx_v_user_cb);
+        __pyx_t_6 = __pyx_v_user_cb; __pyx_t_7 = NULL;
+        __pyx_t_8 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(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);
+            __pyx_t_8 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
+          __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+          __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+          if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 332, __pyx_L5_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        }
+        __pyx_v_cert_config_wrapper = __pyx_t_2;
+        __pyx_t_2 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":331
+ *   else:
+ *     user_cb = credentials.cert_config_fetcher
+ *     try:             # <<<<<<<<<<<<<<
+ *       cert_config_wrapper = user_cb()
+ *     except Exception:
+ */
+      }
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      goto __pyx_L10_try_end;
+      __pyx_L5_error:;
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":333
+ *     try:
+ *       cert_config_wrapper = user_cb()
+ *     except Exception:             # <<<<<<<<<<<<<<
+ *       _LOGGER.exception('Error fetching certificate config')
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
+ */
+      __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
+      if (__pyx_t_9) {
+        __Pyx_AddTraceback("_cython.cygrpc._server_cert_config_fetcher_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
+        if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(5, 333, __pyx_L7_except_error)
+        __Pyx_XGOTREF(__pyx_t_2);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":334
+ *       cert_config_wrapper = user_cb()
+ *     except Exception:
+ *       _LOGGER.exception('Error fetching certificate config')             # <<<<<<<<<<<<<<
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
+ *     if cert_config_wrapper is None:
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_11)) __PYX_ERR(5, 334, __pyx_L7_except_error)
+        __Pyx_GOTREF(__pyx_t_11);
+        __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_exception); if (unlikely(!__pyx_t_12)) __PYX_ERR(5, 334, __pyx_L7_except_error)
+        __Pyx_GOTREF(__pyx_t_12);
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __pyx_t_11 = NULL;
+        __pyx_t_8 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_12))) {
+          __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12);
+          if (likely(__pyx_t_11)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+            __Pyx_INCREF(__pyx_t_11);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_12, function);
+            __pyx_t_8 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_kp_s_Error_fetching_certificate_confi};
+          __pyx_t_10 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (unlikely(!__pyx_t_10)) __PYX_ERR(5, 334, __pyx_L7_except_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":335
+ *     except Exception:
+ *       _LOGGER.exception('Error fetching certificate config')
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL             # <<<<<<<<<<<<<<
+ *     if cert_config_wrapper is None:
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED
+ */
+        __pyx_r = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL;
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L8_except_return;
+      }
+      goto __pyx_L7_except_error;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":331
+ *   else:
+ *     user_cb = credentials.cert_config_fetcher
+ *     try:             # <<<<<<<<<<<<<<
+ *       cert_config_wrapper = user_cb()
+ *     except Exception:
+ */
+      __pyx_L7_except_error:;
+      __Pyx_XGIVEREF(__pyx_t_3);
+      __Pyx_XGIVEREF(__pyx_t_4);
+      __Pyx_XGIVEREF(__pyx_t_5);
+      __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
+      goto __pyx_L1_error;
+      __pyx_L8_except_return:;
+      __Pyx_XGIVEREF(__pyx_t_3);
+      __Pyx_XGIVEREF(__pyx_t_4);
+      __Pyx_XGIVEREF(__pyx_t_5);
+      __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
+      goto __pyx_L0;
+      __pyx_L10_try_end:;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":336
+ *       _LOGGER.exception('Error fetching certificate config')
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
+ *     if cert_config_wrapper is None:             # <<<<<<<<<<<<<<
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED
+ *     elif not isinstance(
+ */
+    __pyx_t_1 = (__pyx_v_cert_config_wrapper == Py_None);
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":337
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
+ *     if cert_config_wrapper is None:
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED             # <<<<<<<<<<<<<<
+ *     elif not isinstance(
+ *         cert_config_wrapper, grpc.ServerCertificateConfiguration):
+ */
+      __pyx_r = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED;
+      goto __pyx_L0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":336
+ *       _LOGGER.exception('Error fetching certificate config')
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
+ *     if cert_config_wrapper is None:             # <<<<<<<<<<<<<<
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED
+ *     elif not isinstance(
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":339
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED
+ *     elif not isinstance(
+ *         cert_config_wrapper, grpc.ServerCertificateConfiguration):             # <<<<<<<<<<<<<<
+ *       _LOGGER.error(
+ *           'Error fetching certificate configuration: certificate '
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_grpc); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 339, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_ServerCertificateConfiguration); if (unlikely(!__pyx_t_6)) __PYX_ERR(5, 339, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":338
+ *     if cert_config_wrapper is None:
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED
+ *     elif not isinstance(             # <<<<<<<<<<<<<<
+ *         cert_config_wrapper, grpc.ServerCertificateConfiguration):
+ *       _LOGGER.error(
+ */
+    __pyx_t_1 = PyObject_IsInstance(__pyx_v_cert_config_wrapper, __pyx_t_6); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(5, 338, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_13 = (!__pyx_t_1);
+    if (__pyx_t_13) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":340
+ *     elif not isinstance(
+ *         cert_config_wrapper, grpc.ServerCertificateConfiguration):
+ *       _LOGGER.error(             # <<<<<<<<<<<<<<
+ *           'Error fetching certificate configuration: certificate '
+ *           'configuration must be of type grpc.ServerCertificateConfiguration, '
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 340, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 340, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":343
+ *           'Error fetching certificate configuration: certificate '
+ *           'configuration must be of type grpc.ServerCertificateConfiguration, '
+ *           'not %s' % type(cert_config_wrapper).__name__)             # <<<<<<<<<<<<<<
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
+ *     else:
+ */
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)Py_TYPE(__pyx_v_cert_config_wrapper)), __pyx_n_s_name_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 343, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_10 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Error_fetching_certificate_confi_2, __pyx_t_7); if (unlikely(!__pyx_t_10)) __PYX_ERR(5, 343, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = NULL;
+      __pyx_t_8 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_2))) {
+        __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
+        if (likely(__pyx_t_7)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_7);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_2, function);
+          __pyx_t_8 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_10};
+        __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        if (unlikely(!__pyx_t_6)) __PYX_ERR(5, 340, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":344
+ *           'configuration must be of type grpc.ServerCertificateConfiguration, '
+ *           'not %s' % type(cert_config_wrapper).__name__)
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL             # <<<<<<<<<<<<<<
+ *     else:
+ *       cert_config = cert_config_wrapper._certificate_configuration
+ */
+      __pyx_r = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL;
+      goto __pyx_L0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":338
+ *     if cert_config_wrapper is None:
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED
+ *     elif not isinstance(             # <<<<<<<<<<<<<<
+ *         cert_config_wrapper, grpc.ServerCertificateConfiguration):
+ *       _LOGGER.error(
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":346
+ *       return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
+ *     else:
+ *       cert_config = cert_config_wrapper._certificate_configuration             # <<<<<<<<<<<<<<
+ *   config[0] = <grpc_ssl_server_certificate_config*>cert_config.c_cert_config
+ *   # our caller will assume ownership of memory, so we have to recreate
+ */
+    /*else*/ {
+      __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_cert_config_wrapper, __pyx_n_s_certificate_configuration); if (unlikely(!__pyx_t_6)) __PYX_ERR(5, 346, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_6);
+      if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig))))) __PYX_ERR(5, 346, __pyx_L1_error)
+      __Pyx_DECREF_SET(__pyx_v_cert_config, ((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)__pyx_t_6));
+      __pyx_t_6 = 0;
+    }
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":347
+ *     else:
+ *       cert_config = cert_config_wrapper._certificate_configuration
+ *   config[0] = <grpc_ssl_server_certificate_config*>cert_config.c_cert_config             # <<<<<<<<<<<<<<
+ *   # our caller will assume ownership of memory, so we have to recreate
+ *   # a copy of c_cert_config here
+ */
+  (__pyx_v_config[0]) = ((grpc_ssl_server_certificate_config *)__pyx_v_cert_config->c_cert_config);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":350
+ *   # our caller will assume ownership of memory, so we have to recreate
+ *   # a copy of c_cert_config here
+ *   cert_config.c_cert_config = grpc_ssl_server_certificate_config_create(             # <<<<<<<<<<<<<<
+ *       cert_config.c_pem_root_certs, cert_config.c_ssl_pem_key_cert_pairs,
+ *       cert_config.c_ssl_pem_key_cert_pairs_count)
+ */
+  __pyx_v_cert_config->c_cert_config = grpc_ssl_server_certificate_config_create(__pyx_v_cert_config->c_pem_root_certs, __pyx_v_cert_config->c_ssl_pem_key_cert_pairs, __pyx_v_cert_config->c_ssl_pem_key_cert_pairs_count);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":353
+ *       cert_config.c_pem_root_certs, cert_config.c_ssl_pem_key_cert_pairs,
+ *       cert_config.c_ssl_pem_key_cert_pairs_count)
+ *   return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":318
+ *   return credentials
+ * 
+ * cdef grpc_ssl_certificate_config_reload_status _server_cert_config_fetcher_wrapper(             # <<<<<<<<<<<<<<
+ *         void* user_data, grpc_ssl_server_certificate_config **config) noexcept with gil:
+ *   # This is a credentials.ServerCertificateConfig
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_WriteUnraisable("_cython.cygrpc._server_cert_config_fetcher_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_r = (grpc_ssl_certificate_config_reload_status) 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_cert_config);
+  __Pyx_XDECREF((PyObject *)__pyx_v_credentials);
+  __Pyx_XDECREF(__pyx_v_user_cb);
+  __Pyx_XDECREF(__pyx_v_cert_config_wrapper);
+  __Pyx_RefNannyFinishContext();
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":362
+ * cdef class LocalChannelCredentials(ChannelCredentials):
+ * 
+ *   def __cinit__(self, grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *     self._local_connect_type = local_connect_type
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  grpc_local_connect_type __pyx_v_local_connect_type;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_local_connect_type,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_local_connect_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 362, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 362, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_local_connect_type = ((grpc_local_connect_type)__Pyx_PyInt_As_grpc_local_connect_type(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 362, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 362, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.LocalChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *)__pyx_v_self), __pyx_v_local_connect_type);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *__pyx_v_self, grpc_local_connect_type __pyx_v_local_connect_type) {
+  int __pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":363
+ * 
+ *   def __cinit__(self, grpc_local_connect_type local_connect_type):
+ *     self._local_connect_type = local_connect_type             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+  __pyx_v_self->_local_connect_type = __pyx_v_local_connect_type;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":362
+ * cdef class LocalChannelCredentials(ChannelCredentials):
+ * 
+ *   def __cinit__(self, grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *     self._local_connect_type = local_connect_type
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":365
+ *     self._local_connect_type = local_connect_type
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef grpc_local_connect_type local_connect_type
+ *     local_connect_type = self._local_connect_type
+ */
+
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_23LocalChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *__pyx_v_self) {
+  grpc_local_connect_type __pyx_v_local_connect_type;
+  grpc_channel_credentials *__pyx_r;
+  grpc_local_connect_type __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":367
+ *   cdef grpc_channel_credentials *c(self) except *:
+ *     cdef grpc_local_connect_type local_connect_type
+ *     local_connect_type = self._local_connect_type             # <<<<<<<<<<<<<<
+ *     return grpc_local_credentials_create(local_connect_type)
+ * 
+ */
+  __pyx_t_1 = __pyx_v_self->_local_connect_type;
+  __pyx_v_local_connect_type = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":368
+ *     cdef grpc_local_connect_type local_connect_type
+ *     local_connect_type = self._local_connect_type
+ *     return grpc_local_credentials_create(local_connect_type)             # <<<<<<<<<<<<<<
+ * 
+ * def channel_credentials_local(grpc_local_connect_type local_connect_type):
+ */
+  __pyx_r = grpc_local_credentials_create(__pyx_v_local_connect_type);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":365
+ *     self._local_connect_type = local_connect_type
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef grpc_local_connect_type local_connect_type
+ *     local_connect_type = self._local_connect_type
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23LocalChannelCredentials_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.LocalChannelCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23LocalChannelCredentials_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.LocalChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23LocalChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.LocalChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":370
+ *     return grpc_local_credentials_create(local_connect_type)
+ * 
+ * def channel_credentials_local(grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *   return LocalChannelCredentials(local_connect_type)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29channel_credentials_local(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29channel_credentials_local = {"channel_credentials_local", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29channel_credentials_local, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29channel_credentials_local(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_local_connect_type __pyx_v_local_connect_type;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channel_credentials_local (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_local_connect_type,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_local_connect_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 370, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channel_credentials_local") < 0)) __PYX_ERR(5, 370, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_local_connect_type = ((grpc_local_connect_type)__Pyx_PyInt_As_grpc_local_connect_type(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 370, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channel_credentials_local", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 370, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channel_credentials_local", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28channel_credentials_local(__pyx_self, __pyx_v_local_connect_type);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28channel_credentials_local(CYTHON_UNUSED PyObject *__pyx_self, grpc_local_connect_type __pyx_v_local_connect_type) {
+  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("channel_credentials_local", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":371
+ * 
+ * def channel_credentials_local(grpc_local_connect_type local_connect_type):
+ *   return LocalChannelCredentials(local_connect_type)             # <<<<<<<<<<<<<<
+ * 
+ * cdef class InsecureChannelCredentials(ChannelCredentials):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_local_connect_type(__pyx_v_local_connect_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 371, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 371, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":370
+ *     return grpc_local_credentials_create(local_connect_type)
+ * 
+ * def channel_credentials_local(grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *   return LocalChannelCredentials(local_connect_type)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.channel_credentials_local", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":375
+ * cdef class InsecureChannelCredentials(ChannelCredentials):
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     return grpc_insecure_credentials_create()
+ * 
+ */
+
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_26InsecureChannelCredentials_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *__pyx_v_self) {
+  grpc_channel_credentials *__pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":376
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ *     return grpc_insecure_credentials_create()             # <<<<<<<<<<<<<<
+ * 
+ * def channel_credentials_insecure():
+ */
+  __pyx_r = grpc_insecure_credentials_create();
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":375
+ * cdef class InsecureChannelCredentials(ChannelCredentials):
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     return grpc_insecure_credentials_create()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_26InsecureChannelCredentials_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_26InsecureChannelCredentials_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_26InsecureChannelCredentials_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_26InsecureChannelCredentials_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_26InsecureChannelCredentials___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_26InsecureChannelCredentials___reduce_cython__(struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_v_state = 0;
+  PyObject *__pyx_v__dict = 0;
+  int __pyx_v_use_setstate;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__reduce_cython__", 1);
+
+  /* "(tree fragment)":5
+ *     cdef object _dict
+ *     cdef bint use_setstate
+ *     state = ()             # <<<<<<<<<<<<<<
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ */
+  __Pyx_INCREF(__pyx_empty_tuple);
+  __pyx_v_state = __pyx_empty_tuple;
+
+  /* "(tree fragment)":6
+ *     cdef bint use_setstate
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)             # <<<<<<<<<<<<<<
+ *     if _dict is not None:
+ *         state += (_dict,)
+ */
+  __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v__dict = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":7
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+  __pyx_t_2 = (__pyx_v__dict != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":8
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ *         state += (_dict,)             # <<<<<<<<<<<<<<
+ *         use_setstate = True
+ *     else:
+ */
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_v__dict);
+    __Pyx_GIVEREF(__pyx_v__dict);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(10, 8, __pyx_L1_error);
+    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3));
+    __pyx_t_3 = 0;
+
+    /* "(tree fragment)":9
+ *     if _dict is not None:
+ *         state += (_dict,)
+ *         use_setstate = True             # <<<<<<<<<<<<<<
+ *     else:
+ *         use_setstate = False
+ */
+    __pyx_v_use_setstate = 1;
+
+    /* "(tree fragment)":7
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+    goto __pyx_L3;
+  }
+
+  /* "(tree fragment)":11
+ *         use_setstate = True
+ *     else:
+ *         use_setstate = False             # <<<<<<<<<<<<<<
+ *     if use_setstate:
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, None), state
+ */
+  /*else*/ {
+    __pyx_v_use_setstate = 0;
+  }
+  __pyx_L3:;
+
+  /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = False
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, None), state
+ *     else:
+ */
+  if (__pyx_v_use_setstate) {
+
+    /* "(tree fragment)":13
+ *         use_setstate = False
+ *     if use_setstate:
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, None), state             # <<<<<<<<<<<<<<
+ *     else:
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, state)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_InsecureChannelCr); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_238750788);
+    __Pyx_GIVEREF(__pyx_int_238750788);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_238750788)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_3);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_3 = 0;
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_4;
+    __pyx_t_4 = 0;
+    goto __pyx_L0;
+
+    /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = False
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, None), state
+ *     else:
+ */
+  }
+
+  /* "(tree fragment)":15
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, None), state
+ *     else:
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, state)             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle_InsecureChannelCredentials__set_state(self, __pyx_state)
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_InsecureChannelCr); if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_238750788);
+    __Pyx_GIVEREF(__pyx_int_238750788);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_238750788)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_4);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_4 = 0;
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_3;
+    __pyx_t_3 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.InsecureChannelCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_state);
+  __Pyx_XDECREF(__pyx_v__dict);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_InsecureChannelCredentials__set_state(self, __pyx_state)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_26InsecureChannelCredentials_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_26InsecureChannelCredentials_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_26InsecureChannelCredentials_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_26InsecureChannelCredentials_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 16, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 16, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 16, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.InsecureChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_26InsecureChannelCredentials_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_26InsecureChannelCredentials_2__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+  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("__setstate_cython__", 1);
+
+  /* "(tree fragment)":17
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle_InsecureChannelCredentials__set_state(self, __pyx_state)             # <<<<<<<<<<<<<<
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 17, __pyx_L1_error)
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle_InsecureChannelCredentials__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_InsecureChannelCredentials__set_state(self, __pyx_state)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.InsecureChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":378
+ *     return grpc_insecure_credentials_create()
+ * 
+ * def channel_credentials_insecure():             # <<<<<<<<<<<<<<
+ *   return InsecureChannelCredentials()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_31channel_credentials_insecure(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_31channel_credentials_insecure = {"channel_credentials_insecure", (PyCFunction)__pyx_pw_7_cython_6cygrpc_31channel_credentials_insecure, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_31channel_credentials_insecure(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channel_credentials_insecure (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30channel_credentials_insecure(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30channel_credentials_insecure(CYTHON_UNUSED PyObject *__pyx_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("channel_credentials_insecure", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":379
+ * 
+ * def channel_credentials_insecure():
+ *   return InsecureChannelCredentials()             # <<<<<<<<<<<<<<
+ * 
+ * def server_credentials_local(grpc_local_connect_type local_connect_type):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 379, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":378
+ *     return grpc_insecure_credentials_create()
+ * 
+ * def channel_credentials_insecure():             # <<<<<<<<<<<<<<
+ *   return InsecureChannelCredentials()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.channel_credentials_insecure", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":381
+ *   return InsecureChannelCredentials()
+ * 
+ * def server_credentials_local(grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_33server_credentials_local(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_33server_credentials_local = {"server_credentials_local", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_33server_credentials_local, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_33server_credentials_local(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_local_connect_type __pyx_v_local_connect_type;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("server_credentials_local (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_local_connect_type,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_local_connect_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 381, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "server_credentials_local") < 0)) __PYX_ERR(5, 381, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_local_connect_type = ((grpc_local_connect_type)__Pyx_PyInt_As_grpc_local_connect_type(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 381, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("server_credentials_local", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 381, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.server_credentials_local", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_32server_credentials_local(__pyx_self, __pyx_v_local_connect_type);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_32server_credentials_local(CYTHON_UNUSED PyObject *__pyx_self, grpc_local_connect_type __pyx_v_local_connect_type) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_credentials = 0;
+  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("server_credentials_local", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":382
+ * 
+ * def server_credentials_local(grpc_local_connect_type local_connect_type):
+ *   cdef ServerCredentials credentials = ServerCredentials()             # <<<<<<<<<<<<<<
+ *   credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type)
+ *   return credentials
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ServerCredentials)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 382, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":383
+ * def server_credentials_local(grpc_local_connect_type local_connect_type):
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type)             # <<<<<<<<<<<<<<
+ *   return credentials
+ * 
+ */
+  __pyx_v_credentials->c_credentials = grpc_local_server_credentials_create(__pyx_v_local_connect_type);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":384
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type)
+ *   return credentials             # <<<<<<<<<<<<<<
+ * 
+ * def xds_server_credentials(ServerCredentials fallback_credentials):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_credentials);
+  __pyx_r = ((PyObject *)__pyx_v_credentials);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":381
+ *   return InsecureChannelCredentials()
+ * 
+ * def server_credentials_local(grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.server_credentials_local", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_credentials);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":386
+ *   return credentials
+ * 
+ * def xds_server_credentials(ServerCredentials fallback_credentials):             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_xds_server_credentials_create(fallback_credentials.c_credentials)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_35xds_server_credentials(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_35xds_server_credentials = {"xds_server_credentials", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_35xds_server_credentials, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_35xds_server_credentials(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_fallback_credentials = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("xds_server_credentials (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fallback_credentials,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fallback_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 386, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "xds_server_credentials") < 0)) __PYX_ERR(5, 386, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_fallback_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("xds_server_credentials", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 386, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.xds_server_credentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fallback_credentials), __pyx_ptype_7_cython_6cygrpc_ServerCredentials, 1, "fallback_credentials", 0))) __PYX_ERR(5, 386, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_34xds_server_credentials(__pyx_self, __pyx_v_fallback_credentials);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_34xds_server_credentials(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_fallback_credentials) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_credentials = 0;
+  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("xds_server_credentials", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":387
+ * 
+ * def xds_server_credentials(ServerCredentials fallback_credentials):
+ *   cdef ServerCredentials credentials = ServerCredentials()             # <<<<<<<<<<<<<<
+ *   credentials.c_credentials = grpc_xds_server_credentials_create(fallback_credentials.c_credentials)
+ *   # NOTE: We do not need to call grpc_server_credentials_release on the
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ServerCredentials)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 387, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":388
+ * def xds_server_credentials(ServerCredentials fallback_credentials):
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_xds_server_credentials_create(fallback_credentials.c_credentials)             # <<<<<<<<<<<<<<
+ *   # NOTE: We do not need to call grpc_server_credentials_release on the
+ *   # fallback credentials here because this will be done by the __dealloc__
+ */
+  __pyx_v_credentials->c_credentials = grpc_xds_server_credentials_create(__pyx_v_fallback_credentials->c_credentials);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":392
+ *   # fallback credentials here because this will be done by the __dealloc__
+ *   # method of its Cython wrapper.
+ *   return credentials             # <<<<<<<<<<<<<<
+ * 
+ * def insecure_server_credentials():
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_credentials);
+  __pyx_r = ((PyObject *)__pyx_v_credentials);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":386
+ *   return credentials
+ * 
+ * def xds_server_credentials(ServerCredentials fallback_credentials):             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_xds_server_credentials_create(fallback_credentials.c_credentials)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.xds_server_credentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_credentials);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":394
+ *   return credentials
+ * 
+ * def insecure_server_credentials():             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_insecure_server_credentials_create()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_37insecure_server_credentials(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_37insecure_server_credentials = {"insecure_server_credentials", (PyCFunction)__pyx_pw_7_cython_6cygrpc_37insecure_server_credentials, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_37insecure_server_credentials(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insecure_server_credentials (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_36insecure_server_credentials(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_36insecure_server_credentials(CYTHON_UNUSED PyObject *__pyx_self) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_credentials = 0;
+  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("insecure_server_credentials", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":395
+ * 
+ * def insecure_server_credentials():
+ *   cdef ServerCredentials credentials = ServerCredentials()             # <<<<<<<<<<<<<<
+ *   credentials.c_credentials = grpc_insecure_server_credentials_create()
+ *   return credentials
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ServerCredentials)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 395, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":396
+ * def insecure_server_credentials():
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_insecure_server_credentials_create()             # <<<<<<<<<<<<<<
+ *   return credentials
+ * 
+ */
+  __pyx_v_credentials->c_credentials = grpc_insecure_server_credentials_create();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":397
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_insecure_server_credentials_create()
+ *   return credentials             # <<<<<<<<<<<<<<
+ * 
+ * cdef class ALTSChannelCredentials(ChannelCredentials):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_credentials);
+  __pyx_r = ((PyObject *)__pyx_v_credentials);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":394
+ *   return credentials
+ * 
+ * def insecure_server_credentials():             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_insecure_server_credentials_create()
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.insecure_server_credentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_credentials);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":401
+ * cdef class ALTSChannelCredentials(ChannelCredentials):
+ * 
+ *   def __cinit__(self, list service_accounts):             # <<<<<<<<<<<<<<
+ *     self.c_options = grpc_alts_credentials_client_options_create()
+ *     cdef str account
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_service_accounts = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_service_accounts,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_service_accounts)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 401, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 401, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_service_accounts = ((PyObject*)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 401, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ALTSChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_service_accounts), (&PyList_Type), 1, "service_accounts", 1))) __PYX_ERR(5, 401, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *)__pyx_v_self), __pyx_v_service_accounts);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self, PyObject *__pyx_v_service_accounts) {
+  PyObject *__pyx_v_account = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  char const *__pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":402
+ * 
+ *   def __cinit__(self, list service_accounts):
+ *     self.c_options = grpc_alts_credentials_client_options_create()             # <<<<<<<<<<<<<<
+ *     cdef str account
+ *     for account in service_accounts:
+ */
+  __pyx_v_self->c_options = grpc_alts_credentials_client_options_create();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":404
+ *     self.c_options = grpc_alts_credentials_client_options_create()
+ *     cdef str account
+ *     for account in service_accounts:             # <<<<<<<<<<<<<<
+ *       grpc_alts_credentials_client_options_add_target_service_account(
+ *           self.c_options, str_to_bytes(account))
+ */
+  if (unlikely(__pyx_v_service_accounts == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    __PYX_ERR(5, 404, __pyx_L1_error)
+  }
+  __pyx_t_1 = __pyx_v_service_accounts; __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = 0;
+  for (;;) {
+    {
+      Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+      #if !CYTHON_ASSUME_SAFE_MACROS
+      if (unlikely((__pyx_temp < 0))) __PYX_ERR(5, 404, __pyx_L1_error)
+      #endif
+      if (__pyx_t_2 >= __pyx_temp) break;
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(5, 404, __pyx_L1_error)
+    #else
+    __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 404, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    #endif
+    if (!(likely(PyString_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_3))) __PYX_ERR(5, 404, __pyx_L1_error)
+    __Pyx_XDECREF_SET(__pyx_v_account, ((PyObject*)__pyx_t_3));
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":406
+ *     for account in service_accounts:
+ *       grpc_alts_credentials_client_options_add_target_service_account(
+ *           self.c_options, str_to_bytes(account))             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+    __pyx_t_3 = __pyx_f_7_cython_6cygrpc_str_to_bytes(__pyx_v_account); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 406, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    if (unlikely(__pyx_t_3 == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+      __PYX_ERR(5, 406, __pyx_L1_error)
+    }
+    __pyx_t_4 = __Pyx_PyBytes_AsString(__pyx_t_3); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) __PYX_ERR(5, 406, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":405
+ *     cdef str account
+ *     for account in service_accounts:
+ *       grpc_alts_credentials_client_options_add_target_service_account(             # <<<<<<<<<<<<<<
+ *           self.c_options, str_to_bytes(account))
+ * 
+ */
+    grpc_alts_credentials_client_options_add_target_service_account(__pyx_v_self->c_options, __pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":404
+ *     self.c_options = grpc_alts_credentials_client_options_create()
+ *     cdef str account
+ *     for account in service_accounts:             # <<<<<<<<<<<<<<
+ *       grpc_alts_credentials_client_options_add_target_service_account(
+ *           self.c_options, str_to_bytes(account))
+ */
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":401
+ * cdef class ALTSChannelCredentials(ChannelCredentials):
+ * 
+ *   def __cinit__(self, list service_accounts):             # <<<<<<<<<<<<<<
+ *     self.c_options = grpc_alts_credentials_client_options_create()
+ *     cdef str account
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.ALTSChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_account);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":408
+ *           self.c_options, str_to_bytes(account))
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self.c_options != NULL:
+ *       grpc_alts_credentials_options_destroy(self.c_options)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":409
+ * 
+ *   def __dealloc__(self):
+ *     if self.c_options != NULL:             # <<<<<<<<<<<<<<
+ *       grpc_alts_credentials_options_destroy(self.c_options)
+ * 
+ */
+  __pyx_t_1 = (__pyx_v_self->c_options != NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":410
+ *   def __dealloc__(self):
+ *     if self.c_options != NULL:
+ *       grpc_alts_credentials_options_destroy(self.c_options)             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+    grpc_alts_credentials_options_destroy(__pyx_v_self->c_options);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":409
+ * 
+ *   def __dealloc__(self):
+ *     if self.c_options != NULL:             # <<<<<<<<<<<<<<
+ *       grpc_alts_credentials_options_destroy(self.c_options)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":408
+ *           self.c_options, str_to_bytes(account))
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self.c_options != NULL:
+ *       grpc_alts_credentials_options_destroy(self.c_options)
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":412
+ *       grpc_alts_credentials_options_destroy(self.c_options)
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     return grpc_alts_credentials_create(self.c_options)
+ * 
+ */
+
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_22ALTSChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self) {
+  grpc_channel_credentials *__pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":413
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ *     return grpc_alts_credentials_create(self.c_options)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = grpc_alts_credentials_create(__pyx_v_self->c_options);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":412
+ *       grpc_alts_credentials_options_destroy(self.c_options)
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     return grpc_alts_credentials_create(self.c_options)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_22ALTSChannelCredentials_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ALTSChannelCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_22ALTSChannelCredentials_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ALTSChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_22ALTSChannelCredentials_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ALTSChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":416
+ * 
+ * 
+ * def channel_credentials_alts(list service_accounts):             # <<<<<<<<<<<<<<
+ *   return ALTSChannelCredentials(service_accounts)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_39channel_credentials_alts(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_39channel_credentials_alts = {"channel_credentials_alts", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_39channel_credentials_alts, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_39channel_credentials_alts(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_service_accounts = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channel_credentials_alts (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_service_accounts,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_service_accounts)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 416, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channel_credentials_alts") < 0)) __PYX_ERR(5, 416, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_service_accounts = ((PyObject*)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channel_credentials_alts", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 416, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channel_credentials_alts", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_service_accounts), (&PyList_Type), 1, "service_accounts", 1))) __PYX_ERR(5, 416, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_38channel_credentials_alts(__pyx_self, __pyx_v_service_accounts);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_38channel_credentials_alts(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_service_accounts) {
+  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("channel_credentials_alts", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":417
+ * 
+ * def channel_credentials_alts(list service_accounts):
+ *   return ALTSChannelCredentials(service_accounts)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials), __pyx_v_service_accounts); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 417, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":416
+ * 
+ * 
+ * def channel_credentials_alts(list service_accounts):             # <<<<<<<<<<<<<<
+ *   return ALTSChannelCredentials(service_accounts)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.channel_credentials_alts", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":420
+ * 
+ * 
+ * def server_credentials_alts():             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   cdef grpc_alts_credentials_options* c_options = grpc_alts_credentials_server_options_create()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_41server_credentials_alts(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_41server_credentials_alts = {"server_credentials_alts", (PyCFunction)__pyx_pw_7_cython_6cygrpc_41server_credentials_alts, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_41server_credentials_alts(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("server_credentials_alts (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_40server_credentials_alts(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_40server_credentials_alts(CYTHON_UNUSED PyObject *__pyx_self) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_credentials = 0;
+  grpc_alts_credentials_options *__pyx_v_c_options;
+  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("server_credentials_alts", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":421
+ * 
+ * def server_credentials_alts():
+ *   cdef ServerCredentials credentials = ServerCredentials()             # <<<<<<<<<<<<<<
+ *   cdef grpc_alts_credentials_options* c_options = grpc_alts_credentials_server_options_create()
+ *   credentials.c_credentials = grpc_alts_server_credentials_create(c_options)
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ServerCredentials)); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 421, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":422
+ * def server_credentials_alts():
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   cdef grpc_alts_credentials_options* c_options = grpc_alts_credentials_server_options_create()             # <<<<<<<<<<<<<<
+ *   credentials.c_credentials = grpc_alts_server_credentials_create(c_options)
+ *   # Options can be destroyed as deep copy was performed.
+ */
+  __pyx_v_c_options = grpc_alts_credentials_server_options_create();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":423
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   cdef grpc_alts_credentials_options* c_options = grpc_alts_credentials_server_options_create()
+ *   credentials.c_credentials = grpc_alts_server_credentials_create(c_options)             # <<<<<<<<<<<<<<
+ *   # Options can be destroyed as deep copy was performed.
+ *   grpc_alts_credentials_options_destroy(c_options)
+ */
+  __pyx_v_credentials->c_credentials = grpc_alts_server_credentials_create(__pyx_v_c_options);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":425
+ *   credentials.c_credentials = grpc_alts_server_credentials_create(c_options)
+ *   # Options can be destroyed as deep copy was performed.
+ *   grpc_alts_credentials_options_destroy(c_options)             # <<<<<<<<<<<<<<
+ *   return credentials
+ * 
+ */
+  grpc_alts_credentials_options_destroy(__pyx_v_c_options);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":426
+ *   # Options can be destroyed as deep copy was performed.
+ *   grpc_alts_credentials_options_destroy(c_options)
+ *   return credentials             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_credentials);
+  __pyx_r = ((PyObject *)__pyx_v_credentials);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":420
+ * 
+ * 
+ * def server_credentials_alts():             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   cdef grpc_alts_credentials_options* c_options = grpc_alts_credentials_server_options_create()
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.server_credentials_alts", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_credentials);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":433
+ *   cdef grpc_call_credentials* _call_creds
+ * 
+ *   def __cinit__(self, CallCredentials call_creds):             # <<<<<<<<<<<<<<
+ *     self._c_creds = NULL
+ *     self._call_creds = call_creds.c()
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_creds = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call_creds,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_creds)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 433, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(5, 433, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_call_creds = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 433, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ComputeEngineChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_creds), __pyx_ptype_7_cython_6cygrpc_CallCredentials, 1, "call_creds", 0))) __PYX_ERR(5, 433, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *)__pyx_v_self), __pyx_v_call_creds);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials___cinit__(struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_creds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  grpc_call_credentials *__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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":434
+ * 
+ *   def __cinit__(self, CallCredentials call_creds):
+ *     self._c_creds = NULL             # <<<<<<<<<<<<<<
+ *     self._call_creds = call_creds.c()
+ *     if self._call_creds == NULL:
+ */
+  __pyx_v_self->_c_creds = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":435
+ *   def __cinit__(self, CallCredentials call_creds):
+ *     self._c_creds = NULL
+ *     self._call_creds = call_creds.c()             # <<<<<<<<<<<<<<
+ *     if self._call_creds == NULL:
+ *       raise ValueError("Call credentials may not be NULL.")
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials *)__pyx_v_call_creds->__pyx_vtab)->c(__pyx_v_call_creds); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 435, __pyx_L1_error)
+  __pyx_v_self->_call_creds = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":436
+ *     self._c_creds = NULL
+ *     self._call_creds = call_creds.c()
+ *     if self._call_creds == NULL:             # <<<<<<<<<<<<<<
+ *       raise ValueError("Call credentials may not be NULL.")
+ * 
+ */
+  __pyx_t_2 = (__pyx_v_self->_call_creds == NULL);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":437
+ *     self._call_creds = call_creds.c()
+ *     if self._call_creds == NULL:
+ *       raise ValueError("Call credentials may not be NULL.")             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 437, __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_ERR(5, 437, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":436
+ *     self._c_creds = NULL
+ *     self._call_creds = call_creds.c()
+ *     if self._call_creds == NULL:             # <<<<<<<<<<<<<<
+ *       raise ValueError("Call credentials may not be NULL.")
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":433
+ *   cdef grpc_call_credentials* _call_creds
+ * 
+ *   def __cinit__(self, CallCredentials call_creds):             # <<<<<<<<<<<<<<
+ *     self._c_creds = NULL
+ *     self._call_creds = call_creds.c()
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.ComputeEngineChannelCredentials.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":439
+ *       raise ValueError("Call credentials may not be NULL.")
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       self._c_creds = grpc_google_default_credentials_create(self._call_creds)
+ */
+
+static grpc_channel_credentials *__pyx_f_7_cython_6cygrpc_31ComputeEngineChannelCredentials_c(struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_v_self) {
+  grpc_channel_credentials *__pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":440
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       self._c_creds = grpc_google_default_credentials_create(self._call_creds)
+ *       return self._c_creds
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":441
+ *   cdef grpc_channel_credentials *c(self) except *:
+ *     with nogil:
+ *       self._c_creds = grpc_google_default_credentials_create(self._call_creds)             # <<<<<<<<<<<<<<
+ *       return self._c_creds
+ * 
+ */
+        __pyx_v_self->_c_creds = grpc_google_default_credentials_create(__pyx_v_self->_call_creds);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":442
+ *     with nogil:
+ *       self._c_creds = grpc_google_default_credentials_create(self._call_creds)
+ *       return self._c_creds             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+        __pyx_r = __pyx_v_self->_c_creds;
+        goto __pyx_L3_return;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":440
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       self._c_creds = grpc_google_default_credentials_create(self._call_creds)
+ *       return self._c_creds
+ */
+      /*finally:*/ {
+        __pyx_L3_return: {
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L0;
+        }
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":439
+ *       raise ValueError("Call credentials may not be NULL.")
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       self._c_creds = grpc_google_default_credentials_create(self._call_creds)
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_31ComputeEngineChannelCredentials_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ComputeEngineChannelCredentials.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_31ComputeEngineChannelCredentials_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ComputeEngineChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ComputeEngineChannelCredentials_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ComputeEngineChannelCredentials.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":445
+ * 
+ * 
+ * def channel_credentials_compute_engine(call_creds):             # <<<<<<<<<<<<<<
+ *   return ComputeEngineChannelCredentials(call_creds)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_43channel_credentials_compute_engine(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_43channel_credentials_compute_engine = {"channel_credentials_compute_engine", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_43channel_credentials_compute_engine, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_43channel_credentials_compute_engine(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_call_creds = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("channel_credentials_compute_engine (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call_creds,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_creds)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 445, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "channel_credentials_compute_engine") < 0)) __PYX_ERR(5, 445, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_call_creds = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("channel_credentials_compute_engine", 1, 1, 1, __pyx_nargs); __PYX_ERR(5, 445, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.channel_credentials_compute_engine", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_42channel_credentials_compute_engine(__pyx_self, __pyx_v_call_creds);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_42channel_credentials_compute_engine(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_call_creds) {
+  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("channel_credentials_compute_engine", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":446
+ * 
+ * def channel_credentials_compute_engine(call_creds):
+ *   return ComputeEngineChannelCredentials(call_creds)             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials), __pyx_v_call_creds); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 446, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":445
+ * 
+ * 
+ * def channel_credentials_compute_engine(call_creds):             # <<<<<<<<<<<<<<
+ *   return ComputeEngineChannelCredentials(call_creds)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.channel_credentials_compute_engine", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":18
+ * g_interrupt_check_period_ms = 200
+ * 
+ * cdef grpc_event _next(grpc_completion_queue *c_completion_queue, deadline) except *:             # <<<<<<<<<<<<<<
+ *   global g_interrupt_check_period_ms
+ *   cdef gpr_timespec c_increment
+ */
+
+static grpc_event __pyx_f_7_cython_6cygrpc__next(grpc_completion_queue *__pyx_v_c_completion_queue, PyObject *__pyx_v_deadline) {
+  gpr_timespec __pyx_v_c_increment;
+  gpr_timespec __pyx_v_c_timeout;
+  gpr_timespec __pyx_v_c_deadline;
+  grpc_event __pyx_v_c_event;
+  grpc_event __pyx_r;
+  int __pyx_t_1;
+  gpr_timespec __pyx_t_2;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":23
+ *   cdef gpr_timespec c_timeout
+ *   cdef gpr_timespec c_deadline
+ *   c_increment = gpr_time_from_millis(g_interrupt_check_period_ms, GPR_TIMESPAN)             # <<<<<<<<<<<<<<
+ *   if deadline is None:
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)
+ */
+  __pyx_v_c_increment = gpr_time_from_millis(__pyx_v_7_cython_6cygrpc_g_interrupt_check_period_ms, GPR_TIMESPAN);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":24
+ *   cdef gpr_timespec c_deadline
+ *   c_increment = gpr_time_from_millis(g_interrupt_check_period_ms, GPR_TIMESPAN)
+ *   if deadline is None:             # <<<<<<<<<<<<<<
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)
+ *   else:
+ */
+  __pyx_t_1 = (__pyx_v_deadline == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":25
+ *   c_increment = gpr_time_from_millis(g_interrupt_check_period_ms, GPR_TIMESPAN)
+ *   if deadline is None:
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)             # <<<<<<<<<<<<<<
+ *   else:
+ *     c_deadline = _timespec_from_time(deadline)
+ */
+    __pyx_v_c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":24
+ *   cdef gpr_timespec c_deadline
+ *   c_increment = gpr_time_from_millis(g_interrupt_check_period_ms, GPR_TIMESPAN)
+ *   if deadline is None:             # <<<<<<<<<<<<<<
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)
+ *   else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":27
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)
+ *   else:
+ *     c_deadline = _timespec_from_time(deadline)             # <<<<<<<<<<<<<<
+ * 
+ *   while True:
+ */
+  /*else*/ {
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc__timespec_from_time(__pyx_v_deadline); if (unlikely(PyErr_Occurred())) __PYX_ERR(15, 27, __pyx_L1_error)
+    __pyx_v_c_deadline = __pyx_t_2;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":29
+ *     c_deadline = _timespec_from_time(deadline)
+ * 
+ *   while True:             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       c_timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c_increment)
+ */
+  while (1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":30
+ * 
+ *   while True:
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       c_timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c_increment)
+ *       if gpr_time_cmp(c_timeout, c_deadline) > 0:
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":31
+ *   while True:
+ *     with nogil:
+ *       c_timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c_increment)             # <<<<<<<<<<<<<<
+ *       if gpr_time_cmp(c_timeout, c_deadline) > 0:
+ *         c_timeout = c_deadline
+ */
+          __pyx_v_c_timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), __pyx_v_c_increment);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":32
+ *     with nogil:
+ *       c_timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c_increment)
+ *       if gpr_time_cmp(c_timeout, c_deadline) > 0:             # <<<<<<<<<<<<<<
+ *         c_timeout = c_deadline
+ * 
+ */
+          __pyx_t_1 = (gpr_time_cmp(__pyx_v_c_timeout, __pyx_v_c_deadline) > 0);
+          if (__pyx_t_1) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":33
+ *       c_timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c_increment)
+ *       if gpr_time_cmp(c_timeout, c_deadline) > 0:
+ *         c_timeout = c_deadline             # <<<<<<<<<<<<<<
+ * 
+ *       c_event = grpc_completion_queue_next(c_completion_queue, c_timeout, NULL)
+ */
+            __pyx_v_c_timeout = __pyx_v_c_deadline;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":32
+ *     with nogil:
+ *       c_timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c_increment)
+ *       if gpr_time_cmp(c_timeout, c_deadline) > 0:             # <<<<<<<<<<<<<<
+ *         c_timeout = c_deadline
+ * 
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":35
+ *         c_timeout = c_deadline
+ * 
+ *       c_event = grpc_completion_queue_next(c_completion_queue, c_timeout, NULL)             # <<<<<<<<<<<<<<
+ * 
+ *       if (c_event.type != GRPC_QUEUE_TIMEOUT or
+ */
+          __pyx_v_c_event = grpc_completion_queue_next(__pyx_v_c_completion_queue, __pyx_v_c_timeout, NULL);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":37
+ *       c_event = grpc_completion_queue_next(c_completion_queue, c_timeout, NULL)
+ * 
+ *       if (c_event.type != GRPC_QUEUE_TIMEOUT or             # <<<<<<<<<<<<<<
+ *           gpr_time_cmp(c_timeout, c_deadline) == 0):
+ *         break
+ */
+          __pyx_t_3 = (__pyx_v_c_event.type != GRPC_QUEUE_TIMEOUT);
+          if (!__pyx_t_3) {
+          } else {
+            __pyx_t_1 = __pyx_t_3;
+            goto __pyx_L13_bool_binop_done;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":38
+ * 
+ *       if (c_event.type != GRPC_QUEUE_TIMEOUT or
+ *           gpr_time_cmp(c_timeout, c_deadline) == 0):             # <<<<<<<<<<<<<<
+ *         break
+ * 
+ */
+          __pyx_t_3 = (gpr_time_cmp(__pyx_v_c_timeout, __pyx_v_c_deadline) == 0);
+          __pyx_t_1 = __pyx_t_3;
+          __pyx_L13_bool_binop_done:;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":37
+ *       c_event = grpc_completion_queue_next(c_completion_queue, c_timeout, NULL)
+ * 
+ *       if (c_event.type != GRPC_QUEUE_TIMEOUT or             # <<<<<<<<<<<<<<
+ *           gpr_time_cmp(c_timeout, c_deadline) == 0):
+ *         break
+ */
+          if (__pyx_t_1) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":39
+ *       if (c_event.type != GRPC_QUEUE_TIMEOUT or
+ *           gpr_time_cmp(c_timeout, c_deadline) == 0):
+ *         break             # <<<<<<<<<<<<<<
+ * 
+ *     # Handle any signals
+ */
+            goto __pyx_L7_break;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":37
+ *       c_event = grpc_completion_queue_next(c_completion_queue, c_timeout, NULL)
+ * 
+ *       if (c_event.type != GRPC_QUEUE_TIMEOUT or             # <<<<<<<<<<<<<<
+ *           gpr_time_cmp(c_timeout, c_deadline) == 0):
+ *         break
+ */
+          }
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":30
+ * 
+ *   while True:
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       c_timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c_increment)
+ *       if gpr_time_cmp(c_timeout, c_deadline) > 0:
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L10;
+          }
+          __pyx_L7_break: {
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L5_break;
+          }
+          __pyx_L10:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":42
+ * 
+ *     # Handle any signals
+ *     cpython.PyErr_CheckSignals()             # <<<<<<<<<<<<<<
+ *   return c_event
+ * 
+ */
+    __pyx_t_4 = PyErr_CheckSignals(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(15, 42, __pyx_L1_error)
+  }
+  __pyx_L5_break:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":43
+ *     # Handle any signals
+ *     cpython.PyErr_CheckSignals()
+ *   return c_event             # <<<<<<<<<<<<<<
+ * 
+ * cdef _interpret_event(grpc_event c_event):
+ */
+  __pyx_r = __pyx_v_c_event;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":18
+ * g_interrupt_check_period_ms = 200
+ * 
+ * cdef grpc_event _next(grpc_completion_queue *c_completion_queue, deadline) except *:             # <<<<<<<<<<<<<<
+ *   global g_interrupt_check_period_ms
+ *   cdef gpr_timespec c_increment
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._next", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_pretend_to_initialize(&__pyx_r);
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":45
+ *   return c_event
+ * 
+ * cdef _interpret_event(grpc_event c_event):             # <<<<<<<<<<<<<<
+ *   cdef _Tag tag
+ *   if c_event.type == GRPC_QUEUE_TIMEOUT:
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__interpret_event(grpc_event __pyx_v_c_event) {
+  struct __pyx_obj_7_cython_6cygrpc__Tag *__pyx_v_tag = 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("_interpret_event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":47
+ * cdef _interpret_event(grpc_event c_event):
+ *   cdef _Tag tag
+ *   if c_event.type == GRPC_QUEUE_TIMEOUT:             # <<<<<<<<<<<<<<
+ *     # TODO(ericgribkoff) Do not coopt ConnectivityEvent here.
+ *     return None, ConnectivityEvent(GRPC_QUEUE_TIMEOUT, False, None)
+ */
+  switch (__pyx_v_c_event.type) {
+    case GRPC_QUEUE_TIMEOUT:
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":49
+ *   if c_event.type == GRPC_QUEUE_TIMEOUT:
+ *     # TODO(ericgribkoff) Do not coopt ConnectivityEvent here.
+ *     return None, ConnectivityEvent(GRPC_QUEUE_TIMEOUT, False, None)             # <<<<<<<<<<<<<<
+ *   elif c_event.type == GRPC_QUEUE_SHUTDOWN:
+ *     # NOTE(nathaniel): For now we coopt ConnectivityEvent here.
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_1 = __Pyx_PyInt_From_grpc_completion_type(GRPC_QUEUE_TIMEOUT); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 49, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 49, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1)) __PYX_ERR(15, 49, __pyx_L1_error);
+    __Pyx_INCREF(Py_False);
+    __Pyx_GIVEREF(Py_False);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, Py_False)) __PYX_ERR(15, 49, __pyx_L1_error);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None)) __PYX_ERR(15, 49, __pyx_L1_error);
+    __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 49, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 49, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, Py_None)) __PYX_ERR(15, 49, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(15, 49, __pyx_L1_error);
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":47
+ * cdef _interpret_event(grpc_event c_event):
+ *   cdef _Tag tag
+ *   if c_event.type == GRPC_QUEUE_TIMEOUT:             # <<<<<<<<<<<<<<
+ *     # TODO(ericgribkoff) Do not coopt ConnectivityEvent here.
+ *     return None, ConnectivityEvent(GRPC_QUEUE_TIMEOUT, False, None)
+ */
+    break;
+    case GRPC_QUEUE_SHUTDOWN:
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":52
+ *   elif c_event.type == GRPC_QUEUE_SHUTDOWN:
+ *     # NOTE(nathaniel): For now we coopt ConnectivityEvent here.
+ *     return None, ConnectivityEvent(GRPC_QUEUE_SHUTDOWN, False, None)             # <<<<<<<<<<<<<<
+ *   else:
+ *     tag = <_Tag>c_event.tag
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_2 = __Pyx_PyInt_From_grpc_completion_type(GRPC_QUEUE_SHUTDOWN); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 52, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 52, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_2);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2)) __PYX_ERR(15, 52, __pyx_L1_error);
+    __Pyx_INCREF(Py_False);
+    __Pyx_GIVEREF(Py_False);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, Py_False)) __PYX_ERR(15, 52, __pyx_L1_error);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(15, 52, __pyx_L1_error);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 52, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 52, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(15, 52, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_2);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2)) __PYX_ERR(15, 52, __pyx_L1_error);
+    __pyx_t_2 = 0;
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":50
+ *     # TODO(ericgribkoff) Do not coopt ConnectivityEvent here.
+ *     return None, ConnectivityEvent(GRPC_QUEUE_TIMEOUT, False, None)
+ *   elif c_event.type == GRPC_QUEUE_SHUTDOWN:             # <<<<<<<<<<<<<<
+ *     # NOTE(nathaniel): For now we coopt ConnectivityEvent here.
+ *     return None, ConnectivityEvent(GRPC_QUEUE_SHUTDOWN, False, None)
+ */
+    break;
+    default:
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":54
+ *     return None, ConnectivityEvent(GRPC_QUEUE_SHUTDOWN, False, None)
+ *   else:
+ *     tag = <_Tag>c_event.tag             # <<<<<<<<<<<<<<
+ *     # We receive event tags only after they've been inc-ref'd elsewhere in
+ *     # the code.
+ */
+    __pyx_t_1 = ((PyObject *)__pyx_v_c_event.tag);
+    __Pyx_INCREF(__pyx_t_1);
+    __pyx_v_tag = ((struct __pyx_obj_7_cython_6cygrpc__Tag *)__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":57
+ *     # We receive event tags only after they've been inc-ref'd elsewhere in
+ *     # the code.
+ *     cpython.Py_DECREF(tag)             # <<<<<<<<<<<<<<
+ *     return tag, tag.event(c_event)
+ * 
+ */
+    Py_DECREF(((PyObject *)__pyx_v_tag));
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":58
+ *     # the code.
+ *     cpython.Py_DECREF(tag)
+ *     return tag, tag.event(c_event)             # <<<<<<<<<<<<<<
+ * 
+ * cdef _internal_latent_event(_LatentEventArg latent_event_arg):
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_7_cython_6cygrpc__Tag *)__pyx_v_tag->__pyx_vtab)->event(__pyx_v_tag, __pyx_v_c_event)); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 58, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 58, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF((PyObject *)__pyx_v_tag);
+    __Pyx_GIVEREF((PyObject *)__pyx_v_tag);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_tag))) __PYX_ERR(15, 58, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(15, 58, __pyx_L1_error);
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+    break;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":45
+ *   return c_event
+ * 
+ * cdef _interpret_event(grpc_event c_event):             # <<<<<<<<<<<<<<
+ *   cdef _Tag tag
+ *   if c_event.type == GRPC_QUEUE_TIMEOUT:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._interpret_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_tag);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":60
+ *     return tag, tag.event(c_event)
+ * 
+ * cdef _internal_latent_event(_LatentEventArg latent_event_arg):             # <<<<<<<<<<<<<<
+ *   cdef grpc_event c_event = _next(latent_event_arg.c_completion_queue, latent_event_arg.deadline)
+ *   return _interpret_event(c_event)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__internal_latent_event(struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *__pyx_v_latent_event_arg) {
+  grpc_event __pyx_v_c_event;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  grpc_event __pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_internal_latent_event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":61
+ * 
+ * cdef _internal_latent_event(_LatentEventArg latent_event_arg):
+ *   cdef grpc_event c_event = _next(latent_event_arg.c_completion_queue, latent_event_arg.deadline)             # <<<<<<<<<<<<<<
+ *   return _interpret_event(c_event)
+ * 
+ */
+  __pyx_t_1 = __pyx_v_latent_event_arg->deadline;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__next(__pyx_v_latent_event_arg->c_completion_queue, __pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(15, 61, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_c_event = __pyx_t_2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":62
+ * cdef _internal_latent_event(_LatentEventArg latent_event_arg):
+ *   cdef grpc_event c_event = _next(latent_event_arg.c_completion_queue, latent_event_arg.deadline)
+ *   return _interpret_event(c_event)             # <<<<<<<<<<<<<<
+ * 
+ * cdef _latent_event(grpc_completion_queue *c_completion_queue, object deadline):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__interpret_event(__pyx_v_c_event); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":60
+ *     return tag, tag.event(c_event)
+ * 
+ * cdef _internal_latent_event(_LatentEventArg latent_event_arg):             # <<<<<<<<<<<<<<
+ *   cdef grpc_event c_event = _next(latent_event_arg.c_completion_queue, latent_event_arg.deadline)
+ *   return _interpret_event(c_event)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._internal_latent_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":64
+ *   return _interpret_event(c_event)
+ * 
+ * cdef _latent_event(grpc_completion_queue *c_completion_queue, object deadline):             # <<<<<<<<<<<<<<
+ *     global g_gevent_activated
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__latent_event(grpc_completion_queue *__pyx_v_c_completion_queue, PyObject *__pyx_v_deadline) {
+  struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *__pyx_v_latent_event_arg = NULL;
+  PyObject *__pyx_v_result = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  unsigned int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_latent_event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":67
+ *     global g_gevent_activated
+ * 
+ *     latent_event_arg = _LatentEventArg()             # <<<<<<<<<<<<<<
+ *     latent_event_arg.c_completion_queue = c_completion_queue
+ *     latent_event_arg.deadline = deadline
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__LatentEventArg)); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_latent_event_arg = ((struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":68
+ * 
+ *     latent_event_arg = _LatentEventArg()
+ *     latent_event_arg.c_completion_queue = c_completion_queue             # <<<<<<<<<<<<<<
+ *     latent_event_arg.deadline = deadline
+ * 
+ */
+  __pyx_v_latent_event_arg->c_completion_queue = __pyx_v_c_completion_queue;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":69
+ *     latent_event_arg = _LatentEventArg()
+ *     latent_event_arg.c_completion_queue = c_completion_queue
+ *     latent_event_arg.deadline = deadline             # <<<<<<<<<<<<<<
+ * 
+ *     if g_gevent_activated:
+ */
+  __Pyx_INCREF(__pyx_v_deadline);
+  __Pyx_GIVEREF(__pyx_v_deadline);
+  __Pyx_GOTREF(__pyx_v_latent_event_arg->deadline);
+  __Pyx_DECREF(__pyx_v_latent_event_arg->deadline);
+  __pyx_v_latent_event_arg->deadline = __pyx_v_deadline;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":71
+ *     latent_event_arg.deadline = deadline
+ * 
+ *     if g_gevent_activated:             # <<<<<<<<<<<<<<
+ *       # For gevent, completion_queue_next is run in a native thread pool.
+ *       global g_gevent_threadpool
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_g_gevent_activated); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 71, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(15, 71, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":75
+ *       global g_gevent_threadpool
+ * 
+ *       result = g_gevent_threadpool.apply(_internal_latent_event, (latent_event_arg,))             # <<<<<<<<<<<<<<
+ *       return result
+ *     else:
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_g_gevent_threadpool); if (unlikely(!__pyx_t_3)) __PYX_ERR(15, 75, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_apply); if (unlikely(!__pyx_t_4)) __PYX_ERR(15, 75, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(__pyx_f_7_cython_6cygrpc__internal_latent_event); if (unlikely(!__pyx_t_3)) __PYX_ERR(15, 75, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(15, 75, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_INCREF((PyObject *)__pyx_v_latent_event_arg);
+    __Pyx_GIVEREF((PyObject *)__pyx_v_latent_event_arg);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_latent_event_arg))) __PYX_ERR(15, 75, __pyx_L1_error);
+    __pyx_t_6 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_t_3, __pyx_t_5};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 75, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __pyx_v_result = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":76
+ * 
+ *       result = g_gevent_threadpool.apply(_internal_latent_event, (latent_event_arg,))
+ *       return result             # <<<<<<<<<<<<<<
+ *     else:
+ *       return _internal_latent_event(latent_event_arg)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(__pyx_v_result);
+    __pyx_r = __pyx_v_result;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":71
+ *     latent_event_arg.deadline = deadline
+ * 
+ *     if g_gevent_activated:             # <<<<<<<<<<<<<<
+ *       # For gevent, completion_queue_next is run in a native thread pool.
+ *       global g_gevent_threadpool
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":78
+ *       return result
+ *     else:
+ *       return _internal_latent_event(latent_event_arg)             # <<<<<<<<<<<<<<
+ * 
+ * cdef class CompletionQueue:
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_1 = __pyx_f_7_cython_6cygrpc__internal_latent_event(__pyx_v_latent_event_arg); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 78, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":64
+ *   return _interpret_event(c_event)
+ * 
+ * cdef _latent_event(grpc_completion_queue *c_completion_queue, object deadline):             # <<<<<<<<<<<<<<
+ *     global g_gevent_activated
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc._latent_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_latent_event_arg);
+  __Pyx_XDECREF(__pyx_v_result);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":82
+ * cdef class CompletionQueue:
+ * 
+ *   def __cinit__(self, shutdown_cq=False):             # <<<<<<<<<<<<<<
+ *     cdef grpc_completion_queue_attributes c_attrs
+ *     fork_handlers_and_grpc_init()
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_15CompletionQueue_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_15CompletionQueue_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_shutdown_cq = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shutdown_cq,0};
+    values[0] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_False));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shutdown_cq);
+          if (value) { values[0] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(15, 82, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(15, 82, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_shutdown_cq = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, __pyx_nargs); __PYX_ERR(15, 82, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CompletionQueue___cinit__(((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self), __pyx_v_shutdown_cq);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_15CompletionQueue___cinit__(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, PyObject *__pyx_v_shutdown_cq) {
+  grpc_completion_queue_attributes __pyx_v_c_attrs;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":84
+ *   def __cinit__(self, shutdown_cq=False):
+ *     cdef grpc_completion_queue_attributes c_attrs
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     if shutdown_cq:
+ *       c_attrs.version = 1
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 84, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 84, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":85
+ *     cdef grpc_completion_queue_attributes c_attrs
+ *     fork_handlers_and_grpc_init()
+ *     if shutdown_cq:             # <<<<<<<<<<<<<<
+ *       c_attrs.version = 1
+ *       c_attrs.cq_completion_type = GRPC_CQ_NEXT
+ */
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_shutdown_cq); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(15, 85, __pyx_L1_error)
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":86
+ *     fork_handlers_and_grpc_init()
+ *     if shutdown_cq:
+ *       c_attrs.version = 1             # <<<<<<<<<<<<<<
+ *       c_attrs.cq_completion_type = GRPC_CQ_NEXT
+ *       c_attrs.cq_polling_type = GRPC_CQ_NON_LISTENING
+ */
+    __pyx_v_c_attrs.version = 1;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":87
+ *     if shutdown_cq:
+ *       c_attrs.version = 1
+ *       c_attrs.cq_completion_type = GRPC_CQ_NEXT             # <<<<<<<<<<<<<<
+ *       c_attrs.cq_polling_type = GRPC_CQ_NON_LISTENING
+ *       c_attrs.cq_shutdown_cb = NULL
+ */
+    __pyx_v_c_attrs.cq_completion_type = GRPC_CQ_NEXT;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":88
+ *       c_attrs.version = 1
+ *       c_attrs.cq_completion_type = GRPC_CQ_NEXT
+ *       c_attrs.cq_polling_type = GRPC_CQ_NON_LISTENING             # <<<<<<<<<<<<<<
+ *       c_attrs.cq_shutdown_cb = NULL
+ *       self.c_completion_queue = grpc_completion_queue_create(
+ */
+    __pyx_v_c_attrs.cq_polling_type = GRPC_CQ_NON_LISTENING;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":89
+ *       c_attrs.cq_completion_type = GRPC_CQ_NEXT
+ *       c_attrs.cq_polling_type = GRPC_CQ_NON_LISTENING
+ *       c_attrs.cq_shutdown_cb = NULL             # <<<<<<<<<<<<<<
+ *       self.c_completion_queue = grpc_completion_queue_create(
+ *           grpc_completion_queue_factory_lookup(&c_attrs), &c_attrs, NULL);
+ */
+    __pyx_v_c_attrs.cq_shutdown_cb = NULL;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":90
+ *       c_attrs.cq_polling_type = GRPC_CQ_NON_LISTENING
+ *       c_attrs.cq_shutdown_cb = NULL
+ *       self.c_completion_queue = grpc_completion_queue_create(             # <<<<<<<<<<<<<<
+ *           grpc_completion_queue_factory_lookup(&c_attrs), &c_attrs, NULL);
+ *     else:
+ */
+    __pyx_v_self->c_completion_queue = grpc_completion_queue_create(grpc_completion_queue_factory_lookup((&__pyx_v_c_attrs)), (&__pyx_v_c_attrs), NULL);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":85
+ *     cdef grpc_completion_queue_attributes c_attrs
+ *     fork_handlers_and_grpc_init()
+ *     if shutdown_cq:             # <<<<<<<<<<<<<<
+ *       c_attrs.version = 1
+ *       c_attrs.cq_completion_type = GRPC_CQ_NEXT
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":93
+ *           grpc_completion_queue_factory_lookup(&c_attrs), &c_attrs, NULL);
+ *     else:
+ *       self.c_completion_queue = grpc_completion_queue_create_for_next(NULL)             # <<<<<<<<<<<<<<
+ *     self.is_shutting_down = False
+ *     self.is_shutdown = False
+ */
+  /*else*/ {
+    __pyx_v_self->c_completion_queue = grpc_completion_queue_create_for_next(NULL);
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":94
+ *     else:
+ *       self.c_completion_queue = grpc_completion_queue_create_for_next(NULL)
+ *     self.is_shutting_down = False             # <<<<<<<<<<<<<<
+ *     self.is_shutdown = False
+ * 
+ */
+  __pyx_v_self->is_shutting_down = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":95
+ *       self.c_completion_queue = grpc_completion_queue_create_for_next(NULL)
+ *     self.is_shutting_down = False
+ *     self.is_shutdown = False             # <<<<<<<<<<<<<<
+ * 
+ *   cdef _interpret_event(self, grpc_event c_event):
+ */
+  __pyx_v_self->is_shutdown = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":82
+ * cdef class CompletionQueue:
+ * 
+ *   def __cinit__(self, shutdown_cq=False):             # <<<<<<<<<<<<<<
+ *     cdef grpc_completion_queue_attributes c_attrs
+ *     fork_handlers_and_grpc_init()
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":97
+ *     self.is_shutdown = False
+ * 
+ *   cdef _interpret_event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     unused_tag, event = _interpret_event(c_event)
+ *     if event.completion_type == GRPC_QUEUE_SHUTDOWN:
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_15CompletionQueue__interpret_event(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  CYTHON_UNUSED PyObject *__pyx_v_unused_tag = NULL;
+  PyObject *__pyx_v_event = 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_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_interpret_event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":98
+ * 
+ *   cdef _interpret_event(self, grpc_event c_event):
+ *     unused_tag, event = _interpret_event(c_event)             # <<<<<<<<<<<<<<
+ *     if event.completion_type == GRPC_QUEUE_SHUTDOWN:
+ *       self.is_shutdown = True
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__interpret_event(__pyx_v_c_event); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 98, __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;
+    Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+    if (unlikely(size != 2)) {
+      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+      __PYX_ERR(15, 98, __pyx_L1_error)
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    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_ERR(15, 98, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(15, 98, __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_ERR(15, 98, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_5 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_4);
+    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_ERR(15, 98, __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_ERR(15, 98, __pyx_L1_error)
+    __pyx_L4_unpacking_done:;
+  }
+  __pyx_v_unused_tag = __pyx_t_2;
+  __pyx_t_2 = 0;
+  __pyx_v_event = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":99
+ *   cdef _interpret_event(self, grpc_event c_event):
+ *     unused_tag, event = _interpret_event(c_event)
+ *     if event.completion_type == GRPC_QUEUE_SHUTDOWN:             # <<<<<<<<<<<<<<
+ *       self.is_shutdown = True
+ *     return event
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event, __pyx_n_s_completion_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 99, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_PyInt_From_grpc_completion_type(GRPC_QUEUE_SHUTDOWN); if (unlikely(!__pyx_t_3)) __PYX_ERR(15, 99, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 99, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(15, 99, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":100
+ *     unused_tag, event = _interpret_event(c_event)
+ *     if event.completion_type == GRPC_QUEUE_SHUTDOWN:
+ *       self.is_shutdown = True             # <<<<<<<<<<<<<<
+ *     return event
+ * 
+ */
+    __pyx_v_self->is_shutdown = 1;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":99
+ *   cdef _interpret_event(self, grpc_event c_event):
+ *     unused_tag, event = _interpret_event(c_event)
+ *     if event.completion_type == GRPC_QUEUE_SHUTDOWN:             # <<<<<<<<<<<<<<
+ *       self.is_shutdown = True
+ *     return event
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":101
+ *     if event.completion_type == GRPC_QUEUE_SHUTDOWN:
+ *       self.is_shutdown = True
+ *     return event             # <<<<<<<<<<<<<<
+ * 
+ *   def _internal_poll(self, deadline):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_event);
+  __pyx_r = __pyx_v_event;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":97
+ *     self.is_shutdown = False
+ * 
+ *   cdef _interpret_event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     unused_tag, event = _interpret_event(c_event)
+ *     if event.completion_type == GRPC_QUEUE_SHUTDOWN:
+ */
+
+  /* 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("_cython.cygrpc.CompletionQueue._interpret_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_unused_tag);
+  __Pyx_XDECREF(__pyx_v_event);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":103
+ *     return event
+ * 
+ *   def _internal_poll(self, deadline):             # <<<<<<<<<<<<<<
+ *     return self._interpret_event(_next(self.c_completion_queue, deadline))
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_3_internal_poll(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CompletionQueue_3_internal_poll = {"_internal_poll", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_3_internal_poll, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_3_internal_poll(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_deadline = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_internal_poll (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_deadline,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_deadline)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(15, 103, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_internal_poll") < 0)) __PYX_ERR(15, 103, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_deadline = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_internal_poll", 1, 1, 1, __pyx_nargs); __PYX_ERR(15, 103, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue._internal_poll", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CompletionQueue_2_internal_poll(((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self), __pyx_v_deadline);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_2_internal_poll(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, PyObject *__pyx_v_deadline) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  grpc_event __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_internal_poll", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":104
+ * 
+ *   def _internal_poll(self, deadline):
+ *     return self._interpret_event(_next(self.c_completion_queue, deadline))             # <<<<<<<<<<<<<<
+ * 
+ *   # We name this 'poll' to avoid problems with CPython's expectations for
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__next(__pyx_v_self->c_completion_queue, __pyx_v_deadline); if (unlikely(PyErr_Occurred())) __PYX_ERR(15, 104, __pyx_L1_error)
+  __pyx_t_2 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self->__pyx_vtab)->_interpret_event(__pyx_v_self, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 104, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":103
+ *     return event
+ * 
+ *   def _internal_poll(self, deadline):             # <<<<<<<<<<<<<<
+ *     return self._interpret_event(_next(self.c_completion_queue, deadline))
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue._internal_poll", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":108
+ *   # We name this 'poll' to avoid problems with CPython's expectations for
+ *   # 'special' methods (like next and __next__).
+ *   def poll(self, deadline=None):             # <<<<<<<<<<<<<<
+ *     global g_gevent_activated
+ *     if g_gevent_activated:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_5poll(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CompletionQueue_5poll = {"poll", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_5poll, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_5poll(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_deadline = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("poll (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_deadline,0};
+    values[0] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_deadline);
+          if (value) { values[0] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(15, 108, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "poll") < 0)) __PYX_ERR(15, 108, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_deadline = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("poll", 0, 0, 1, __pyx_nargs); __PYX_ERR(15, 108, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue.poll", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CompletionQueue_4poll(((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self), __pyx_v_deadline);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_4poll(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, PyObject *__pyx_v_deadline) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  unsigned int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("poll", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":110
+ *   def poll(self, deadline=None):
+ *     global g_gevent_activated
+ *     if g_gevent_activated:             # <<<<<<<<<<<<<<
+ *       return g_gevent_threadpool.apply(CompletionQueue._internal_poll, (self, deadline))
+ *     else:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_g_gevent_activated); if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 110, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(15, 110, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":111
+ *     global g_gevent_activated
+ *     if g_gevent_activated:
+ *       return g_gevent_threadpool.apply(CompletionQueue._internal_poll, (self, deadline))             # <<<<<<<<<<<<<<
+ *     else:
+ *       return self._internal_poll(deadline)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_g_gevent_threadpool); if (unlikely(!__pyx_t_3)) __PYX_ERR(15, 111, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_apply); if (unlikely(!__pyx_t_4)) __PYX_ERR(15, 111, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompletionQueue), __pyx_n_s_internal_poll); if (unlikely(!__pyx_t_3)) __PYX_ERR(15, 111, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(15, 111, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_INCREF((PyObject *)__pyx_v_self);
+    __Pyx_GIVEREF((PyObject *)__pyx_v_self);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_self))) __PYX_ERR(15, 111, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_deadline);
+    __Pyx_GIVEREF(__pyx_v_deadline);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_deadline)) __PYX_ERR(15, 111, __pyx_L1_error);
+    __pyx_t_6 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_t_3, __pyx_t_5};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 111, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":110
+ *   def poll(self, deadline=None):
+ *     global g_gevent_activated
+ *     if g_gevent_activated:             # <<<<<<<<<<<<<<
+ *       return g_gevent_threadpool.apply(CompletionQueue._internal_poll, (self, deadline))
+ *     else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":113
+ *       return g_gevent_threadpool.apply(CompletionQueue._internal_poll, (self, deadline))
+ *     else:
+ *       return self._internal_poll(deadline)             # <<<<<<<<<<<<<<
+ * 
+ *   def shutdown(self):
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_internal_poll); if (unlikely(!__pyx_t_4)) __PYX_ERR(15, 113, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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_7 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_v_deadline};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(15, 113, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":108
+ *   # We name this 'poll' to avoid problems with CPython's expectations for
+ *   # 'special' methods (like next and __next__).
+ *   def poll(self, deadline=None):             # <<<<<<<<<<<<<<
+ *     global g_gevent_activated
+ *     if g_gevent_activated:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue.poll", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":115
+ *       return self._internal_poll(deadline)
+ * 
+ *   def shutdown(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_completion_queue_shutdown(self.c_completion_queue)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_7shutdown(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CompletionQueue_7shutdown = {"shutdown", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_7shutdown, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_7shutdown(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("shutdown (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("shutdown", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "shutdown", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CompletionQueue_6shutdown(((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_6shutdown(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("shutdown", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":116
+ * 
+ *   def shutdown(self):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_completion_queue_shutdown(self.c_completion_queue)
+ *     self.is_shutting_down = True
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":117
+ *   def shutdown(self):
+ *     with nogil:
+ *       grpc_completion_queue_shutdown(self.c_completion_queue)             # <<<<<<<<<<<<<<
+ *     self.is_shutting_down = True
+ * 
+ */
+        grpc_completion_queue_shutdown(__pyx_v_self->c_completion_queue);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":116
+ * 
+ *   def shutdown(self):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_completion_queue_shutdown(self.c_completion_queue)
+ *     self.is_shutting_down = True
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":118
+ *     with nogil:
+ *       grpc_completion_queue_shutdown(self.c_completion_queue)
+ *     self.is_shutting_down = True             # <<<<<<<<<<<<<<
+ * 
+ *   def clear(self):
+ */
+  __pyx_v_self->is_shutting_down = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":115
+ *       return self._internal_poll(deadline)
+ * 
+ *   def shutdown(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_completion_queue_shutdown(self.c_completion_queue)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":120
+ *     self.is_shutting_down = True
+ * 
+ *   def clear(self):             # <<<<<<<<<<<<<<
+ *     if not self.is_shutting_down:
+ *       raise ValueError('queue must be shutting down to be cleared')
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_9clear(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CompletionQueue_9clear = {"clear", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_9clear, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_9clear(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clear (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("clear", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "clear", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CompletionQueue_8clear(((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_8clear(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("clear", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":121
+ * 
+ *   def clear(self):
+ *     if not self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       raise ValueError('queue must be shutting down to be cleared')
+ *     while self.poll().type != GRPC_QUEUE_SHUTDOWN:
+ */
+  __pyx_t_1 = (!__pyx_v_self->is_shutting_down);
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":122
+ *   def clear(self):
+ *     if not self.is_shutting_down:
+ *       raise ValueError('queue must be shutting down to be cleared')             # <<<<<<<<<<<<<<
+ *     while self.poll().type != GRPC_QUEUE_SHUTDOWN:
+ *       pass
+ */
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 122, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(15, 122, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":121
+ * 
+ *   def clear(self):
+ *     if not self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       raise ValueError('queue must be shutting down to be cleared')
+ *     while self.poll().type != GRPC_QUEUE_SHUTDOWN:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":123
+ *     if not self.is_shutting_down:
+ *       raise ValueError('queue must be shutting down to be cleared')
+ *     while self.poll().type != GRPC_QUEUE_SHUTDOWN:             # <<<<<<<<<<<<<<
+ *       pass
+ * 
+ */
+  while (1) {
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_poll); if (unlikely(!__pyx_t_3)) __PYX_ERR(15, 123, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 123, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_type); if (unlikely(!__pyx_t_3)) __PYX_ERR(15, 123, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyInt_From_grpc_completion_type(GRPC_QUEUE_SHUTDOWN); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 123, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(15, 123, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(15, 123, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (!__pyx_t_1) break;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":120
+ *     self.is_shutting_down = True
+ * 
+ *   def clear(self):             # <<<<<<<<<<<<<<
+ *     if not self.is_shutting_down:
+ *       raise ValueError('queue must be shutting down to be cleared')
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue.clear", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":126
+ *       pass
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     cdef gpr_timespec c_deadline
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_15CompletionQueue_11__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_15CompletionQueue_11__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_15CompletionQueue_10__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_15CompletionQueue_10__dealloc__(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self) {
+  gpr_timespec __pyx_v_c_deadline;
+  grpc_event __pyx_v_event;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__dealloc__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":128
+ *   def __dealloc__(self):
+ *     cdef gpr_timespec c_deadline
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)             # <<<<<<<<<<<<<<
+ *     if self.c_completion_queue != NULL:
+ *       # Ensure shutdown
+ */
+  __pyx_v_c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":129
+ *     cdef gpr_timespec c_deadline
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)
+ *     if self.c_completion_queue != NULL:             # <<<<<<<<<<<<<<
+ *       # Ensure shutdown
+ *       if not self.is_shutting_down:
+ */
+  __pyx_t_1 = (__pyx_v_self->c_completion_queue != NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":131
+ *     if self.c_completion_queue != NULL:
+ *       # Ensure shutdown
+ *       if not self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *         grpc_completion_queue_shutdown(self.c_completion_queue)
+ *       # Pump the queue (All outstanding calls should have been cancelled)
+ */
+    __pyx_t_1 = (!__pyx_v_self->is_shutting_down);
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":132
+ *       # Ensure shutdown
+ *       if not self.is_shutting_down:
+ *         grpc_completion_queue_shutdown(self.c_completion_queue)             # <<<<<<<<<<<<<<
+ *       # Pump the queue (All outstanding calls should have been cancelled)
+ *       while not self.is_shutdown:
+ */
+      grpc_completion_queue_shutdown(__pyx_v_self->c_completion_queue);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":131
+ *     if self.c_completion_queue != NULL:
+ *       # Ensure shutdown
+ *       if not self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *         grpc_completion_queue_shutdown(self.c_completion_queue)
+ *       # Pump the queue (All outstanding calls should have been cancelled)
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":134
+ *         grpc_completion_queue_shutdown(self.c_completion_queue)
+ *       # Pump the queue (All outstanding calls should have been cancelled)
+ *       while not self.is_shutdown:             # <<<<<<<<<<<<<<
+ *         event = grpc_completion_queue_next(
+ *             self.c_completion_queue, c_deadline, NULL)
+ */
+    while (1) {
+      __pyx_t_1 = (!__pyx_v_self->is_shutdown);
+      if (!__pyx_t_1) break;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":135
+ *       # Pump the queue (All outstanding calls should have been cancelled)
+ *       while not self.is_shutdown:
+ *         event = grpc_completion_queue_next(             # <<<<<<<<<<<<<<
+ *             self.c_completion_queue, c_deadline, NULL)
+ *         self._interpret_event(event)
+ */
+      __pyx_v_event = grpc_completion_queue_next(__pyx_v_self->c_completion_queue, __pyx_v_c_deadline, NULL);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":137
+ *         event = grpc_completion_queue_next(
+ *             self.c_completion_queue, c_deadline, NULL)
+ *         self._interpret_event(event)             # <<<<<<<<<<<<<<
+ *       grpc_completion_queue_destroy(self.c_completion_queue)
+ *     grpc_shutdown()
+ */
+      __pyx_t_2 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self->__pyx_vtab)->_interpret_event(__pyx_v_self, __pyx_v_event); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 137, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":138
+ *             self.c_completion_queue, c_deadline, NULL)
+ *         self._interpret_event(event)
+ *       grpc_completion_queue_destroy(self.c_completion_queue)             # <<<<<<<<<<<<<<
+ *     grpc_shutdown()
+ */
+    grpc_completion_queue_destroy(__pyx_v_self->c_completion_queue);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":129
+ *     cdef gpr_timespec c_deadline
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)
+ *     if self.c_completion_queue != NULL:             # <<<<<<<<<<<<<<
+ *       # Ensure shutdown
+ *       if not self.is_shutting_down:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":139
+ *         self._interpret_event(event)
+ *       grpc_completion_queue_destroy(self.c_completion_queue)
+ *     grpc_shutdown()             # <<<<<<<<<<<<<<
+ */
+  grpc_shutdown();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":126
+ *       pass
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     cdef gpr_timespec c_deadline
+ *     c_deadline = gpr_inf_future(GPR_CLOCK_REALTIME)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_WriteUnraisable("_cython.cygrpc.CompletionQueue.__dealloc__", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_13__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CompletionQueue_13__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_13__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_13__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CompletionQueue_12__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_12__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_15__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CompletionQueue_15__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_15__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CompletionQueue_15__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CompletionQueue_14__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CompletionQueue_14__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CompletionQueue.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":17
+ * cdef class ConnectivityEvent(BaseEvent):
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, grpc_completion_type completion_type, bint success, object tag):
+ *     self.completion_type = completion_type
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  grpc_completion_type __pyx_v_completion_type;
+  int __pyx_v_success;
+  PyObject *__pyx_v_tag = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_completion_type,&__pyx_n_s_success,&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_completion_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 17, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_success)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 17, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(16, 17, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 17, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(16, 17, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(16, 17, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+    }
+    __pyx_v_completion_type = ((grpc_completion_type)__Pyx_PyInt_As_grpc_completion_type(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 18, __pyx_L3_error)
+    __pyx_v_success = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_success == (int)-1) && PyErr_Occurred())) __PYX_ERR(16, 18, __pyx_L3_error)
+    __pyx_v_tag = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(16, 17, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ConnectivityEvent.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ConnectivityEvent___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)__pyx_v_self), __pyx_v_completion_type, __pyx_v_success, __pyx_v_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_17ConnectivityEvent___cinit__(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self, grpc_completion_type __pyx_v_completion_type, int __pyx_v_success, PyObject *__pyx_v_tag) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":19
+ *   def __cinit__(
+ *       self, grpc_completion_type completion_type, bint success, object tag):
+ *     self.completion_type = completion_type             # <<<<<<<<<<<<<<
+ *     self.success = success
+ *     self.tag = tag
+ */
+  __pyx_v_self->completion_type = __pyx_v_completion_type;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":20
+ *       self, grpc_completion_type completion_type, bint success, object tag):
+ *     self.completion_type = completion_type
+ *     self.success = success             # <<<<<<<<<<<<<<
+ *     self.tag = tag
+ * 
+ */
+  __pyx_v_self->success = __pyx_v_success;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":21
+ *     self.completion_type = completion_type
+ *     self.success = success
+ *     self.tag = tag             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_tag);
+  __Pyx_GIVEREF(__pyx_v_tag);
+  __Pyx_GOTREF(__pyx_v_self->tag);
+  __Pyx_DECREF(__pyx_v_self->tag);
+  __pyx_v_self->tag = __pyx_v_tag;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":17
+ * cdef class ConnectivityEvent(BaseEvent):
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, grpc_completion_type completion_type, bint success, object tag):
+ *     self.completion_type = completion_type
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":20
+ * cdef class ConnectivityEvent(BaseEvent):
+ * 
+ *   cdef readonly grpc_completion_type completion_type             # <<<<<<<<<<<<<<
+ *   cdef readonly bint success
+ *   cdef readonly object tag
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_15completion_type_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_15completion_type_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_15completion_type___get__(((struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_15completion_type___get__(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_self->completion_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(17, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ConnectivityEvent.completion_type.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":21
+ * 
+ *   cdef readonly grpc_completion_type completion_type
+ *   cdef readonly bint success             # <<<<<<<<<<<<<<
+ *   cdef readonly object tag
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_7success_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_7success_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_7success___get__(((struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_7success___get__(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->success); if (unlikely(!__pyx_t_1)) __PYX_ERR(17, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ConnectivityEvent.success.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":22
+ *   cdef readonly grpc_completion_type completion_type
+ *   cdef readonly bint success
+ *   cdef readonly object tag             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_3tag_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_3tag_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_3tag___get__(((struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_3tag___get__(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->tag);
+  __pyx_r = __pyx_v_self->tag;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ConnectivityEvent_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ConnectivityEvent.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ConnectivityEvent_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ConnectivityEvent.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ConnectivityEvent_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ConnectivityEvent.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":26
+ * cdef class RequestCallEvent(BaseEvent):
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, grpc_completion_type completion_type, bint success, object tag,
+ *       Call call, CallDetails call_details, tuple invocation_metadata):
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_16RequestCallEvent_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_16RequestCallEvent_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  grpc_completion_type __pyx_v_completion_type;
+  int __pyx_v_success;
+  PyObject *__pyx_v_tag = 0;
+  struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call = 0;
+  struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_call_details = 0;
+  PyObject *__pyx_v_invocation_metadata = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[6] = {0,0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_completion_type,&__pyx_n_s_success,&__pyx_n_s_tag,&__pyx_n_s_call,&__pyx_n_s_call_details,&__pyx_n_s_invocation_metadata,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5);
+        CYTHON_FALLTHROUGH;
+        case  5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_completion_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 26, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_success)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 26, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 1); __PYX_ERR(16, 26, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 26, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 2); __PYX_ERR(16, 26, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 26, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 3); __PYX_ERR(16, 26, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 26, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 4); __PYX_ERR(16, 26, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  5:
+        if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_invocation_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[5]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 26, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, 5); __PYX_ERR(16, 26, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(16, 26, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 6)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+      values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+      values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4);
+      values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5);
+    }
+    __pyx_v_completion_type = ((grpc_completion_type)__Pyx_PyInt_As_grpc_completion_type(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 27, __pyx_L3_error)
+    __pyx_v_success = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_success == (int)-1) && PyErr_Occurred())) __PYX_ERR(16, 27, __pyx_L3_error)
+    __pyx_v_tag = values[2];
+    __pyx_v_call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)values[3]);
+    __pyx_v_call_details = ((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)values[4]);
+    __pyx_v_invocation_metadata = ((PyObject*)values[5]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 6, 6, __pyx_nargs); __PYX_ERR(16, 26, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.RequestCallEvent.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call), __pyx_ptype_7_cython_6cygrpc_Call, 1, "call", 0))) __PYX_ERR(16, 28, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_details), __pyx_ptype_7_cython_6cygrpc_CallDetails, 1, "call_details", 0))) __PYX_ERR(16, 28, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_invocation_metadata), (&PyTuple_Type), 1, "invocation_metadata", 1))) __PYX_ERR(16, 28, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent___cinit__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self), __pyx_v_completion_type, __pyx_v_success, __pyx_v_tag, __pyx_v_call, __pyx_v_call_details, __pyx_v_invocation_metadata);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_16RequestCallEvent___cinit__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self, grpc_completion_type __pyx_v_completion_type, int __pyx_v_success, PyObject *__pyx_v_tag, struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call, struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_call_details, PyObject *__pyx_v_invocation_metadata) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":29
+ *       self, grpc_completion_type completion_type, bint success, object tag,
+ *       Call call, CallDetails call_details, tuple invocation_metadata):
+ *     self.completion_type = completion_type             # <<<<<<<<<<<<<<
+ *     self.success = success
+ *     self.tag = tag
+ */
+  __pyx_v_self->completion_type = __pyx_v_completion_type;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":30
+ *       Call call, CallDetails call_details, tuple invocation_metadata):
+ *     self.completion_type = completion_type
+ *     self.success = success             # <<<<<<<<<<<<<<
+ *     self.tag = tag
+ *     self.call = call
+ */
+  __pyx_v_self->success = __pyx_v_success;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":31
+ *     self.completion_type = completion_type
+ *     self.success = success
+ *     self.tag = tag             # <<<<<<<<<<<<<<
+ *     self.call = call
+ *     self.call_details = call_details
+ */
+  __Pyx_INCREF(__pyx_v_tag);
+  __Pyx_GIVEREF(__pyx_v_tag);
+  __Pyx_GOTREF(__pyx_v_self->tag);
+  __Pyx_DECREF(__pyx_v_self->tag);
+  __pyx_v_self->tag = __pyx_v_tag;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":32
+ *     self.success = success
+ *     self.tag = tag
+ *     self.call = call             # <<<<<<<<<<<<<<
+ *     self.call_details = call_details
+ *     self.invocation_metadata = invocation_metadata
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_call);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_call);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->call);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->call);
+  __pyx_v_self->call = __pyx_v_call;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":33
+ *     self.tag = tag
+ *     self.call = call
+ *     self.call_details = call_details             # <<<<<<<<<<<<<<
+ *     self.invocation_metadata = invocation_metadata
+ * 
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_call_details);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_call_details);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->call_details);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->call_details);
+  __pyx_v_self->call_details = __pyx_v_call_details;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":34
+ *     self.call = call
+ *     self.call_details = call_details
+ *     self.invocation_metadata = invocation_metadata             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_invocation_metadata);
+  __Pyx_GIVEREF(__pyx_v_invocation_metadata);
+  __Pyx_GOTREF(__pyx_v_self->invocation_metadata);
+  __Pyx_DECREF(__pyx_v_self->invocation_metadata);
+  __pyx_v_self->invocation_metadata = __pyx_v_invocation_metadata;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":26
+ * cdef class RequestCallEvent(BaseEvent):
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, grpc_completion_type completion_type, bint success, object tag,
+ *       Call call, CallDetails call_details, tuple invocation_metadata):
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":27
+ * cdef class RequestCallEvent(BaseEvent):
+ * 
+ *   cdef readonly grpc_completion_type completion_type             # <<<<<<<<<<<<<<
+ *   cdef readonly bint success
+ *   cdef readonly object tag
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_15completion_type_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_15completion_type_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent_15completion_type___get__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_15completion_type___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_self->completion_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(17, 27, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.RequestCallEvent.completion_type.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":28
+ * 
+ *   cdef readonly grpc_completion_type completion_type
+ *   cdef readonly bint success             # <<<<<<<<<<<<<<
+ *   cdef readonly object tag
+ *   cdef readonly Call call
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_7success_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_7success_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent_7success___get__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_7success___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->success); if (unlikely(!__pyx_t_1)) __PYX_ERR(17, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.RequestCallEvent.success.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":29
+ *   cdef readonly grpc_completion_type completion_type
+ *   cdef readonly bint success
+ *   cdef readonly object tag             # <<<<<<<<<<<<<<
+ *   cdef readonly Call call
+ *   cdef readonly CallDetails call_details
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_3tag_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_3tag_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent_3tag___get__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_3tag___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->tag);
+  __pyx_r = __pyx_v_self->tag;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":30
+ *   cdef readonly bint success
+ *   cdef readonly object tag
+ *   cdef readonly Call call             # <<<<<<<<<<<<<<
+ *   cdef readonly CallDetails call_details
+ *   cdef readonly tuple invocation_metadata
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_4call_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_4call_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent_4call___get__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_4call___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->call);
+  __pyx_r = ((PyObject *)__pyx_v_self->call);
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":31
+ *   cdef readonly object tag
+ *   cdef readonly Call call
+ *   cdef readonly CallDetails call_details             # <<<<<<<<<<<<<<
+ *   cdef readonly tuple invocation_metadata
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_12call_details_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_12call_details_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent_12call_details___get__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_12call_details___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->call_details);
+  __pyx_r = ((PyObject *)__pyx_v_self->call_details);
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":32
+ *   cdef readonly Call call
+ *   cdef readonly CallDetails call_details
+ *   cdef readonly tuple invocation_metadata             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_19invocation_metadata_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_19invocation_metadata_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent_19invocation_metadata___get__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_19invocation_metadata___get__(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->invocation_metadata);
+  __pyx_r = __pyx_v_self->invocation_metadata;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16RequestCallEvent_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.RequestCallEvent.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16RequestCallEvent_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.RequestCallEvent.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16RequestCallEvent_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16RequestCallEvent_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.RequestCallEvent.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":39
+ * cdef class BatchOperationEvent(BaseEvent):
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, grpc_completion_type completion_type, bint success, object tag,
+ *       object batch_operations):
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  grpc_completion_type __pyx_v_completion_type;
+  int __pyx_v_success;
+  PyObject *__pyx_v_tag = 0;
+  PyObject *__pyx_v_batch_operations = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[4] = {0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_completion_type,&__pyx_n_s_success,&__pyx_n_s_tag,&__pyx_n_s_batch_operations,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_completion_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 39, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_success)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 39, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 1); __PYX_ERR(16, 39, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 39, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 2); __PYX_ERR(16, 39, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_batch_operations)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 39, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 3); __PYX_ERR(16, 39, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(16, 39, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 4)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+      values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+    }
+    __pyx_v_completion_type = ((grpc_completion_type)__Pyx_PyInt_As_grpc_completion_type(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 40, __pyx_L3_error)
+    __pyx_v_success = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_success == (int)-1) && PyErr_Occurred())) __PYX_ERR(16, 40, __pyx_L3_error)
+    __pyx_v_tag = values[2];
+    __pyx_v_batch_operations = values[3];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, __pyx_nargs); __PYX_ERR(16, 39, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.BatchOperationEvent.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent___cinit__(((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_v_self), __pyx_v_completion_type, __pyx_v_success, __pyx_v_tag, __pyx_v_batch_operations);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent___cinit__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self, grpc_completion_type __pyx_v_completion_type, int __pyx_v_success, PyObject *__pyx_v_tag, PyObject *__pyx_v_batch_operations) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":42
+ *       self, grpc_completion_type completion_type, bint success, object tag,
+ *       object batch_operations):
+ *     self.completion_type = completion_type             # <<<<<<<<<<<<<<
+ *     self.success = success
+ *     self.tag = tag
+ */
+  __pyx_v_self->completion_type = __pyx_v_completion_type;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":43
+ *       object batch_operations):
+ *     self.completion_type = completion_type
+ *     self.success = success             # <<<<<<<<<<<<<<
+ *     self.tag = tag
+ *     self.batch_operations = batch_operations
+ */
+  __pyx_v_self->success = __pyx_v_success;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":44
+ *     self.completion_type = completion_type
+ *     self.success = success
+ *     self.tag = tag             # <<<<<<<<<<<<<<
+ *     self.batch_operations = batch_operations
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_tag);
+  __Pyx_GIVEREF(__pyx_v_tag);
+  __Pyx_GOTREF(__pyx_v_self->tag);
+  __Pyx_DECREF(__pyx_v_self->tag);
+  __pyx_v_self->tag = __pyx_v_tag;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":45
+ *     self.success = success
+ *     self.tag = tag
+ *     self.batch_operations = batch_operations             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_batch_operations);
+  __Pyx_GIVEREF(__pyx_v_batch_operations);
+  __Pyx_GOTREF(__pyx_v_self->batch_operations);
+  __Pyx_DECREF(__pyx_v_self->batch_operations);
+  __pyx_v_self->batch_operations = __pyx_v_batch_operations;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":39
+ * cdef class BatchOperationEvent(BaseEvent):
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, grpc_completion_type completion_type, bint success, object tag,
+ *       object batch_operations):
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":37
+ * cdef class BatchOperationEvent(BaseEvent):
+ * 
+ *   cdef readonly grpc_completion_type completion_type             # <<<<<<<<<<<<<<
+ *   cdef readonly bint success
+ *   cdef readonly object tag
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_15completion_type_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_15completion_type_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_15completion_type___get__(((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_15completion_type___get__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_self->completion_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(17, 37, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.BatchOperationEvent.completion_type.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":38
+ * 
+ *   cdef readonly grpc_completion_type completion_type
+ *   cdef readonly bint success             # <<<<<<<<<<<<<<
+ *   cdef readonly object tag
+ *   cdef readonly object batch_operations
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_7success_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_7success_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_7success___get__(((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_7success___get__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->success); if (unlikely(!__pyx_t_1)) __PYX_ERR(17, 38, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.BatchOperationEvent.success.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":39
+ *   cdef readonly grpc_completion_type completion_type
+ *   cdef readonly bint success
+ *   cdef readonly object tag             # <<<<<<<<<<<<<<
+ *   cdef readonly object batch_operations
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_3tag_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_3tag_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_3tag___get__(((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_3tag___get__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->tag);
+  __pyx_r = __pyx_v_self->tag;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":40
+ *   cdef readonly bint success
+ *   cdef readonly object tag
+ *   cdef readonly object batch_operations             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_16batch_operations_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_16batch_operations_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_16batch_operations___get__(((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_16batch_operations___get__(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->batch_operations);
+  __pyx_r = __pyx_v_self->batch_operations;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19BatchOperationEvent_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.BatchOperationEvent.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19BatchOperationEvent_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.BatchOperationEvent.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BatchOperationEvent_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.BatchOperationEvent.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":50
+ * cdef class ServerShutdownEvent(BaseEvent):
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, grpc_completion_type completion_type, bint success, object tag):
+ *     self.completion_type = completion_type
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  grpc_completion_type __pyx_v_completion_type;
+  int __pyx_v_success;
+  PyObject *__pyx_v_tag = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_completion_type,&__pyx_n_s_success,&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_completion_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 50, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_success)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 50, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(16, 50, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 50, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(16, 50, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(16, 50, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+    }
+    __pyx_v_completion_type = ((grpc_completion_type)__Pyx_PyInt_As_grpc_completion_type(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(16, 51, __pyx_L3_error)
+    __pyx_v_success = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_success == (int)-1) && PyErr_Occurred())) __PYX_ERR(16, 51, __pyx_L3_error)
+    __pyx_v_tag = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(16, 50, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ServerShutdownEvent.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)__pyx_v_self), __pyx_v_completion_type, __pyx_v_success, __pyx_v_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent___cinit__(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self, grpc_completion_type __pyx_v_completion_type, int __pyx_v_success, PyObject *__pyx_v_tag) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":52
+ *   def __cinit__(
+ *       self, grpc_completion_type completion_type, bint success, object tag):
+ *     self.completion_type = completion_type             # <<<<<<<<<<<<<<
+ *     self.success = success
+ *     self.tag = tag
+ */
+  __pyx_v_self->completion_type = __pyx_v_completion_type;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":53
+ *       self, grpc_completion_type completion_type, bint success, object tag):
+ *     self.completion_type = completion_type
+ *     self.success = success             # <<<<<<<<<<<<<<
+ *     self.tag = tag
+ */
+  __pyx_v_self->success = __pyx_v_success;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":54
+ *     self.completion_type = completion_type
+ *     self.success = success
+ *     self.tag = tag             # <<<<<<<<<<<<<<
+ */
+  __Pyx_INCREF(__pyx_v_tag);
+  __Pyx_GIVEREF(__pyx_v_tag);
+  __Pyx_GOTREF(__pyx_v_self->tag);
+  __Pyx_DECREF(__pyx_v_self->tag);
+  __pyx_v_self->tag = __pyx_v_tag;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/event.pyx.pxi":50
+ * cdef class ServerShutdownEvent(BaseEvent):
+ * 
+ *   def __cinit__(             # <<<<<<<<<<<<<<
+ *       self, grpc_completion_type completion_type, bint success, object tag):
+ *     self.completion_type = completion_type
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":45
+ * cdef class ServerShutdownEvent(BaseEvent):
+ * 
+ *   cdef readonly grpc_completion_type completion_type             # <<<<<<<<<<<<<<
+ *   cdef readonly bint success
+ *   cdef readonly object tag
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_15completion_type_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_15completion_type_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_15completion_type___get__(((struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_15completion_type___get__(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_self->completion_type); if (unlikely(!__pyx_t_1)) __PYX_ERR(17, 45, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ServerShutdownEvent.completion_type.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":46
+ * 
+ *   cdef readonly grpc_completion_type completion_type
+ *   cdef readonly bint success             # <<<<<<<<<<<<<<
+ *   cdef readonly object tag
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_7success_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_7success_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_7success___get__(((struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_7success___get__(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->success); if (unlikely(!__pyx_t_1)) __PYX_ERR(17, 46, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ServerShutdownEvent.success.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/event.pxd.pxi":47
+ *   cdef readonly grpc_completion_type completion_type
+ *   cdef readonly bint success
+ *   cdef readonly object tag             # <<<<<<<<<<<<<<
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_3tag_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_3tag_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_3tag___get__(((struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_3tag___get__(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->tag);
+  __pyx_r = __pyx_v_self->tag;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19ServerShutdownEvent_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ServerShutdownEvent.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19ServerShutdownEvent_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ServerShutdownEvent.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19ServerShutdownEvent_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ServerShutdownEvent.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":27
+ * 
+ * 
+ * cdef void _store_c_metadata(             # <<<<<<<<<<<<<<
+ *     metadata, grpc_metadata **c_metadata, size_t *c_count) except *:
+ *   if metadata is None:
+ */
+
+static void __pyx_f_7_cython_6cygrpc__store_c_metadata(PyObject *__pyx_v_metadata, grpc_metadata **__pyx_v_c_metadata, size_t *__pyx_v_c_count) {
+  PyObject *__pyx_v_metadatum_count = NULL;
+  PyObject *__pyx_v_index = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_value = NULL;
+  PyObject *__pyx_v_encoded_key = NULL;
+  PyObject *__pyx_v_encoded_value = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  size_t __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *(*__pyx_t_11)(PyObject *);
+  int __pyx_t_12;
+  grpc_slice __pyx_t_13;
+  Py_ssize_t __pyx_t_14;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_store_c_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":29
+ * cdef void _store_c_metadata(
+ *     metadata, grpc_metadata **c_metadata, size_t *c_count) except *:
+ *   if metadata is None:             # <<<<<<<<<<<<<<
+ *     c_count[0] = 0
+ *     c_metadata[0] = NULL
+ */
+  __pyx_t_1 = (__pyx_v_metadata == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":30
+ *     metadata, grpc_metadata **c_metadata, size_t *c_count) except *:
+ *   if metadata is None:
+ *     c_count[0] = 0             # <<<<<<<<<<<<<<
+ *     c_metadata[0] = NULL
+ *   else:
+ */
+    (__pyx_v_c_count[0]) = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":31
+ *   if metadata is None:
+ *     c_count[0] = 0
+ *     c_metadata[0] = NULL             # <<<<<<<<<<<<<<
+ *   else:
+ *     metadatum_count = len(metadata)
+ */
+    (__pyx_v_c_metadata[0]) = NULL;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":29
+ * cdef void _store_c_metadata(
+ *     metadata, grpc_metadata **c_metadata, size_t *c_count) except *:
+ *   if metadata is None:             # <<<<<<<<<<<<<<
+ *     c_count[0] = 0
+ *     c_metadata[0] = NULL
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":33
+ *     c_metadata[0] = NULL
+ *   else:
+ *     metadatum_count = len(metadata)             # <<<<<<<<<<<<<<
+ *     if metadatum_count == 0:
+ *       c_count[0] = 0
+ */
+  /*else*/ {
+    __pyx_t_2 = PyObject_Length(__pyx_v_metadata); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(18, 33, __pyx_L1_error)
+    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(18, 33, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_v_metadatum_count = __pyx_t_3;
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":34
+ *   else:
+ *     metadatum_count = len(metadata)
+ *     if metadatum_count == 0:             # <<<<<<<<<<<<<<
+ *       c_count[0] = 0
+ *       c_metadata[0] = NULL
+ */
+    __pyx_t_1 = (__Pyx_PyInt_BoolEqObjC(__pyx_v_metadatum_count, __pyx_int_0, 0, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(18, 34, __pyx_L1_error)
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":35
+ *     metadatum_count = len(metadata)
+ *     if metadatum_count == 0:
+ *       c_count[0] = 0             # <<<<<<<<<<<<<<
+ *       c_metadata[0] = NULL
+ *     else:
+ */
+      (__pyx_v_c_count[0]) = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":36
+ *     if metadatum_count == 0:
+ *       c_count[0] = 0
+ *       c_metadata[0] = NULL             # <<<<<<<<<<<<<<
+ *     else:
+ *       c_count[0] = metadatum_count
+ */
+      (__pyx_v_c_metadata[0]) = NULL;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":34
+ *   else:
+ *     metadatum_count = len(metadata)
+ *     if metadatum_count == 0:             # <<<<<<<<<<<<<<
+ *       c_count[0] = 0
+ *       c_metadata[0] = NULL
+ */
+      goto __pyx_L4;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":38
+ *       c_metadata[0] = NULL
+ *     else:
+ *       c_count[0] = metadatum_count             # <<<<<<<<<<<<<<
+ *       c_metadata[0] = <grpc_metadata *>gpr_malloc(
+ *           metadatum_count * sizeof(grpc_metadata))
+ */
+    /*else*/ {
+      __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_v_metadatum_count); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(18, 38, __pyx_L1_error)
+      (__pyx_v_c_count[0]) = __pyx_t_4;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":40
+ *       c_count[0] = metadatum_count
+ *       c_metadata[0] = <grpc_metadata *>gpr_malloc(
+ *           metadatum_count * sizeof(grpc_metadata))             # <<<<<<<<<<<<<<
+ *       for index, (key, value) in enumerate(metadata):
+ *         encoded_key = _encode(key)
+ */
+      __pyx_t_3 = __Pyx_PyInt_FromSize_t((sizeof(grpc_metadata))); if (unlikely(!__pyx_t_3)) __PYX_ERR(18, 40, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyNumber_Multiply(__pyx_v_metadatum_count, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(18, 40, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_4 = __Pyx_PyInt_As_size_t(__pyx_t_5); if (unlikely((__pyx_t_4 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(18, 40, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":39
+ *     else:
+ *       c_count[0] = metadatum_count
+ *       c_metadata[0] = <grpc_metadata *>gpr_malloc(             # <<<<<<<<<<<<<<
+ *           metadatum_count * sizeof(grpc_metadata))
+ *       for index, (key, value) in enumerate(metadata):
+ */
+      (__pyx_v_c_metadata[0]) = ((grpc_metadata *)gpr_malloc(__pyx_t_4));
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":41
+ *       c_metadata[0] = <grpc_metadata *>gpr_malloc(
+ *           metadatum_count * sizeof(grpc_metadata))
+ *       for index, (key, value) in enumerate(metadata):             # <<<<<<<<<<<<<<
+ *         encoded_key = _encode(key)
+ *         encoded_value = value if encoded_key[-4:] == b'-bin' else _encode(value)
+ */
+      __Pyx_INCREF(__pyx_int_0);
+      __pyx_t_5 = __pyx_int_0;
+      if (likely(PyList_CheckExact(__pyx_v_metadata)) || PyTuple_CheckExact(__pyx_v_metadata)) {
+        __pyx_t_3 = __pyx_v_metadata; __Pyx_INCREF(__pyx_t_3);
+        __pyx_t_2 = 0;
+        __pyx_t_6 = NULL;
+      } else {
+        __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_metadata); if (unlikely(!__pyx_t_3)) __PYX_ERR(18, 41, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(18, 41, __pyx_L1_error)
+      }
+      for (;;) {
+        if (likely(!__pyx_t_6)) {
+          if (likely(PyList_CheckExact(__pyx_t_3))) {
+            {
+              Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_3);
+              #if !CYTHON_ASSUME_SAFE_MACROS
+              if (unlikely((__pyx_temp < 0))) __PYX_ERR(18, 41, __pyx_L1_error)
+              #endif
+              if (__pyx_t_2 >= __pyx_temp) break;
+            }
+            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+            __pyx_t_7 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(18, 41, __pyx_L1_error)
+            #else
+            __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 41, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            #endif
+          } else {
+            {
+              Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_3);
+              #if !CYTHON_ASSUME_SAFE_MACROS
+              if (unlikely((__pyx_temp < 0))) __PYX_ERR(18, 41, __pyx_L1_error)
+              #endif
+              if (__pyx_t_2 >= __pyx_temp) break;
+            }
+            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+            __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(18, 41, __pyx_L1_error)
+            #else
+            __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 41, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            #endif
+          }
+        } else {
+          __pyx_t_7 = __pyx_t_6(__pyx_t_3);
+          if (unlikely(!__pyx_t_7)) {
+            PyObject* exc_type = PyErr_Occurred();
+            if (exc_type) {
+              if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+              else __PYX_ERR(18, 41, __pyx_L1_error)
+            }
+            break;
+          }
+          __Pyx_GOTREF(__pyx_t_7);
+        }
+        if ((likely(PyTuple_CheckExact(__pyx_t_7))) || (PyList_CheckExact(__pyx_t_7))) {
+          PyObject* sequence = __pyx_t_7;
+          Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+          if (unlikely(size != 2)) {
+            if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+            else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+            __PYX_ERR(18, 41, __pyx_L1_error)
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          if (likely(PyTuple_CheckExact(sequence))) {
+            __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
+            __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); 
+          } else {
+            __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
+            __pyx_t_9 = PyList_GET_ITEM(sequence, 1); 
+          }
+          __Pyx_INCREF(__pyx_t_8);
+          __Pyx_INCREF(__pyx_t_9);
+          #else
+          __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(18, 41, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) __PYX_ERR(18, 41, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          #endif
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        } else {
+          Py_ssize_t index = -1;
+          __pyx_t_10 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_10)) __PYX_ERR(18, 41, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_11 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_10);
+          index = 0; __pyx_t_8 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_8)) goto __pyx_L7_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_8);
+          index = 1; __pyx_t_9 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_9)) goto __pyx_L7_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_9);
+          if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_10), 2) < 0) __PYX_ERR(18, 41, __pyx_L1_error)
+          __pyx_t_11 = NULL;
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          goto __pyx_L8_unpacking_done;
+          __pyx_L7_unpacking_failed:;
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_11 = NULL;
+          if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+          __PYX_ERR(18, 41, __pyx_L1_error)
+          __pyx_L8_unpacking_done:;
+        }
+        __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_8);
+        __pyx_t_8 = 0;
+        __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_9);
+        __pyx_t_9 = 0;
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_5);
+        __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_5, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 41, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_5);
+        __pyx_t_5 = __pyx_t_7;
+        __pyx_t_7 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":42
+ *           metadatum_count * sizeof(grpc_metadata))
+ *       for index, (key, value) in enumerate(metadata):
+ *         encoded_key = _encode(key)             # <<<<<<<<<<<<<<
+ *         encoded_value = value if encoded_key[-4:] == b'-bin' else _encode(value)
+ *         if not isinstance(encoded_value, bytes):
+ */
+        __pyx_t_7 = __pyx_f_7_cython_6cygrpc__encode(__pyx_v_key); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 42, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_XDECREF_SET(__pyx_v_encoded_key, ((PyObject*)__pyx_t_7));
+        __pyx_t_7 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":43
+ *       for index, (key, value) in enumerate(metadata):
+ *         encoded_key = _encode(key)
+ *         encoded_value = value if encoded_key[-4:] == b'-bin' else _encode(value)             # <<<<<<<<<<<<<<
+ *         if not isinstance(encoded_value, bytes):
+ *           raise TypeError('Binary metadata key="%s" expected bytes, got %s' % (
+ */
+        if (unlikely(__pyx_v_encoded_key == Py_None)) {
+          PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+          __PYX_ERR(18, 43, __pyx_L1_error)
+        }
+        __pyx_t_9 = PySequence_GetSlice(__pyx_v_encoded_key, -4L, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_9)) __PYX_ERR(18, 43, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_1 = (__Pyx_PyBytes_Equals(__pyx_t_9, __pyx_kp_b_bin, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(18, 43, __pyx_L1_error)
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        if (__pyx_t_1) {
+          __Pyx_INCREF(__pyx_v_value);
+          __pyx_t_7 = __pyx_v_value;
+        } else {
+          __pyx_t_9 = __pyx_f_7_cython_6cygrpc__encode(__pyx_v_value); if (unlikely(!__pyx_t_9)) __PYX_ERR(18, 43, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_7 = __pyx_t_9;
+          __pyx_t_9 = 0;
+        }
+        __Pyx_XDECREF_SET(__pyx_v_encoded_value, __pyx_t_7);
+        __pyx_t_7 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":44
+ *         encoded_key = _encode(key)
+ *         encoded_value = value if encoded_key[-4:] == b'-bin' else _encode(value)
+ *         if not isinstance(encoded_value, bytes):             # <<<<<<<<<<<<<<
+ *           raise TypeError('Binary metadata key="%s" expected bytes, got %s' % (
+ *             key,
+ */
+        __pyx_t_1 = PyBytes_Check(__pyx_v_encoded_value); 
+        __pyx_t_12 = (!__pyx_t_1);
+        if (unlikely(__pyx_t_12)) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":46
+ *         if not isinstance(encoded_value, bytes):
+ *           raise TypeError('Binary metadata key="%s" expected bytes, got %s' % (
+ *             key,             # <<<<<<<<<<<<<<
+ *             type(encoded_value)
+ *           ))
+ */
+          __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 46, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_INCREF(__pyx_v_key);
+          __Pyx_GIVEREF(__pyx_v_key);
+          if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_key)) __PYX_ERR(18, 46, __pyx_L1_error);
+          __Pyx_INCREF(((PyObject *)Py_TYPE(__pyx_v_encoded_value)));
+          __Pyx_GIVEREF(((PyObject *)Py_TYPE(__pyx_v_encoded_value)));
+          if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, ((PyObject *)Py_TYPE(__pyx_v_encoded_value)))) __PYX_ERR(18, 46, __pyx_L1_error);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":45
+ *         encoded_value = value if encoded_key[-4:] == b'-bin' else _encode(value)
+ *         if not isinstance(encoded_value, bytes):
+ *           raise TypeError('Binary metadata key="%s" expected bytes, got %s' % (             # <<<<<<<<<<<<<<
+ *             key,
+ *             type(encoded_value)
+ */
+          __pyx_t_9 = __Pyx_PyString_Format(__pyx_kp_s_Binary_metadata_key_s_expected_b, __pyx_t_7); if (unlikely(!__pyx_t_9)) __PYX_ERR(18, 45, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 45, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_Raise(__pyx_t_7, 0, 0, 0);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __PYX_ERR(18, 45, __pyx_L1_error)
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":44
+ *         encoded_key = _encode(key)
+ *         encoded_value = value if encoded_key[-4:] == b'-bin' else _encode(value)
+ *         if not isinstance(encoded_value, bytes):             # <<<<<<<<<<<<<<
+ *           raise TypeError('Binary metadata key="%s" expected bytes, got %s' % (
+ *             key,
+ */
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":49
+ *             type(encoded_value)
+ *           ))
+ *         c_metadata[0][index].key = _slice_from_bytes(encoded_key)             # <<<<<<<<<<<<<<
+ *         c_metadata[0][index].value = _slice_from_bytes(encoded_value)
+ * 
+ */
+        __pyx_t_13 = __pyx_f_7_cython_6cygrpc__slice_from_bytes(__pyx_v_encoded_key); if (unlikely(PyErr_Occurred())) __PYX_ERR(18, 49, __pyx_L1_error)
+        __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(18, 49, __pyx_L1_error)
+        ((__pyx_v_c_metadata[0])[__pyx_t_14]).key = __pyx_t_13;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":50
+ *           ))
+ *         c_metadata[0][index].key = _slice_from_bytes(encoded_key)
+ *         c_metadata[0][index].value = _slice_from_bytes(encoded_value)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+        if (!(likely(PyBytes_CheckExact(__pyx_v_encoded_value))||((__pyx_v_encoded_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_encoded_value))) __PYX_ERR(18, 50, __pyx_L1_error)
+        __pyx_t_13 = __pyx_f_7_cython_6cygrpc__slice_from_bytes(((PyObject*)__pyx_v_encoded_value)); if (unlikely(PyErr_Occurred())) __PYX_ERR(18, 50, __pyx_L1_error)
+        __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(18, 50, __pyx_L1_error)
+        ((__pyx_v_c_metadata[0])[__pyx_t_14]).value = __pyx_t_13;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":41
+ *       c_metadata[0] = <grpc_metadata *>gpr_malloc(
+ *           metadatum_count * sizeof(grpc_metadata))
+ *       for index, (key, value) in enumerate(metadata):             # <<<<<<<<<<<<<<
+ *         encoded_key = _encode(key)
+ *         encoded_value = value if encoded_key[-4:] == b'-bin' else _encode(value)
+ */
+      }
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    __pyx_L4:;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":27
+ * 
+ * 
+ * cdef void _store_c_metadata(             # <<<<<<<<<<<<<<
+ *     metadata, grpc_metadata **c_metadata, size_t *c_count) except *:
+ *   if metadata is None:
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_AddTraceback("_cython.cygrpc._store_c_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_metadatum_count);
+  __Pyx_XDECREF(__pyx_v_index);
+  __Pyx_XDECREF(__pyx_v_key);
+  __Pyx_XDECREF(__pyx_v_value);
+  __Pyx_XDECREF(__pyx_v_encoded_key);
+  __Pyx_XDECREF(__pyx_v_encoded_value);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":53
+ * 
+ * 
+ * cdef void _release_c_metadata(grpc_metadata *c_metadata, int count) except *:             # <<<<<<<<<<<<<<
+ *   if 0 < count:
+ *     for index in range(count):
+ */
+
+static void __pyx_f_7_cython_6cygrpc__release_c_metadata(grpc_metadata *__pyx_v_c_metadata, int __pyx_v_count) {
+  int __pyx_v_index;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  int __pyx_t_4;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":54
+ * 
+ * cdef void _release_c_metadata(grpc_metadata *c_metadata, int count) except *:
+ *   if 0 < count:             # <<<<<<<<<<<<<<
+ *     for index in range(count):
+ *       grpc_slice_unref(c_metadata[index].key)
+ */
+  __pyx_t_1 = (0 < __pyx_v_count);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":55
+ * cdef void _release_c_metadata(grpc_metadata *c_metadata, int count) except *:
+ *   if 0 < count:
+ *     for index in range(count):             # <<<<<<<<<<<<<<
+ *       grpc_slice_unref(c_metadata[index].key)
+ *       grpc_slice_unref(c_metadata[index].value)
+ */
+    __pyx_t_2 = __pyx_v_count;
+    __pyx_t_3 = __pyx_t_2;
+    for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
+      __pyx_v_index = __pyx_t_4;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":56
+ *   if 0 < count:
+ *     for index in range(count):
+ *       grpc_slice_unref(c_metadata[index].key)             # <<<<<<<<<<<<<<
+ *       grpc_slice_unref(c_metadata[index].value)
+ *     gpr_free(c_metadata)
+ */
+      grpc_slice_unref((__pyx_v_c_metadata[__pyx_v_index]).key);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":57
+ *     for index in range(count):
+ *       grpc_slice_unref(c_metadata[index].key)
+ *       grpc_slice_unref(c_metadata[index].value)             # <<<<<<<<<<<<<<
+ *     gpr_free(c_metadata)
+ * 
+ */
+      grpc_slice_unref((__pyx_v_c_metadata[__pyx_v_index]).value);
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":58
+ *       grpc_slice_unref(c_metadata[index].key)
+ *       grpc_slice_unref(c_metadata[index].value)
+ *     gpr_free(c_metadata)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    gpr_free(__pyx_v_c_metadata);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":54
+ * 
+ * cdef void _release_c_metadata(grpc_metadata *c_metadata, int count) except *:
+ *   if 0 < count:             # <<<<<<<<<<<<<<
+ *     for index in range(count):
+ *       grpc_slice_unref(c_metadata[index].key)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":53
+ * 
+ * 
+ * cdef void _release_c_metadata(grpc_metadata *c_metadata, int count) except *:             # <<<<<<<<<<<<<<
+ *   if 0 < count:
+ *     for index in range(count):
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":61
+ * 
+ * 
+ * cdef tuple _metadatum(grpc_slice key_slice, grpc_slice value_slice):             # <<<<<<<<<<<<<<
+ *   cdef bytes key = _slice_bytes(key_slice)
+ *   cdef bytes value = _slice_bytes(value_slice)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__metadatum(grpc_slice __pyx_v_key_slice, grpc_slice __pyx_v_value_slice) {
+  PyObject *__pyx_v_key = 0;
+  PyObject *__pyx_v_value = 0;
+  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;
+  int __pyx_t_6;
+  unsigned int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_metadatum", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":62
+ * 
+ * cdef tuple _metadatum(grpc_slice key_slice, grpc_slice value_slice):
+ *   cdef bytes key = _slice_bytes(key_slice)             # <<<<<<<<<<<<<<
+ *   cdef bytes value = _slice_bytes(value_slice)
+ *   return <tuple>_Metadatum(
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__slice_bytes(__pyx_v_key_slice); if (unlikely(!__pyx_t_1)) __PYX_ERR(18, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_key = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":63
+ * cdef tuple _metadatum(grpc_slice key_slice, grpc_slice value_slice):
+ *   cdef bytes key = _slice_bytes(key_slice)
+ *   cdef bytes value = _slice_bytes(value_slice)             # <<<<<<<<<<<<<<
+ *   return <tuple>_Metadatum(
+ *       _decode(key), value if key[-4:] == b'-bin' else _decode(value))
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__slice_bytes(__pyx_v_value_slice); if (unlikely(!__pyx_t_1)) __PYX_ERR(18, 63, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_value = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":64
+ *   cdef bytes key = _slice_bytes(key_slice)
+ *   cdef bytes value = _slice_bytes(value_slice)
+ *   return <tuple>_Metadatum(             # <<<<<<<<<<<<<<
+ *       _decode(key), value if key[-4:] == b'-bin' else _decode(value))
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_Metadatum); if (unlikely(!__pyx_t_2)) __PYX_ERR(18, 64, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":65
+ *   cdef bytes value = _slice_bytes(value_slice)
+ *   return <tuple>_Metadatum(
+ *       _decode(key), value if key[-4:] == b'-bin' else _decode(value))             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc__decode(__pyx_v_key); if (unlikely(!__pyx_t_3)) __PYX_ERR(18, 65, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  if (unlikely(__pyx_v_key == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(18, 65, __pyx_L1_error)
+  }
+  __pyx_t_5 = PySequence_GetSlice(__pyx_v_key, -4L, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_5)) __PYX_ERR(18, 65, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = (__Pyx_PyBytes_Equals(__pyx_t_5, __pyx_kp_b_bin, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(18, 65, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  if (__pyx_t_6) {
+    __Pyx_INCREF(__pyx_v_value);
+    __pyx_t_4 = __pyx_v_value;
+  } else {
+    __pyx_t_5 = __pyx_f_7_cython_6cygrpc__decode(__pyx_v_value); if (unlikely(!__pyx_t_5)) __PYX_ERR(18, 65, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_4 = __pyx_t_5;
+    __pyx_t_5 = 0;
+  }
+  __pyx_t_5 = NULL;
+  __pyx_t_7 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_7 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_5, __pyx_t_3, __pyx_t_4};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(18, 64, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":64
+ *   cdef bytes key = _slice_bytes(key_slice)
+ *   cdef bytes value = _slice_bytes(value_slice)
+ *   return <tuple>_Metadatum(             # <<<<<<<<<<<<<<
+ *       _decode(key), value if key[-4:] == b'-bin' else _decode(value))
+ * 
+ */
+  __Pyx_INCREF(((PyObject*)__pyx_t_1));
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":61
+ * 
+ * 
+ * cdef tuple _metadatum(grpc_slice key_slice, grpc_slice value_slice):             # <<<<<<<<<<<<<<
+ *   cdef bytes key = _slice_bytes(key_slice)
+ *   cdef bytes value = _slice_bytes(value_slice)
+ */
+
+  /* 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_AddTraceback("_cython.cygrpc._metadatum", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_key);
+  __Pyx_XDECREF(__pyx_v_value);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_9_metadata_2generator44(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":70
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):
+ *   return tuple(
+ *       _metadatum(             # <<<<<<<<<<<<<<
+ *           c_metadata_array.metadata[index].key,
+ *           c_metadata_array.metadata[index].value)
+ */
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9_metadata_genexpr(PyObject *__pyx_self, size_t __pyx_genexpr_arg_0) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_6_genexpr(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(18, 70, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata *) __pyx_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_outer_scope);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_outer_scope);
+  __pyx_cur_scope->__pyx_genexpr_arg_0 = __pyx_genexpr_arg_0;
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_9_metadata_2generator44, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_metadata_locals_genexpr, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(18, 70, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._metadata.genexpr", __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_7_cython_6cygrpc_9_metadata_2generator44(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  size_t __pyx_t_1;
+  size_t __pyx_t_2;
+  size_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(18, 70, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":73
+ *           c_metadata_array.metadata[index].key,
+ *           c_metadata_array.metadata[index].value)
+ *       for index in range(c_metadata_array.count))             # <<<<<<<<<<<<<<
+ */
+  __pyx_t_1 = __pyx_cur_scope->__pyx_genexpr_arg_0;
+  __pyx_t_2 = __pyx_t_1;
+  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
+    __pyx_cur_scope->__pyx_v_index = __pyx_t_3;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":70
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):
+ *   return tuple(
+ *       _metadatum(             # <<<<<<<<<<<<<<
+ *           c_metadata_array.metadata[index].key,
+ *           c_metadata_array.metadata[index].value)
+ */
+    __pyx_t_4 = __pyx_f_7_cython_6cygrpc__metadatum((__pyx_cur_scope->__pyx_outer_scope->__pyx_v_c_metadata_array->metadata[__pyx_cur_scope->__pyx_v_index]).key, (__pyx_cur_scope->__pyx_outer_scope->__pyx_v_c_metadata_array->metadata[__pyx_cur_scope->__pyx_v_index]).value); if (unlikely(!__pyx_t_4)) __PYX_ERR(18, 70, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_r = __pyx_t_4;
+    __pyx_t_4 = 0;
+    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+    __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+    __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, yielding value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L6_resume_from_yield:;
+    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+    __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+    __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(18, 70, __pyx_L1_error)
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":68
+ * 
+ * 
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):             # <<<<<<<<<<<<<<
+ *   return tuple(
+ *       _metadatum(
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__metadata(grpc_metadata_array *__pyx_v_c_metadata_array) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata *__pyx_cur_scope;
+  PyObject *__pyx_gb_7_cython_6cygrpc_9_metadata_2generator44 = 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("_metadata", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(18, 68, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_c_metadata_array = __pyx_v_c_metadata_array;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":69
+ * 
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):
+ *   return tuple(             # <<<<<<<<<<<<<<
+ *       _metadatum(
+ *           c_metadata_array.metadata[index].key,
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":70
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):
+ *   return tuple(
+ *       _metadatum(             # <<<<<<<<<<<<<<
+ *           c_metadata_array.metadata[index].key,
+ *           c_metadata_array.metadata[index].value)
+ */
+  __pyx_t_1 = __pyx_pf_7_cython_6cygrpc_9_metadata_genexpr(((PyObject*)__pyx_cur_scope), __pyx_cur_scope->__pyx_v_c_metadata_array->count); if (unlikely(!__pyx_t_1)) __PYX_ERR(18, 70, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":69
+ * 
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):
+ *   return tuple(             # <<<<<<<<<<<<<<
+ *       _metadatum(
+ *           c_metadata_array.metadata[index].key,
+ */
+  __pyx_t_2 = __Pyx_PySequence_Tuple(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(18, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_r = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":68
+ * 
+ * 
+ * cdef tuple _metadata(grpc_metadata_array *c_metadata_array):             # <<<<<<<<<<<<<<
+ *   return tuple(
+ *       _metadatum(
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_gb_7_cython_6cygrpc_9_metadata_2generator44);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":18
+ * cdef class Operation:
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc_9Operation_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":19
+ * 
+ *   cdef void c(self) except *:
+ *     raise NotImplementedError()             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void un_c(self) except *:
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_builtin_NotImplementedError); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __PYX_ERR(19, 19, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":18
+ * cdef class Operation:
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.Operation.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":21
+ *     raise NotImplementedError()
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc_9Operation_un_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("un_c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":22
+ * 
+ *   cdef void un_c(self) except *:
+ *     raise NotImplementedError()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_builtin_NotImplementedError); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __PYX_ERR(19, 22, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":21
+ *     raise NotImplementedError()
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.Operation.un_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9Operation_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9Operation_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9Operation_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9Operation_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9Operation___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_Operation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9Operation___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self_c_op_cannot_be_converted_to, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.Operation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9Operation_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9Operation_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9Operation_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9Operation_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Operation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9Operation_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_Operation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9Operation_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self_c_op_cannot_be_converted_to, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.Operation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":27
+ * cdef class SendInitialMetadataOperation(Operation):
+ * 
+ *   def __cinit__(self, initial_metadata, flags):             # <<<<<<<<<<<<<<
+ *     self._initial_metadata = initial_metadata
+ *     self._flags = flags
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_initial_metadata = 0;
+  PyObject *__pyx_v_flags = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_initial_metadata,&__pyx_n_s_flags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_initial_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 27, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 27, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(19, 27, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(19, 27, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_initial_metadata = values[0];
+    __pyx_v_flags = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(19, 27, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation___cinit__(((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_v_self), __pyx_v_initial_metadata, __pyx_v_flags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self, PyObject *__pyx_v_initial_metadata, PyObject *__pyx_v_flags) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":28
+ * 
+ *   def __cinit__(self, initial_metadata, flags):
+ *     self._initial_metadata = initial_metadata             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_initial_metadata);
+  __Pyx_GIVEREF(__pyx_v_initial_metadata);
+  __Pyx_GOTREF(__pyx_v_self->_initial_metadata);
+  __Pyx_DECREF(__pyx_v_self->_initial_metadata);
+  __pyx_v_self->_initial_metadata = __pyx_v_initial_metadata;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":29
+ *   def __cinit__(self, initial_metadata, flags):
+ *     self._initial_metadata = initial_metadata
+ *     self._flags = flags             # <<<<<<<<<<<<<<
+ * 
+ *   def type(self):
+ */
+  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_flags); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(19, 29, __pyx_L1_error)
+  __pyx_v_self->_flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":27
+ * cdef class SendInitialMetadataOperation(Operation):
+ * 
+ *   def __cinit__(self, initial_metadata, flags):             # <<<<<<<<<<<<<<
+ *     self._initial_metadata = initial_metadata
+ *     self._flags = flags
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":31
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_INITIAL_METADATA
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_28SendInitialMetadataOperation_3type = {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("type (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("type", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "type", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_2type(((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__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("type", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":32
+ * 
+ *   def type(self):
+ *     return GRPC_OP_SEND_INITIAL_METADATA             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_SEND_INITIAL_METADATA); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 32, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":31
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_INITIAL_METADATA
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation.type", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":34
+ *     return GRPC_OP_SEND_INITIAL_METADATA
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_SEND_INITIAL_METADATA
+ *     self.c_op.flags = self._flags
+ */
+
+static void __pyx_f_7_cython_6cygrpc_28SendInitialMetadataOperation_c(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  grpc_metadata *__pyx_t_3;
+  size_t __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":35
+ * 
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_SEND_INITIAL_METADATA             # <<<<<<<<<<<<<<
+ *     self.c_op.flags = self._flags
+ *     _store_c_metadata(
+ */
+  __pyx_v_self->__pyx_base.c_op.op = GRPC_OP_SEND_INITIAL_METADATA;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":36
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_SEND_INITIAL_METADATA
+ *     self.c_op.flags = self._flags             # <<<<<<<<<<<<<<
+ *     _store_c_metadata(
+ *         self._initial_metadata, &self._c_initial_metadata,
+ */
+  __pyx_t_1 = __pyx_v_self->_flags;
+  __pyx_v_self->__pyx_base.c_op.flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":38
+ *     self.c_op.flags = self._flags
+ *     _store_c_metadata(
+ *         self._initial_metadata, &self._c_initial_metadata,             # <<<<<<<<<<<<<<
+ *         &self._c_initial_metadata_count)
+ *     self.c_op.data.send_initial_metadata.metadata = self._c_initial_metadata
+ */
+  __pyx_t_2 = __pyx_v_self->_initial_metadata;
+  __Pyx_INCREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":37
+ *     self.c_op.type = GRPC_OP_SEND_INITIAL_METADATA
+ *     self.c_op.flags = self._flags
+ *     _store_c_metadata(             # <<<<<<<<<<<<<<
+ *         self._initial_metadata, &self._c_initial_metadata,
+ *         &self._c_initial_metadata_count)
+ */
+  __pyx_f_7_cython_6cygrpc__store_c_metadata(__pyx_t_2, (&__pyx_v_self->_c_initial_metadata), (&__pyx_v_self->_c_initial_metadata_count)); if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 37, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":40
+ *         self._initial_metadata, &self._c_initial_metadata,
+ *         &self._c_initial_metadata_count)
+ *     self.c_op.data.send_initial_metadata.metadata = self._c_initial_metadata             # <<<<<<<<<<<<<<
+ *     self.c_op.data.send_initial_metadata.count = self._c_initial_metadata_count
+ *     self.c_op.data.send_initial_metadata.maybe_compression_level.is_set = 0
+ */
+  __pyx_t_3 = __pyx_v_self->_c_initial_metadata;
+  __pyx_v_self->__pyx_base.c_op.data.send_initial_metadata.metadata = __pyx_t_3;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":41
+ *         &self._c_initial_metadata_count)
+ *     self.c_op.data.send_initial_metadata.metadata = self._c_initial_metadata
+ *     self.c_op.data.send_initial_metadata.count = self._c_initial_metadata_count             # <<<<<<<<<<<<<<
+ *     self.c_op.data.send_initial_metadata.maybe_compression_level.is_set = 0
+ * 
+ */
+  __pyx_t_4 = __pyx_v_self->_c_initial_metadata_count;
+  __pyx_v_self->__pyx_base.c_op.data.send_initial_metadata.count = __pyx_t_4;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":42
+ *     self.c_op.data.send_initial_metadata.metadata = self._c_initial_metadata
+ *     self.c_op.data.send_initial_metadata.count = self._c_initial_metadata_count
+ *     self.c_op.data.send_initial_metadata.maybe_compression_level.is_set = 0             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void un_c(self) except *:
+ */
+  __pyx_v_self->__pyx_base.c_op.data.send_initial_metadata.maybe_compression_level.is_set = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":34
+ *     return GRPC_OP_SEND_INITIAL_METADATA
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_SEND_INITIAL_METADATA
+ *     self.c_op.flags = self._flags
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":44
+ *     self.c_op.data.send_initial_metadata.maybe_compression_level.is_set = 0
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     _release_c_metadata(
+ *         self._c_initial_metadata, self._c_initial_metadata_count)
+ */
+
+static void __pyx_f_7_cython_6cygrpc_28SendInitialMetadataOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self) {
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":45
+ * 
+ *   cdef void un_c(self) except *:
+ *     _release_c_metadata(             # <<<<<<<<<<<<<<
+ *         self._c_initial_metadata, self._c_initial_metadata_count)
+ * 
+ */
+  __pyx_f_7_cython_6cygrpc__release_c_metadata(__pyx_v_self->_c_initial_metadata, __pyx_v_self->_c_initial_metadata_count); if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 45, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":44
+ *     self.c_op.data.send_initial_metadata.maybe_compression_level.is_set = 0
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     _release_c_metadata(
+ *         self._c_initial_metadata, self._c_initial_metadata_count)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation.un_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":27
+ * cdef class SendInitialMetadataOperation(Operation):
+ * 
+ *   cdef readonly object _initial_metadata;             # <<<<<<<<<<<<<<
+ *   cdef readonly int _flags
+ *   cdef grpc_metadata *_c_initial_metadata
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_17_initial_metadata_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_17_initial_metadata_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_17_initial_metadata___get__(((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_17_initial_metadata___get__(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_initial_metadata);
+  __pyx_r = __pyx_v_self->_initial_metadata;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":28
+ * 
+ *   cdef readonly object _initial_metadata;
+ *   cdef readonly int _flags             # <<<<<<<<<<<<<<
+ *   cdef grpc_metadata *_c_initial_metadata
+ *   cdef size_t _c_initial_metadata_count
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_6_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_6_flags_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_6_flags___get__(((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(20, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation._flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_28SendInitialMetadataOperation_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_28SendInitialMetadataOperation_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendInitialMetadataOperation_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendInitialMetadataOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":51
+ * cdef class SendMessageOperation(Operation):
+ * 
+ *   def __cinit__(self, bytes message, int flags):             # <<<<<<<<<<<<<<
+ *     if message is None:
+ *       self._message = b''
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_20SendMessageOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_20SendMessageOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_message = 0;
+  int __pyx_v_flags;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_message,&__pyx_n_s_flags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_message)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 51, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 51, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(19, 51, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(19, 51, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_message = ((PyObject*)values[0]);
+    __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(19, 51, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(19, 51, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SendMessageOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_message), (&PyBytes_Type), 1, "message", 1))) __PYX_ERR(19, 51, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20SendMessageOperation___cinit__(((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)__pyx_v_self), __pyx_v_message, __pyx_v_flags);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_20SendMessageOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self, PyObject *__pyx_v_message, int __pyx_v_flags) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":52
+ * 
+ *   def __cinit__(self, bytes message, int flags):
+ *     if message is None:             # <<<<<<<<<<<<<<
+ *       self._message = b''
+ *     else:
+ */
+  __pyx_t_1 = (__pyx_v_message == ((PyObject*)Py_None));
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":53
+ *   def __cinit__(self, bytes message, int flags):
+ *     if message is None:
+ *       self._message = b''             # <<<<<<<<<<<<<<
+ *     else:
+ *       self._message = message
+ */
+    __Pyx_INCREF(__pyx_kp_b__7);
+    __Pyx_GIVEREF(__pyx_kp_b__7);
+    __Pyx_GOTREF(__pyx_v_self->_message);
+    __Pyx_DECREF(__pyx_v_self->_message);
+    __pyx_v_self->_message = __pyx_kp_b__7;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":52
+ * 
+ *   def __cinit__(self, bytes message, int flags):
+ *     if message is None:             # <<<<<<<<<<<<<<
+ *       self._message = b''
+ *     else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":55
+ *       self._message = b''
+ *     else:
+ *       self._message = message             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+  /*else*/ {
+    __Pyx_INCREF(__pyx_v_message);
+    __Pyx_GIVEREF(__pyx_v_message);
+    __Pyx_GOTREF(__pyx_v_self->_message);
+    __Pyx_DECREF(__pyx_v_self->_message);
+    __pyx_v_self->_message = __pyx_v_message;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":56
+ *     else:
+ *       self._message = message
+ *     self._flags = flags             # <<<<<<<<<<<<<<
+ * 
+ *   def type(self):
+ */
+  __pyx_v_self->_flags = __pyx_v_flags;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":51
+ * cdef class SendMessageOperation(Operation):
+ * 
+ *   def __cinit__(self, bytes message, int flags):             # <<<<<<<<<<<<<<
+ *     if message is None:
+ *       self._message = b''
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":58
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_MESSAGE
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20SendMessageOperation_3type = {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("type (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("type", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "type", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20SendMessageOperation_2type(((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__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("type", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":59
+ * 
+ *   def type(self):
+ *     return GRPC_OP_SEND_MESSAGE             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_SEND_MESSAGE); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":58
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_MESSAGE
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SendMessageOperation.type", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":61
+ *     return GRPC_OP_SEND_MESSAGE
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_SEND_MESSAGE
+ *     self.c_op.flags = self._flags
+ */
+
+static void __pyx_f_7_cython_6cygrpc_20SendMessageOperation_c(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self) {
+  grpc_slice __pyx_v_message_slice;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  char const *__pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  grpc_byte_buffer *__pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":62
+ * 
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_SEND_MESSAGE             # <<<<<<<<<<<<<<
+ *     self.c_op.flags = self._flags
+ *     cdef grpc_slice message_slice = grpc_slice_from_copied_buffer(
+ */
+  __pyx_v_self->__pyx_base.c_op.op = GRPC_OP_SEND_MESSAGE;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":63
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_SEND_MESSAGE
+ *     self.c_op.flags = self._flags             # <<<<<<<<<<<<<<
+ *     cdef grpc_slice message_slice = grpc_slice_from_copied_buffer(
+ *         self._message, len(self._message))
+ */
+  __pyx_t_1 = __pyx_v_self->_flags;
+  __pyx_v_self->__pyx_base.c_op.flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":65
+ *     self.c_op.flags = self._flags
+ *     cdef grpc_slice message_slice = grpc_slice_from_copied_buffer(
+ *         self._message, len(self._message))             # <<<<<<<<<<<<<<
+ *     self._c_message_byte_buffer = grpc_raw_byte_buffer_create(
+ *         &message_slice, 1)
+ */
+  if (unlikely(__pyx_v_self->_message == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+    __PYX_ERR(19, 65, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyBytes_AsString(__pyx_v_self->_message); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) __PYX_ERR(19, 65, __pyx_L1_error)
+  __pyx_t_3 = __pyx_v_self->_message;
+  __Pyx_INCREF(__pyx_t_3);
+  if (unlikely(__pyx_t_3 == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+    __PYX_ERR(19, 65, __pyx_L1_error)
+  }
+  __pyx_t_4 = __Pyx_PyBytes_GET_SIZE(__pyx_t_3); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(19, 65, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":64
+ *     self.c_op.type = GRPC_OP_SEND_MESSAGE
+ *     self.c_op.flags = self._flags
+ *     cdef grpc_slice message_slice = grpc_slice_from_copied_buffer(             # <<<<<<<<<<<<<<
+ *         self._message, len(self._message))
+ *     self._c_message_byte_buffer = grpc_raw_byte_buffer_create(
+ */
+  __pyx_v_message_slice = grpc_slice_from_copied_buffer(__pyx_t_2, __pyx_t_4);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":66
+ *     cdef grpc_slice message_slice = grpc_slice_from_copied_buffer(
+ *         self._message, len(self._message))
+ *     self._c_message_byte_buffer = grpc_raw_byte_buffer_create(             # <<<<<<<<<<<<<<
+ *         &message_slice, 1)
+ *     grpc_slice_unref(message_slice)
+ */
+  __pyx_v_self->_c_message_byte_buffer = grpc_raw_byte_buffer_create((&__pyx_v_message_slice), 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":68
+ *     self._c_message_byte_buffer = grpc_raw_byte_buffer_create(
+ *         &message_slice, 1)
+ *     grpc_slice_unref(message_slice)             # <<<<<<<<<<<<<<
+ *     self.c_op.data.send_message.send_message = self._c_message_byte_buffer
+ * 
+ */
+  grpc_slice_unref(__pyx_v_message_slice);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":69
+ *         &message_slice, 1)
+ *     grpc_slice_unref(message_slice)
+ *     self.c_op.data.send_message.send_message = self._c_message_byte_buffer             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void un_c(self) except *:
+ */
+  __pyx_t_5 = __pyx_v_self->_c_message_byte_buffer;
+  __pyx_v_self->__pyx_base.c_op.data.send_message.send_message = __pyx_t_5;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":61
+ *     return GRPC_OP_SEND_MESSAGE
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_SEND_MESSAGE
+ *     self.c_op.flags = self._flags
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.SendMessageOperation.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":71
+ *     self.c_op.data.send_message.send_message = self._c_message_byte_buffer
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     grpc_byte_buffer_destroy(self._c_message_byte_buffer)
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc_20SendMessageOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self) {
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":72
+ * 
+ *   cdef void un_c(self) except *:
+ *     grpc_byte_buffer_destroy(self._c_message_byte_buffer)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  grpc_byte_buffer_destroy(__pyx_v_self->_c_message_byte_buffer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":71
+ *     self.c_op.data.send_message.send_message = self._c_message_byte_buffer
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     grpc_byte_buffer_destroy(self._c_message_byte_buffer)
+ * 
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":38
+ * cdef class SendMessageOperation(Operation):
+ * 
+ *   cdef readonly bytes _message             # <<<<<<<<<<<<<<
+ *   cdef readonly int _flags
+ *   cdef grpc_byte_buffer *_c_message_byte_buffer
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_8_message_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_8_message_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20SendMessageOperation_8_message___get__(((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_8_message___get__(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_message);
+  __pyx_r = __pyx_v_self->_message;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":39
+ * 
+ *   cdef readonly bytes _message
+ *   cdef readonly int _flags             # <<<<<<<<<<<<<<
+ *   cdef grpc_byte_buffer *_c_message_byte_buffer
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_6_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_6_flags_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20SendMessageOperation_6_flags___get__(((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(20, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SendMessageOperation._flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20SendMessageOperation_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20SendMessageOperation_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendMessageOperation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20SendMessageOperation_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SendMessageOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20SendMessageOperation_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20SendMessageOperation_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendMessageOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":77
+ * cdef class SendCloseFromClientOperation(Operation):
+ * 
+ *   def __cinit__(self, int flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_v_flags;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_flags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 77, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(19, 77, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_flags = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(19, 77, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(19, 77, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SendCloseFromClientOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation___cinit__(((struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *)__pyx_v_self), __pyx_v_flags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self, int __pyx_v_flags) {
+  int __pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":78
+ * 
+ *   def __cinit__(self, int flags):
+ *     self._flags = flags             # <<<<<<<<<<<<<<
+ * 
+ *   def type(self):
+ */
+  __pyx_v_self->_flags = __pyx_v_flags;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":77
+ * cdef class SendCloseFromClientOperation(Operation):
+ * 
+ *   def __cinit__(self, int flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":80
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_28SendCloseFromClientOperation_3type = {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("type (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("type", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "type", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_2type(((struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__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("type", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":81
+ * 
+ *   def type(self):
+ *     return GRPC_OP_SEND_CLOSE_FROM_CLIENT             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_SEND_CLOSE_FROM_CLIENT); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 81, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":80
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SendCloseFromClientOperation.type", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":83
+ *     return GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ *     self.c_op.flags = self._flags
+ */
+
+static void __pyx_f_7_cython_6cygrpc_28SendCloseFromClientOperation_c(struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":84
+ * 
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_SEND_CLOSE_FROM_CLIENT             # <<<<<<<<<<<<<<
+ *     self.c_op.flags = self._flags
+ * 
+ */
+  __pyx_v_self->__pyx_base.c_op.op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":85
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ *     self.c_op.flags = self._flags             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void un_c(self) except *:
+ */
+  __pyx_t_1 = __pyx_v_self->_flags;
+  __pyx_v_self->__pyx_base.c_op.flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":83
+ *     return GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ *     self.c_op.flags = self._flags
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":87
+ *     self.c_op.flags = self._flags
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     pass
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc_28SendCloseFromClientOperation_un_c(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self) {
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":48
+ * cdef class SendCloseFromClientOperation(Operation):
+ * 
+ *   cdef readonly int _flags             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_6_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_6_flags_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_6_flags___get__(((struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(20, 48, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SendCloseFromClientOperation._flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_28SendCloseFromClientOperation_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendCloseFromClientOperation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_28SendCloseFromClientOperation_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SendCloseFromClientOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28SendCloseFromClientOperation_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendCloseFromClientOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":93
+ * cdef class SendStatusFromServerOperation(Operation):
+ * 
+ *   def __cinit__(self, trailing_metadata, code, object details, int flags):             # <<<<<<<<<<<<<<
+ *     self._trailing_metadata = trailing_metadata
+ *     self._code = code
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_trailing_metadata = 0;
+  PyObject *__pyx_v_code = 0;
+  PyObject *__pyx_v_details = 0;
+  int __pyx_v_flags;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[4] = {0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_trailing_metadata,&__pyx_n_s_code,&__pyx_n_s_details,&__pyx_n_s_flags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_trailing_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 93, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 93, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 1); __PYX_ERR(19, 93, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 93, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 2); __PYX_ERR(19, 93, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 93, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 3); __PYX_ERR(19, 93, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(19, 93, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 4)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+      values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+    }
+    __pyx_v_trailing_metadata = values[0];
+    __pyx_v_code = values[1];
+    __pyx_v_details = values[2];
+    __pyx_v_flags = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(19, 93, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, __pyx_nargs); __PYX_ERR(19, 93, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SendStatusFromServerOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation___cinit__(((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_v_self), __pyx_v_trailing_metadata, __pyx_v_code, __pyx_v_details, __pyx_v_flags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self, PyObject *__pyx_v_trailing_metadata, PyObject *__pyx_v_code, PyObject *__pyx_v_details, int __pyx_v_flags) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":94
+ * 
+ *   def __cinit__(self, trailing_metadata, code, object details, int flags):
+ *     self._trailing_metadata = trailing_metadata             # <<<<<<<<<<<<<<
+ *     self._code = code
+ *     self._details = details
+ */
+  __Pyx_INCREF(__pyx_v_trailing_metadata);
+  __Pyx_GIVEREF(__pyx_v_trailing_metadata);
+  __Pyx_GOTREF(__pyx_v_self->_trailing_metadata);
+  __Pyx_DECREF(__pyx_v_self->_trailing_metadata);
+  __pyx_v_self->_trailing_metadata = __pyx_v_trailing_metadata;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":95
+ *   def __cinit__(self, trailing_metadata, code, object details, int flags):
+ *     self._trailing_metadata = trailing_metadata
+ *     self._code = code             # <<<<<<<<<<<<<<
+ *     self._details = details
+ *     self._flags = flags
+ */
+  __Pyx_INCREF(__pyx_v_code);
+  __Pyx_GIVEREF(__pyx_v_code);
+  __Pyx_GOTREF(__pyx_v_self->_code);
+  __Pyx_DECREF(__pyx_v_self->_code);
+  __pyx_v_self->_code = __pyx_v_code;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":96
+ *     self._trailing_metadata = trailing_metadata
+ *     self._code = code
+ *     self._details = details             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_details);
+  __Pyx_GIVEREF(__pyx_v_details);
+  __Pyx_GOTREF(__pyx_v_self->_details);
+  __Pyx_DECREF(__pyx_v_self->_details);
+  __pyx_v_self->_details = __pyx_v_details;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":97
+ *     self._code = code
+ *     self._details = details
+ *     self._flags = flags             # <<<<<<<<<<<<<<
+ * 
+ *   def type(self):
+ */
+  __pyx_v_self->_flags = __pyx_v_flags;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":93
+ * cdef class SendStatusFromServerOperation(Operation):
+ * 
+ *   def __cinit__(self, trailing_metadata, code, object details, int flags):             # <<<<<<<<<<<<<<
+ *     self._trailing_metadata = trailing_metadata
+ *     self._code = code
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":99
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_STATUS_FROM_SERVER
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29SendStatusFromServerOperation_3type = {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("type (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("type", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "type", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_2type(((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__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("type", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":100
+ * 
+ *   def type(self):
+ *     return GRPC_OP_SEND_STATUS_FROM_SERVER             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_SEND_STATUS_FROM_SERVER); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 100, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":99
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_STATUS_FROM_SERVER
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SendStatusFromServerOperation.type", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":102
+ *     return GRPC_OP_SEND_STATUS_FROM_SERVER
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_SEND_STATUS_FROM_SERVER
+ *     self.c_op.flags = self._flags
+ */
+
+static void __pyx_f_7_cython_6cygrpc_29SendStatusFromServerOperation_c(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  grpc_metadata *__pyx_t_3;
+  size_t __pyx_t_4;
+  grpc_status_code __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  grpc_slice __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":103
+ * 
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_SEND_STATUS_FROM_SERVER             # <<<<<<<<<<<<<<
+ *     self.c_op.flags = self._flags
+ *     _store_c_metadata(
+ */
+  __pyx_v_self->__pyx_base.c_op.op = GRPC_OP_SEND_STATUS_FROM_SERVER;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":104
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_SEND_STATUS_FROM_SERVER
+ *     self.c_op.flags = self._flags             # <<<<<<<<<<<<<<
+ *     _store_c_metadata(
+ *         self._trailing_metadata, &self._c_trailing_metadata,
+ */
+  __pyx_t_1 = __pyx_v_self->_flags;
+  __pyx_v_self->__pyx_base.c_op.flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":106
+ *     self.c_op.flags = self._flags
+ *     _store_c_metadata(
+ *         self._trailing_metadata, &self._c_trailing_metadata,             # <<<<<<<<<<<<<<
+ *         &self._c_trailing_metadata_count)
+ *     self.c_op.data.send_status_from_server.trailing_metadata = (
+ */
+  __pyx_t_2 = __pyx_v_self->_trailing_metadata;
+  __Pyx_INCREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":105
+ *     self.c_op.type = GRPC_OP_SEND_STATUS_FROM_SERVER
+ *     self.c_op.flags = self._flags
+ *     _store_c_metadata(             # <<<<<<<<<<<<<<
+ *         self._trailing_metadata, &self._c_trailing_metadata,
+ *         &self._c_trailing_metadata_count)
+ */
+  __pyx_f_7_cython_6cygrpc__store_c_metadata(__pyx_t_2, (&__pyx_v_self->_c_trailing_metadata), (&__pyx_v_self->_c_trailing_metadata_count)); if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 105, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":109
+ *         &self._c_trailing_metadata_count)
+ *     self.c_op.data.send_status_from_server.trailing_metadata = (
+ *         self._c_trailing_metadata)             # <<<<<<<<<<<<<<
+ *     self.c_op.data.send_status_from_server.trailing_metadata_count = (
+ *         self._c_trailing_metadata_count)
+ */
+  __pyx_t_3 = __pyx_v_self->_c_trailing_metadata;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":108
+ *         self._trailing_metadata, &self._c_trailing_metadata,
+ *         &self._c_trailing_metadata_count)
+ *     self.c_op.data.send_status_from_server.trailing_metadata = (             # <<<<<<<<<<<<<<
+ *         self._c_trailing_metadata)
+ *     self.c_op.data.send_status_from_server.trailing_metadata_count = (
+ */
+  __pyx_v_self->__pyx_base.c_op.data.send_status_from_server.trailing_metadata = __pyx_t_3;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":111
+ *         self._c_trailing_metadata)
+ *     self.c_op.data.send_status_from_server.trailing_metadata_count = (
+ *         self._c_trailing_metadata_count)             # <<<<<<<<<<<<<<
+ *     self.c_op.data.send_status_from_server.status = self._code
+ *     self._c_details = _slice_from_bytes(_encode(self._details))
+ */
+  __pyx_t_4 = __pyx_v_self->_c_trailing_metadata_count;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":110
+ *     self.c_op.data.send_status_from_server.trailing_metadata = (
+ *         self._c_trailing_metadata)
+ *     self.c_op.data.send_status_from_server.trailing_metadata_count = (             # <<<<<<<<<<<<<<
+ *         self._c_trailing_metadata_count)
+ *     self.c_op.data.send_status_from_server.status = self._code
+ */
+  __pyx_v_self->__pyx_base.c_op.data.send_status_from_server.trailing_metadata_count = __pyx_t_4;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":112
+ *     self.c_op.data.send_status_from_server.trailing_metadata_count = (
+ *         self._c_trailing_metadata_count)
+ *     self.c_op.data.send_status_from_server.status = self._code             # <<<<<<<<<<<<<<
+ *     self._c_details = _slice_from_bytes(_encode(self._details))
+ *     self.c_op.data.send_status_from_server.status_details = &self._c_details
+ */
+  __pyx_t_5 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_v_self->_code)); if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 112, __pyx_L1_error)
+  __pyx_v_self->__pyx_base.c_op.data.send_status_from_server.status = __pyx_t_5;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":113
+ *         self._c_trailing_metadata_count)
+ *     self.c_op.data.send_status_from_server.status = self._code
+ *     self._c_details = _slice_from_bytes(_encode(self._details))             # <<<<<<<<<<<<<<
+ *     self.c_op.data.send_status_from_server.status_details = &self._c_details
+ * 
+ */
+  __pyx_t_2 = __pyx_v_self->_details;
+  __Pyx_INCREF(__pyx_t_2);
+  __pyx_t_6 = __pyx_f_7_cython_6cygrpc__encode(__pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(19, 113, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_7 = __pyx_f_7_cython_6cygrpc__slice_from_bytes(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 113, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_v_self->_c_details = __pyx_t_7;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":114
+ *     self.c_op.data.send_status_from_server.status = self._code
+ *     self._c_details = _slice_from_bytes(_encode(self._details))
+ *     self.c_op.data.send_status_from_server.status_details = &self._c_details             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void un_c(self) except *:
+ */
+  __pyx_v_self->__pyx_base.c_op.data.send_status_from_server.status_details = (&__pyx_v_self->_c_details);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":102
+ *     return GRPC_OP_SEND_STATUS_FROM_SERVER
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_SEND_STATUS_FROM_SERVER
+ *     self.c_op.flags = self._flags
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc.SendStatusFromServerOperation.c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":116
+ *     self.c_op.data.send_status_from_server.status_details = &self._c_details
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     grpc_slice_unref(self._c_details)
+ *     _release_c_metadata(
+ */
+
+static void __pyx_f_7_cython_6cygrpc_29SendStatusFromServerOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self) {
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":117
+ * 
+ *   cdef void un_c(self) except *:
+ *     grpc_slice_unref(self._c_details)             # <<<<<<<<<<<<<<
+ *     _release_c_metadata(
+ *         self._c_trailing_metadata, self._c_trailing_metadata_count)
+ */
+  grpc_slice_unref(__pyx_v_self->_c_details);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":118
+ *   cdef void un_c(self) except *:
+ *     grpc_slice_unref(self._c_details)
+ *     _release_c_metadata(             # <<<<<<<<<<<<<<
+ *         self._c_trailing_metadata, self._c_trailing_metadata_count)
+ * 
+ */
+  __pyx_f_7_cython_6cygrpc__release_c_metadata(__pyx_v_self->_c_trailing_metadata, __pyx_v_self->_c_trailing_metadata_count); if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 118, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":116
+ *     self.c_op.data.send_status_from_server.status_details = &self._c_details
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     grpc_slice_unref(self._c_details)
+ *     _release_c_metadata(
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendStatusFromServerOperation.un_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":56
+ * cdef class SendStatusFromServerOperation(Operation):
+ * 
+ *   cdef readonly object _trailing_metadata             # <<<<<<<<<<<<<<
+ *   cdef readonly object _code
+ *   cdef readonly object _details
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_18_trailing_metadata_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_18_trailing_metadata_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_18_trailing_metadata___get__(((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_18_trailing_metadata___get__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_trailing_metadata);
+  __pyx_r = __pyx_v_self->_trailing_metadata;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":57
+ * 
+ *   cdef readonly object _trailing_metadata
+ *   cdef readonly object _code             # <<<<<<<<<<<<<<
+ *   cdef readonly object _details
+ *   cdef readonly int _flags
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_5_code_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_5_code_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_5_code___get__(((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_5_code___get__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_code);
+  __pyx_r = __pyx_v_self->_code;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":58
+ *   cdef readonly object _trailing_metadata
+ *   cdef readonly object _code
+ *   cdef readonly object _details             # <<<<<<<<<<<<<<
+ *   cdef readonly int _flags
+ *   cdef grpc_metadata *_c_trailing_metadata
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_8_details_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_8_details_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_8_details___get__(((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_8_details___get__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_details);
+  __pyx_r = __pyx_v_self->_details;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":59
+ *   cdef readonly object _code
+ *   cdef readonly object _details
+ *   cdef readonly int _flags             # <<<<<<<<<<<<<<
+ *   cdef grpc_metadata *_c_trailing_metadata
+ *   cdef size_t _c_trailing_metadata_count
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_6_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_6_flags_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_6_flags___get__(((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(20, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.SendStatusFromServerOperation._flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29SendStatusFromServerOperation_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendStatusFromServerOperation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29SendStatusFromServerOperation_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SendStatusFromServerOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29SendStatusFromServerOperation_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SendStatusFromServerOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":124
+ * cdef class ReceiveInitialMetadataOperation(Operation):
+ * 
+ *   def __cinit__(self, flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_flags = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_flags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 124, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(19, 124, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_flags = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(19, 124, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveInitialMetadataOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)__pyx_v_self), __pyx_v_flags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self, PyObject *__pyx_v_flags) {
+  int __pyx_r;
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":125
+ * 
+ *   def __cinit__(self, flags):
+ *     self._flags = flags             # <<<<<<<<<<<<<<
+ * 
+ *   def type(self):
+ */
+  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_flags); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(19, 125, __pyx_L1_error)
+  __pyx_v_self->_flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":124
+ * cdef class ReceiveInitialMetadataOperation(Operation):
+ * 
+ *   def __cinit__(self, flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveInitialMetadataOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":127
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_INITIAL_METADATA
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_3type = {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("type (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("type", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "type", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_2type(((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__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("type", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":128
+ * 
+ *   def type(self):
+ *     return GRPC_OP_RECV_INITIAL_METADATA             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_RECV_INITIAL_METADATA); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 128, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":127
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_INITIAL_METADATA
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveInitialMetadataOperation.type", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":130
+ *     return GRPC_OP_RECV_INITIAL_METADATA
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_RECV_INITIAL_METADATA
+ *     self.c_op.flags = self._flags
+ */
+
+static void __pyx_f_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":131
+ * 
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_RECV_INITIAL_METADATA             # <<<<<<<<<<<<<<
+ *     self.c_op.flags = self._flags
+ *     grpc_metadata_array_init(&self._c_initial_metadata)
+ */
+  __pyx_v_self->__pyx_base.c_op.op = GRPC_OP_RECV_INITIAL_METADATA;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":132
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_RECV_INITIAL_METADATA
+ *     self.c_op.flags = self._flags             # <<<<<<<<<<<<<<
+ *     grpc_metadata_array_init(&self._c_initial_metadata)
+ *     self.c_op.data.receive_initial_metadata.receive_initial_metadata = (
+ */
+  __pyx_t_1 = __pyx_v_self->_flags;
+  __pyx_v_self->__pyx_base.c_op.flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":133
+ *     self.c_op.type = GRPC_OP_RECV_INITIAL_METADATA
+ *     self.c_op.flags = self._flags
+ *     grpc_metadata_array_init(&self._c_initial_metadata)             # <<<<<<<<<<<<<<
+ *     self.c_op.data.receive_initial_metadata.receive_initial_metadata = (
+ *         &self._c_initial_metadata)
+ */
+  grpc_metadata_array_init((&__pyx_v_self->_c_initial_metadata));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":134
+ *     self.c_op.flags = self._flags
+ *     grpc_metadata_array_init(&self._c_initial_metadata)
+ *     self.c_op.data.receive_initial_metadata.receive_initial_metadata = (             # <<<<<<<<<<<<<<
+ *         &self._c_initial_metadata)
+ * 
+ */
+  __pyx_v_self->__pyx_base.c_op.data.recv_initial_metadata.recv_initial_metadata = (&__pyx_v_self->_c_initial_metadata);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":130
+ *     return GRPC_OP_RECV_INITIAL_METADATA
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_RECV_INITIAL_METADATA
+ *     self.c_op.flags = self._flags
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":137
+ *         &self._c_initial_metadata)
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     self._initial_metadata = _metadata(&self._c_initial_metadata)
+ *     grpc_metadata_array_destroy(&self._c_initial_metadata)
+ */
+
+static void __pyx_f_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("un_c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":138
+ * 
+ *   cdef void un_c(self) except *:
+ *     self._initial_metadata = _metadata(&self._c_initial_metadata)             # <<<<<<<<<<<<<<
+ *     grpc_metadata_array_destroy(&self._c_initial_metadata)
+ * 
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__metadata((&__pyx_v_self->_c_initial_metadata)); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 138, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_initial_metadata);
+  __Pyx_DECREF(__pyx_v_self->_initial_metadata);
+  __pyx_v_self->_initial_metadata = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":139
+ *   cdef void un_c(self) except *:
+ *     self._initial_metadata = _metadata(&self._c_initial_metadata)
+ *     grpc_metadata_array_destroy(&self._c_initial_metadata)             # <<<<<<<<<<<<<<
+ * 
+ *   def initial_metadata(self):
+ */
+  grpc_metadata_array_destroy((&__pyx_v_self->_c_initial_metadata));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":137
+ *         &self._c_initial_metadata)
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     self._initial_metadata = _metadata(&self._c_initial_metadata)
+ *     grpc_metadata_array_destroy(&self._c_initial_metadata)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveInitialMetadataOperation.un_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":141
+ *     grpc_metadata_array_destroy(&self._c_initial_metadata)
+ * 
+ *   def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *     return self._initial_metadata
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_5initial_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_5initial_metadata = {"initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_5initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_5initial_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("initial_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("initial_metadata", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "initial_metadata", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_4initial_metadata(((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_4initial_metadata(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("initial_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":142
+ * 
+ *   def initial_metadata(self):
+ *     return self._initial_metadata             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_initial_metadata);
+  __pyx_r = __pyx_v_self->_initial_metadata;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":141
+ *     grpc_metadata_array_destroy(&self._c_initial_metadata)
+ * 
+ *   def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *     return self._initial_metadata
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":70
+ * cdef class ReceiveInitialMetadataOperation(Operation):
+ * 
+ *   cdef readonly int _flags             # <<<<<<<<<<<<<<
+ *   cdef tuple _initial_metadata
+ *   cdef grpc_metadata_array _c_initial_metadata
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6_flags_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6_flags___get__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(20, 70, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveInitialMetadataOperation._flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveInitialMetadataOperation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveInitialMetadataOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_8__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveInitialMetadataOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":147
+ * cdef class ReceiveMessageOperation(Operation):
+ * 
+ *   def __cinit__(self, flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_flags = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_flags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 147, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(19, 147, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_flags = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(19, 147, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveMessageOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_v_self), __pyx_v_flags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self, PyObject *__pyx_v_flags) {
+  int __pyx_r;
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":148
+ * 
+ *   def __cinit__(self, flags):
+ *     self._flags = flags             # <<<<<<<<<<<<<<
+ * 
+ *   def type(self):
+ */
+  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_flags); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(19, 148, __pyx_L1_error)
+  __pyx_v_self->_flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":147
+ * cdef class ReceiveMessageOperation(Operation):
+ * 
+ *   def __cinit__(self, flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveMessageOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":150
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_MESSAGE
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23ReceiveMessageOperation_3type = {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("type (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("type", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "type", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_2type(((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__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("type", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":151
+ * 
+ *   def type(self):
+ *     return GRPC_OP_RECV_MESSAGE             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_RECV_MESSAGE); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 151, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":150
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_MESSAGE
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveMessageOperation.type", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":153
+ *     return GRPC_OP_RECV_MESSAGE
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_RECV_MESSAGE
+ *     self.c_op.flags = self._flags
+ */
+
+static void __pyx_f_7_cython_6cygrpc_23ReceiveMessageOperation_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":154
+ * 
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_RECV_MESSAGE             # <<<<<<<<<<<<<<
+ *     self.c_op.flags = self._flags
+ *     self.c_op.data.receive_message.receive_message = (
+ */
+  __pyx_v_self->__pyx_base.c_op.op = GRPC_OP_RECV_MESSAGE;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":155
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_RECV_MESSAGE
+ *     self.c_op.flags = self._flags             # <<<<<<<<<<<<<<
+ *     self.c_op.data.receive_message.receive_message = (
+ *         &self._c_message_byte_buffer)
+ */
+  __pyx_t_1 = __pyx_v_self->_flags;
+  __pyx_v_self->__pyx_base.c_op.flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":156
+ *     self.c_op.type = GRPC_OP_RECV_MESSAGE
+ *     self.c_op.flags = self._flags
+ *     self.c_op.data.receive_message.receive_message = (             # <<<<<<<<<<<<<<
+ *         &self._c_message_byte_buffer)
+ * 
+ */
+  __pyx_v_self->__pyx_base.c_op.data.recv_message.recv_message = (&__pyx_v_self->_c_message_byte_buffer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":153
+ *     return GRPC_OP_RECV_MESSAGE
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_RECV_MESSAGE
+ *     self.c_op.flags = self._flags
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":159
+ *         &self._c_message_byte_buffer)
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef grpc_byte_buffer_reader message_reader
+ *     cdef bint message_reader_status
+ */
+
+static void __pyx_f_7_cython_6cygrpc_23ReceiveMessageOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self) {
+  struct grpc_byte_buffer_reader __pyx_v_message_reader;
+  int __pyx_v_message_reader_status;
+  grpc_slice __pyx_v_message_slice;
+  size_t __pyx_v_message_slice_length;
+  void *__pyx_v_message_slice_pointer;
+  PyObject *__pyx_v_message = 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("un_c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":165
+ *     cdef size_t message_slice_length
+ *     cdef void *message_slice_pointer
+ *     if self._c_message_byte_buffer != NULL:             # <<<<<<<<<<<<<<
+ *       message_reader_status = grpc_byte_buffer_reader_init(
+ *           &message_reader, self._c_message_byte_buffer)
+ */
+  __pyx_t_1 = (__pyx_v_self->_c_message_byte_buffer != NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":166
+ *     cdef void *message_slice_pointer
+ *     if self._c_message_byte_buffer != NULL:
+ *       message_reader_status = grpc_byte_buffer_reader_init(             # <<<<<<<<<<<<<<
+ *           &message_reader, self._c_message_byte_buffer)
+ *       if message_reader_status:
+ */
+    __pyx_v_message_reader_status = grpc_byte_buffer_reader_init((&__pyx_v_message_reader), __pyx_v_self->_c_message_byte_buffer);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":168
+ *       message_reader_status = grpc_byte_buffer_reader_init(
+ *           &message_reader, self._c_message_byte_buffer)
+ *       if message_reader_status:             # <<<<<<<<<<<<<<
+ *         message = bytearray()
+ *         while grpc_byte_buffer_reader_next(&message_reader, &message_slice):
+ */
+    if (__pyx_v_message_reader_status) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":169
+ *           &message_reader, self._c_message_byte_buffer)
+ *       if message_reader_status:
+ *         message = bytearray()             # <<<<<<<<<<<<<<
+ *         while grpc_byte_buffer_reader_next(&message_reader, &message_slice):
+ *           message_slice_pointer = grpc_slice_start_ptr(message_slice)
+ */
+      __pyx_t_2 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 169, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_v_message = ((PyObject*)__pyx_t_2);
+      __pyx_t_2 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":170
+ *       if message_reader_status:
+ *         message = bytearray()
+ *         while grpc_byte_buffer_reader_next(&message_reader, &message_slice):             # <<<<<<<<<<<<<<
+ *           message_slice_pointer = grpc_slice_start_ptr(message_slice)
+ *           message_slice_length = grpc_slice_length(message_slice)
+ */
+      while (1) {
+        __pyx_t_1 = (grpc_byte_buffer_reader_next((&__pyx_v_message_reader), (&__pyx_v_message_slice)) != 0);
+        if (!__pyx_t_1) break;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":171
+ *         message = bytearray()
+ *         while grpc_byte_buffer_reader_next(&message_reader, &message_slice):
+ *           message_slice_pointer = grpc_slice_start_ptr(message_slice)             # <<<<<<<<<<<<<<
+ *           message_slice_length = grpc_slice_length(message_slice)
+ *           message += (<char *>message_slice_pointer)[:message_slice_length]
+ */
+        __pyx_v_message_slice_pointer = GRPC_SLICE_START_PTR(__pyx_v_message_slice);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":172
+ *         while grpc_byte_buffer_reader_next(&message_reader, &message_slice):
+ *           message_slice_pointer = grpc_slice_start_ptr(message_slice)
+ *           message_slice_length = grpc_slice_length(message_slice)             # <<<<<<<<<<<<<<
+ *           message += (<char *>message_slice_pointer)[:message_slice_length]
+ *           grpc_slice_unref(message_slice)
+ */
+        __pyx_v_message_slice_length = GRPC_SLICE_LENGTH(__pyx_v_message_slice);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":173
+ *           message_slice_pointer = grpc_slice_start_ptr(message_slice)
+ *           message_slice_length = grpc_slice_length(message_slice)
+ *           message += (<char *>message_slice_pointer)[:message_slice_length]             # <<<<<<<<<<<<<<
+ *           grpc_slice_unref(message_slice)
+ *         grpc_byte_buffer_reader_destroy(&message_reader)
+ */
+        __pyx_t_2 = __Pyx_PyBytes_FromStringAndSize(((char *)__pyx_v_message_slice_pointer) + 0, __pyx_v_message_slice_length - 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 173, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_message, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(19, 173, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF_SET(__pyx_v_message, ((PyObject*)__pyx_t_3));
+        __pyx_t_3 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":174
+ *           message_slice_length = grpc_slice_length(message_slice)
+ *           message += (<char *>message_slice_pointer)[:message_slice_length]
+ *           grpc_slice_unref(message_slice)             # <<<<<<<<<<<<<<
+ *         grpc_byte_buffer_reader_destroy(&message_reader)
+ *         self._message = bytes(message)
+ */
+        grpc_slice_unref(__pyx_v_message_slice);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":175
+ *           message += (<char *>message_slice_pointer)[:message_slice_length]
+ *           grpc_slice_unref(message_slice)
+ *         grpc_byte_buffer_reader_destroy(&message_reader)             # <<<<<<<<<<<<<<
+ *         self._message = bytes(message)
+ *       else:
+ */
+      grpc_byte_buffer_reader_destroy((&__pyx_v_message_reader));
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":176
+ *           grpc_slice_unref(message_slice)
+ *         grpc_byte_buffer_reader_destroy(&message_reader)
+ *         self._message = bytes(message)             # <<<<<<<<<<<<<<
+ *       else:
+ *         self._message = None
+ */
+      __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_message); if (unlikely(!__pyx_t_3)) __PYX_ERR(19, 176, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
+      __Pyx_GOTREF(__pyx_v_self->_message);
+      __Pyx_DECREF(__pyx_v_self->_message);
+      __pyx_v_self->_message = ((PyObject*)__pyx_t_3);
+      __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":168
+ *       message_reader_status = grpc_byte_buffer_reader_init(
+ *           &message_reader, self._c_message_byte_buffer)
+ *       if message_reader_status:             # <<<<<<<<<<<<<<
+ *         message = bytearray()
+ *         while grpc_byte_buffer_reader_next(&message_reader, &message_slice):
+ */
+      goto __pyx_L4;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":178
+ *         self._message = bytes(message)
+ *       else:
+ *         self._message = None             # <<<<<<<<<<<<<<
+ *       grpc_byte_buffer_destroy(self._c_message_byte_buffer)
+ *     else:
+ */
+    /*else*/ {
+      __Pyx_INCREF(Py_None);
+      __Pyx_GIVEREF(Py_None);
+      __Pyx_GOTREF(__pyx_v_self->_message);
+      __Pyx_DECREF(__pyx_v_self->_message);
+      __pyx_v_self->_message = ((PyObject*)Py_None);
+    }
+    __pyx_L4:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":179
+ *       else:
+ *         self._message = None
+ *       grpc_byte_buffer_destroy(self._c_message_byte_buffer)             # <<<<<<<<<<<<<<
+ *     else:
+ *       self._message = None
+ */
+    grpc_byte_buffer_destroy(__pyx_v_self->_c_message_byte_buffer);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":165
+ *     cdef size_t message_slice_length
+ *     cdef void *message_slice_pointer
+ *     if self._c_message_byte_buffer != NULL:             # <<<<<<<<<<<<<<
+ *       message_reader_status = grpc_byte_buffer_reader_init(
+ *           &message_reader, self._c_message_byte_buffer)
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":181
+ *       grpc_byte_buffer_destroy(self._c_message_byte_buffer)
+ *     else:
+ *       self._message = None             # <<<<<<<<<<<<<<
+ * 
+ *   def message(self):
+ */
+  /*else*/ {
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    __Pyx_GOTREF(__pyx_v_self->_message);
+    __Pyx_DECREF(__pyx_v_self->_message);
+    __pyx_v_self->_message = ((PyObject*)Py_None);
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":159
+ *         &self._c_message_byte_buffer)
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef grpc_byte_buffer_reader message_reader
+ *     cdef bint message_reader_status
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveMessageOperation.un_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_message);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":183
+ *       self._message = None
+ * 
+ *   def message(self):             # <<<<<<<<<<<<<<
+ *     return self._message
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_5message(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23ReceiveMessageOperation_5message = {"message", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_5message, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_5message(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("message (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("message", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "message", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_4message(((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_4message(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("message", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":184
+ * 
+ *   def message(self):
+ *     return self._message             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_message);
+  __pyx_r = __pyx_v_self->_message;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":183
+ *       self._message = None
+ * 
+ *   def message(self):             # <<<<<<<<<<<<<<
+ *     return self._message
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":80
+ * cdef class ReceiveMessageOperation(Operation):
+ * 
+ *   cdef readonly int _flags             # <<<<<<<<<<<<<<
+ *   cdef grpc_byte_buffer *_c_message_byte_buffer
+ *   cdef bytes _message
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_6_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_6_flags_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_6_flags___get__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(20, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveMessageOperation._flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23ReceiveMessageOperation_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_6__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveMessageOperation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_23ReceiveMessageOperation_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveMessageOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_8__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_23ReceiveMessageOperation_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveMessageOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":189
+ * cdef class ReceiveStatusOnClientOperation(Operation):
+ * 
+ *   def __cinit__(self, flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_flags = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_flags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 189, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(19, 189, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_flags = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(19, 189, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveStatusOnClientOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self), __pyx_v_flags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self, PyObject *__pyx_v_flags) {
+  int __pyx_r;
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":190
+ * 
+ *   def __cinit__(self, flags):
+ *     self._flags = flags             # <<<<<<<<<<<<<<
+ * 
+ *   def type(self):
+ */
+  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_flags); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(19, 190, __pyx_L1_error)
+  __pyx_v_self->_flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":189
+ * cdef class ReceiveStatusOnClientOperation(Operation):
+ * 
+ *   def __cinit__(self, flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveStatusOnClientOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":192
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_STATUS_ON_CLIENT
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_3type = {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("type (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("type", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "type", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_2type(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__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("type", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":193
+ * 
+ *   def type(self):
+ *     return GRPC_OP_RECV_STATUS_ON_CLIENT             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_RECV_STATUS_ON_CLIENT); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 193, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":192
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_STATUS_ON_CLIENT
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveStatusOnClientOperation.type", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":195
+ *     return GRPC_OP_RECV_STATUS_ON_CLIENT
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_RECV_STATUS_ON_CLIENT
+ *     self.c_op.flags = self._flags
+ */
+
+static void __pyx_f_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":196
+ * 
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_RECV_STATUS_ON_CLIENT             # <<<<<<<<<<<<<<
+ *     self.c_op.flags = self._flags
+ *     grpc_metadata_array_init(&self._c_trailing_metadata)
+ */
+  __pyx_v_self->__pyx_base.c_op.op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":197
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_RECV_STATUS_ON_CLIENT
+ *     self.c_op.flags = self._flags             # <<<<<<<<<<<<<<
+ *     grpc_metadata_array_init(&self._c_trailing_metadata)
+ *     self.c_op.data.receive_status_on_client.trailing_metadata = (
+ */
+  __pyx_t_1 = __pyx_v_self->_flags;
+  __pyx_v_self->__pyx_base.c_op.flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":198
+ *     self.c_op.type = GRPC_OP_RECV_STATUS_ON_CLIENT
+ *     self.c_op.flags = self._flags
+ *     grpc_metadata_array_init(&self._c_trailing_metadata)             # <<<<<<<<<<<<<<
+ *     self.c_op.data.receive_status_on_client.trailing_metadata = (
+ *         &self._c_trailing_metadata)
+ */
+  grpc_metadata_array_init((&__pyx_v_self->_c_trailing_metadata));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":199
+ *     self.c_op.flags = self._flags
+ *     grpc_metadata_array_init(&self._c_trailing_metadata)
+ *     self.c_op.data.receive_status_on_client.trailing_metadata = (             # <<<<<<<<<<<<<<
+ *         &self._c_trailing_metadata)
+ *     self.c_op.data.receive_status_on_client.status = (
+ */
+  __pyx_v_self->__pyx_base.c_op.data.recv_status_on_client.trailing_metadata = (&__pyx_v_self->_c_trailing_metadata);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":201
+ *     self.c_op.data.receive_status_on_client.trailing_metadata = (
+ *         &self._c_trailing_metadata)
+ *     self.c_op.data.receive_status_on_client.status = (             # <<<<<<<<<<<<<<
+ *         &self._c_code)
+ *     self.c_op.data.receive_status_on_client.status_details = (
+ */
+  __pyx_v_self->__pyx_base.c_op.data.recv_status_on_client.status = (&__pyx_v_self->_c_code);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":203
+ *     self.c_op.data.receive_status_on_client.status = (
+ *         &self._c_code)
+ *     self.c_op.data.receive_status_on_client.status_details = (             # <<<<<<<<<<<<<<
+ *         &self._c_details)
+ *     self.c_op.data.receive_status_on_client.error_string = (
+ */
+  __pyx_v_self->__pyx_base.c_op.data.recv_status_on_client.status_details = (&__pyx_v_self->_c_details);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":205
+ *     self.c_op.data.receive_status_on_client.status_details = (
+ *         &self._c_details)
+ *     self.c_op.data.receive_status_on_client.error_string = (             # <<<<<<<<<<<<<<
+ *         &self._c_error_string)
+ * 
+ */
+  __pyx_v_self->__pyx_base.c_op.data.recv_status_on_client.error_string = (&__pyx_v_self->_c_error_string);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":195
+ *     return GRPC_OP_RECV_STATUS_ON_CLIENT
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_RECV_STATUS_ON_CLIENT
+ *     self.c_op.flags = self._flags
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":208
+ *         &self._c_error_string)
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     self._trailing_metadata = _metadata(&self._c_trailing_metadata)
+ *     grpc_metadata_array_destroy(&self._c_trailing_metadata)
+ */
+
+static void __pyx_f_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("un_c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":209
+ * 
+ *   cdef void un_c(self) except *:
+ *     self._trailing_metadata = _metadata(&self._c_trailing_metadata)             # <<<<<<<<<<<<<<
+ *     grpc_metadata_array_destroy(&self._c_trailing_metadata)
+ *     self._code = self._c_code
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__metadata((&__pyx_v_self->_c_trailing_metadata)); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 209, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_trailing_metadata);
+  __Pyx_DECREF(__pyx_v_self->_trailing_metadata);
+  __pyx_v_self->_trailing_metadata = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":210
+ *   cdef void un_c(self) except *:
+ *     self._trailing_metadata = _metadata(&self._c_trailing_metadata)
+ *     grpc_metadata_array_destroy(&self._c_trailing_metadata)             # <<<<<<<<<<<<<<
+ *     self._code = self._c_code
+ *     self._details = _decode(_slice_bytes(self._c_details))
+ */
+  grpc_metadata_array_destroy((&__pyx_v_self->_c_trailing_metadata));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":211
+ *     self._trailing_metadata = _metadata(&self._c_trailing_metadata)
+ *     grpc_metadata_array_destroy(&self._c_trailing_metadata)
+ *     self._code = self._c_code             # <<<<<<<<<<<<<<
+ *     self._details = _decode(_slice_bytes(self._c_details))
+ *     grpc_slice_unref(self._c_details)
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_status_code(__pyx_v_self->_c_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 211, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_code);
+  __Pyx_DECREF(__pyx_v_self->_code);
+  __pyx_v_self->_code = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":212
+ *     grpc_metadata_array_destroy(&self._c_trailing_metadata)
+ *     self._code = self._c_code
+ *     self._details = _decode(_slice_bytes(self._c_details))             # <<<<<<<<<<<<<<
+ *     grpc_slice_unref(self._c_details)
+ *     if self._c_error_string != NULL:
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__slice_bytes(__pyx_v_self->_c_details); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 212, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 212, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->_details);
+  __Pyx_DECREF(__pyx_v_self->_details);
+  __pyx_v_self->_details = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":213
+ *     self._code = self._c_code
+ *     self._details = _decode(_slice_bytes(self._c_details))
+ *     grpc_slice_unref(self._c_details)             # <<<<<<<<<<<<<<
+ *     if self._c_error_string != NULL:
+ *       self._error_string = _decode(self._c_error_string)
+ */
+  grpc_slice_unref(__pyx_v_self->_c_details);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":214
+ *     self._details = _decode(_slice_bytes(self._c_details))
+ *     grpc_slice_unref(self._c_details)
+ *     if self._c_error_string != NULL:             # <<<<<<<<<<<<<<
+ *       self._error_string = _decode(self._c_error_string)
+ *       gpr_free(<void*>self._c_error_string)
+ */
+  __pyx_t_3 = (__pyx_v_self->_c_error_string != NULL);
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":215
+ *     grpc_slice_unref(self._c_details)
+ *     if self._c_error_string != NULL:
+ *       self._error_string = _decode(self._c_error_string)             # <<<<<<<<<<<<<<
+ *       gpr_free(<void*>self._c_error_string)
+ *     else:
+ */
+    __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_self->_c_error_string); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 215, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 215, __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_self->_error_string);
+    __Pyx_DECREF(__pyx_v_self->_error_string);
+    __pyx_v_self->_error_string = ((PyObject*)__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":216
+ *     if self._c_error_string != NULL:
+ *       self._error_string = _decode(self._c_error_string)
+ *       gpr_free(<void*>self._c_error_string)             # <<<<<<<<<<<<<<
+ *     else:
+ *       self._error_string = ""
+ */
+    gpr_free(((void *)__pyx_v_self->_c_error_string));
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":214
+ *     self._details = _decode(_slice_bytes(self._c_details))
+ *     grpc_slice_unref(self._c_details)
+ *     if self._c_error_string != NULL:             # <<<<<<<<<<<<<<
+ *       self._error_string = _decode(self._c_error_string)
+ *       gpr_free(<void*>self._c_error_string)
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":218
+ *       gpr_free(<void*>self._c_error_string)
+ *     else:
+ *       self._error_string = ""             # <<<<<<<<<<<<<<
+ * 
+ *   def trailing_metadata(self):
+ */
+  /*else*/ {
+    __Pyx_INCREF(__pyx_kp_s__7);
+    __Pyx_GIVEREF(__pyx_kp_s__7);
+    __Pyx_GOTREF(__pyx_v_self->_error_string);
+    __Pyx_DECREF(__pyx_v_self->_error_string);
+    __pyx_v_self->_error_string = __pyx_kp_s__7;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":208
+ *         &self._c_error_string)
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     self._trailing_metadata = _metadata(&self._c_trailing_metadata)
+ *     grpc_metadata_array_destroy(&self._c_trailing_metadata)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveStatusOnClientOperation.un_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":220
+ *       self._error_string = ""
+ * 
+ *   def trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *     return self._trailing_metadata
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_5trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_5trailing_metadata = {"trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_5trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_5trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("trailing_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("trailing_metadata", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "trailing_metadata", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_4trailing_metadata(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_4trailing_metadata(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("trailing_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":221
+ * 
+ *   def trailing_metadata(self):
+ *     return self._trailing_metadata             # <<<<<<<<<<<<<<
+ * 
+ *   def code(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_trailing_metadata);
+  __pyx_r = __pyx_v_self->_trailing_metadata;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":220
+ *       self._error_string = ""
+ * 
+ *   def trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *     return self._trailing_metadata
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":223
+ *     return self._trailing_metadata
+ * 
+ *   def code(self):             # <<<<<<<<<<<<<<
+ *     return self._code
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_7code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_7code = {"code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_7code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_7code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("code (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("code", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "code", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6code(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6code(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("code", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":224
+ * 
+ *   def code(self):
+ *     return self._code             # <<<<<<<<<<<<<<
+ * 
+ *   def details(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_code);
+  __pyx_r = __pyx_v_self->_code;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":223
+ *     return self._trailing_metadata
+ * 
+ *   def code(self):             # <<<<<<<<<<<<<<
+ *     return self._code
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":226
+ *     return self._code
+ * 
+ *   def details(self):             # <<<<<<<<<<<<<<
+ *     return self._details
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_9details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_9details = {"details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_9details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_9details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("details (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("details", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "details", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_8details(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_8details(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("details", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":227
+ * 
+ *   def details(self):
+ *     return self._details             # <<<<<<<<<<<<<<
+ * 
+ *   def error_string(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_details);
+  __pyx_r = __pyx_v_self->_details;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":226
+ *     return self._code
+ * 
+ *   def details(self):             # <<<<<<<<<<<<<<
+ *     return self._details
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":229
+ *     return self._details
+ * 
+ *   def error_string(self):             # <<<<<<<<<<<<<<
+ *     return self._error_string
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_11error_string(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_11error_string = {"error_string", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_11error_string, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_11error_string(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("error_string (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("error_string", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "error_string", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_10error_string(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_10error_string(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("error_string", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":230
+ * 
+ *   def error_string(self):
+ *     return self._error_string             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_error_string);
+  __pyx_r = __pyx_v_self->_error_string;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":229
+ *     return self._details
+ * 
+ *   def error_string(self):             # <<<<<<<<<<<<<<
+ *     return self._error_string
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":90
+ * cdef class ReceiveStatusOnClientOperation(Operation):
+ * 
+ *   cdef readonly int _flags             # <<<<<<<<<<<<<<
+ *   cdef grpc_metadata_array _c_trailing_metadata
+ *   cdef grpc_status_code _c_code
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6_flags_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6_flags___get__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(20, 90, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveStatusOnClientOperation._flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_13__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_13__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_13__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_13__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_12__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_12__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveStatusOnClientOperation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_15__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_15__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_15__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_15__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveStatusOnClientOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_14__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_14__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveStatusOnClientOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":235
+ * cdef class ReceiveCloseOnServerOperation(Operation):
+ * 
+ *   def __cinit__(self, flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_flags = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_flags,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(19, 235, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(19, 235, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_flags = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(19, 235, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveCloseOnServerOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation___cinit__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)__pyx_v_self), __pyx_v_flags);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation___cinit__(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self, PyObject *__pyx_v_flags) {
+  int __pyx_r;
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":236
+ * 
+ *   def __cinit__(self, flags):
+ *     self._flags = flags             # <<<<<<<<<<<<<<
+ * 
+ *   def type(self):
+ */
+  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_flags); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(19, 236, __pyx_L1_error)
+  __pyx_v_self->_flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":235
+ * cdef class ReceiveCloseOnServerOperation(Operation):
+ * 
+ *   def __cinit__(self, flags):             # <<<<<<<<<<<<<<
+ *     self._flags = flags
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveCloseOnServerOperation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":238
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_CLOSE_ON_SERVER
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_3type = {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_3type(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("type (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("type", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "type", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_2type(((struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_2type(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__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("type", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":239
+ * 
+ *   def type(self):
+ *     return GRPC_OP_RECV_CLOSE_ON_SERVER             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void c(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_RECV_CLOSE_ON_SERVER); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 239, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":238
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_CLOSE_ON_SERVER
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveCloseOnServerOperation.type", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":241
+ *     return GRPC_OP_RECV_CLOSE_ON_SERVER
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_RECV_CLOSE_ON_SERVER
+ *     self.c_op.flags = self._flags
+ */
+
+static void __pyx_f_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":242
+ * 
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_RECV_CLOSE_ON_SERVER             # <<<<<<<<<<<<<<
+ *     self.c_op.flags = self._flags
+ *     self.c_op.data.receive_close_on_server.cancelled = &self._c_cancelled
+ */
+  __pyx_v_self->__pyx_base.c_op.op = GRPC_OP_RECV_CLOSE_ON_SERVER;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":243
+ *   cdef void c(self) except *:
+ *     self.c_op.type = GRPC_OP_RECV_CLOSE_ON_SERVER
+ *     self.c_op.flags = self._flags             # <<<<<<<<<<<<<<
+ *     self.c_op.data.receive_close_on_server.cancelled = &self._c_cancelled
+ * 
+ */
+  __pyx_t_1 = __pyx_v_self->_flags;
+  __pyx_v_self->__pyx_base.c_op.flags = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":244
+ *     self.c_op.type = GRPC_OP_RECV_CLOSE_ON_SERVER
+ *     self.c_op.flags = self._flags
+ *     self.c_op.data.receive_close_on_server.cancelled = &self._c_cancelled             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void un_c(self) except *:
+ */
+  __pyx_v_self->__pyx_base.c_op.data.recv_close_on_server.cancelled = (&__pyx_v_self->_c_cancelled);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":241
+ *     return GRPC_OP_RECV_CLOSE_ON_SERVER
+ * 
+ *   cdef void c(self) except *:             # <<<<<<<<<<<<<<
+ *     self.c_op.type = GRPC_OP_RECV_CLOSE_ON_SERVER
+ *     self.c_op.flags = self._flags
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":246
+ *     self.c_op.data.receive_close_on_server.cancelled = &self._c_cancelled
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     self._cancelled = bool(self._c_cancelled)
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_un_c(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self) {
+  __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("un_c", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":247
+ * 
+ *   cdef void un_c(self) except *:
+ *     self._cancelled = bool(self._c_cancelled)             # <<<<<<<<<<<<<<
+ * 
+ *   def cancelled(self):
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_c_cancelled); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 247, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(19, 247, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyBool_FromLong((!(!__pyx_t_2))); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 247, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_cancelled);
+  __Pyx_DECREF(__pyx_v_self->_cancelled);
+  __pyx_v_self->_cancelled = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":246
+ *     self.c_op.data.receive_close_on_server.cancelled = &self._c_cancelled
+ * 
+ *   cdef void un_c(self) except *:             # <<<<<<<<<<<<<<
+ *     self._cancelled = bool(self._c_cancelled)
+ * 
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveCloseOnServerOperation.un_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":249
+ *     self._cancelled = bool(self._c_cancelled)
+ * 
+ *   def cancelled(self):             # <<<<<<<<<<<<<<
+ *     return self._cancelled
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_5cancelled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_5cancelled = {"cancelled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_5cancelled, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_5cancelled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancelled (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("cancelled", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "cancelled", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_4cancelled(((struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_4cancelled(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancelled", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":250
+ * 
+ *   def cancelled(self):
+ *     return self._cancelled             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_cancelled);
+  __pyx_r = __pyx_v_self->_cancelled;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":249
+ *     self._cancelled = bool(self._c_cancelled)
+ * 
+ *   def cancelled(self):             # <<<<<<<<<<<<<<
+ *     return self._cancelled
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pxd.pxi":106
+ * cdef class ReceiveCloseOnServerOperation(Operation):
+ * 
+ *   cdef readonly int _flags             # <<<<<<<<<<<<<<
+ *   cdef object _cancelled
+ *   cdef int _c_cancelled
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6_flags_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6_flags___get__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6_flags___get__(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(20, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveCloseOnServerOperation._flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_7__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveCloseOnServerOperation.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_9__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveCloseOnServerOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_8__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.ReceiveCloseOnServerOperation.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":16
+ * 
+ * 
+ * cdef bytes _slice_bytes(grpc_slice slice):             # <<<<<<<<<<<<<<
+ *   cdef void *start = grpc_slice_start_ptr(slice)
+ *   cdef size_t length = grpc_slice_length(slice)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__slice_bytes(grpc_slice __pyx_v_slice) {
+  void *__pyx_v_start;
+  size_t __pyx_v_length;
+  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("_slice_bytes", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":17
+ * 
+ * cdef bytes _slice_bytes(grpc_slice slice):
+ *   cdef void *start = grpc_slice_start_ptr(slice)             # <<<<<<<<<<<<<<
+ *   cdef size_t length = grpc_slice_length(slice)
+ *   return (<const char *>start)[:length]
+ */
+  __pyx_v_start = GRPC_SLICE_START_PTR(__pyx_v_slice);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":18
+ * cdef bytes _slice_bytes(grpc_slice slice):
+ *   cdef void *start = grpc_slice_start_ptr(slice)
+ *   cdef size_t length = grpc_slice_length(slice)             # <<<<<<<<<<<<<<
+ *   return (<const char *>start)[:length]
+ * 
+ */
+  __pyx_v_length = GRPC_SLICE_LENGTH(__pyx_v_slice);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":19
+ *   cdef void *start = grpc_slice_start_ptr(slice)
+ *   cdef size_t length = grpc_slice_length(slice)
+ *   return (<const char *>start)[:length]             # <<<<<<<<<<<<<<
+ * 
+ * cdef grpc_slice _copy_slice(grpc_slice slice) nogil:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(((char const *)__pyx_v_start) + 0, __pyx_v_length - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(21, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":16
+ * 
+ * 
+ * cdef bytes _slice_bytes(grpc_slice slice):             # <<<<<<<<<<<<<<
+ *   cdef void *start = grpc_slice_start_ptr(slice)
+ *   cdef size_t length = grpc_slice_length(slice)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._slice_bytes", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":21
+ *   return (<const char *>start)[:length]
+ * 
+ * cdef grpc_slice _copy_slice(grpc_slice slice) nogil:             # <<<<<<<<<<<<<<
+ *   cdef void *start = grpc_slice_start_ptr(slice)
+ *   cdef size_t length = grpc_slice_length(slice)
+ */
+
+static grpc_slice __pyx_f_7_cython_6cygrpc__copy_slice(grpc_slice __pyx_v_slice) {
+  void *__pyx_v_start;
+  size_t __pyx_v_length;
+  grpc_slice __pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":22
+ * 
+ * cdef grpc_slice _copy_slice(grpc_slice slice) nogil:
+ *   cdef void *start = grpc_slice_start_ptr(slice)             # <<<<<<<<<<<<<<
+ *   cdef size_t length = grpc_slice_length(slice)
+ *   return grpc_slice_from_copied_buffer(<const char *>start, length)
+ */
+  __pyx_v_start = GRPC_SLICE_START_PTR(__pyx_v_slice);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":23
+ * cdef grpc_slice _copy_slice(grpc_slice slice) nogil:
+ *   cdef void *start = grpc_slice_start_ptr(slice)
+ *   cdef size_t length = grpc_slice_length(slice)             # <<<<<<<<<<<<<<
+ *   return grpc_slice_from_copied_buffer(<const char *>start, length)
+ * 
+ */
+  __pyx_v_length = GRPC_SLICE_LENGTH(__pyx_v_slice);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":24
+ *   cdef void *start = grpc_slice_start_ptr(slice)
+ *   cdef size_t length = grpc_slice_length(slice)
+ *   return grpc_slice_from_copied_buffer(<const char *>start, length)             # <<<<<<<<<<<<<<
+ * 
+ * cdef grpc_slice _slice_from_bytes(bytes value) nogil:
+ */
+  __pyx_r = grpc_slice_from_copied_buffer(((char const *)__pyx_v_start), __pyx_v_length);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":21
+ *   return (<const char *>start)[:length]
+ * 
+ * cdef grpc_slice _copy_slice(grpc_slice slice) nogil:             # <<<<<<<<<<<<<<
+ *   cdef void *start = grpc_slice_start_ptr(slice)
+ *   cdef size_t length = grpc_slice_length(slice)
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":26
+ *   return grpc_slice_from_copied_buffer(<const char *>start, length)
+ * 
+ * cdef grpc_slice _slice_from_bytes(bytes value) nogil:             # <<<<<<<<<<<<<<
+ *   cdef const char *value_ptr
+ *   cdef size_t length
+ */
+
+static grpc_slice __pyx_f_7_cython_6cygrpc__slice_from_bytes(PyObject *__pyx_v_value) {
+  char const *__pyx_v_value_ptr;
+  size_t __pyx_v_length;
+  grpc_slice __pyx_r;
+  char const *__pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save;
+  #endif
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":29
+ *   cdef const char *value_ptr
+ *   cdef size_t length
+ *   with gil:             # <<<<<<<<<<<<<<
+ *     value_ptr = <const char *>value
+ *     length = len(value)
+ */
+  {
+      #ifdef WITH_THREAD
+      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":30
+ *   cdef size_t length
+ *   with gil:
+ *     value_ptr = <const char *>value             # <<<<<<<<<<<<<<
+ *     length = len(value)
+ *   return grpc_slice_from_copied_buffer(value_ptr, length)
+ */
+        if (unlikely(__pyx_v_value == Py_None)) {
+          PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+          __PYX_ERR(21, 30, __pyx_L4_error)
+        }
+        __pyx_t_1 = __Pyx_PyBytes_AsString(__pyx_v_value); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) __PYX_ERR(21, 30, __pyx_L4_error)
+        __pyx_v_value_ptr = ((char const *)__pyx_t_1);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":31
+ *   with gil:
+ *     value_ptr = <const char *>value
+ *     length = len(value)             # <<<<<<<<<<<<<<
+ *   return grpc_slice_from_copied_buffer(value_ptr, length)
+ * 
+ */
+        if (unlikely(__pyx_v_value == Py_None)) {
+          PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+          __PYX_ERR(21, 31, __pyx_L4_error)
+        }
+        __pyx_t_2 = __Pyx_PyBytes_GET_SIZE(__pyx_v_value); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(21, 31, __pyx_L4_error)
+        __pyx_v_length = __pyx_t_2;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":29
+ *   cdef const char *value_ptr
+ *   cdef size_t length
+ *   with gil:             # <<<<<<<<<<<<<<
+ *     value_ptr = <const char *>value
+ *     length = len(value)
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L4_error: {
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L1_error;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":32
+ *     value_ptr = <const char *>value
+ *     length = len(value)
+ *   return grpc_slice_from_copied_buffer(value_ptr, length)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = grpc_slice_from_copied_buffer(__pyx_v_value_ptr, __pyx_v_length);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":26
+ *   return grpc_slice_from_copied_buffer(<const char *>start, length)
+ * 
+ * cdef grpc_slice _slice_from_bytes(bytes value) nogil:             # <<<<<<<<<<<<<<
+ *   cdef const char *value_ptr
+ *   cdef size_t length
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  #ifdef WITH_THREAD
+  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_AddTraceback("_cython.cygrpc._slice_from_bytes", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_pretend_to_initialize(&__pyx_r);
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":132
+ * cdef class CallDetails:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     with nogil:
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_11CallDetails_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_11CallDetails_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_11CallDetails___cinit__(((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_11CallDetails___cinit__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":133
+ * 
+ *   def __cinit__(self):
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_call_details_init(&self.c_details)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 133, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(21, 133, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":134
+ *   def __cinit__(self):
+ *     fork_handlers_and_grpc_init()
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_call_details_init(&self.c_details)
+ * 
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":135
+ *     fork_handlers_and_grpc_init()
+ *     with nogil:
+ *       grpc_call_details_init(&self.c_details)             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+        grpc_call_details_init((&__pyx_v_self->c_details));
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":134
+ *   def __cinit__(self):
+ *     fork_handlers_and_grpc_init()
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_call_details_init(&self.c_details)
+ * 
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":132
+ * cdef class CallDetails:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     with nogil:
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.CallDetails.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":137
+ *       grpc_call_details_init(&self.c_details)
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_call_details_destroy(&self.c_details)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_11CallDetails_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_11CallDetails_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_11CallDetails_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_11CallDetails_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self) {
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":138
+ * 
+ *   def __dealloc__(self):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_call_details_destroy(&self.c_details)
+ *     grpc_shutdown()
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":139
+ *   def __dealloc__(self):
+ *     with nogil:
+ *       grpc_call_details_destroy(&self.c_details)             # <<<<<<<<<<<<<<
+ *     grpc_shutdown()
+ * 
+ */
+        grpc_call_details_destroy((&__pyx_v_self->c_details));
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":138
+ * 
+ *   def __dealloc__(self):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_call_details_destroy(&self.c_details)
+ *     grpc_shutdown()
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":140
+ *     with nogil:
+ *       grpc_call_details_destroy(&self.c_details)
+ *     grpc_shutdown()             # <<<<<<<<<<<<<<
+ * 
+ *   @property
+ */
+  grpc_shutdown();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":137
+ *       grpc_call_details_init(&self.c_details)
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_call_details_destroy(&self.c_details)
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":142
+ *     grpc_shutdown()
+ * 
+ *   @property             # <<<<<<<<<<<<<<
+ *   def method(self):
+ *     return _slice_bytes(self.c_details.method)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_6method_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_6method_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_11CallDetails_6method___get__(((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_6method___get__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__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("__get__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":144
+ *   @property
+ *   def method(self):
+ *     return _slice_bytes(self.c_details.method)             # <<<<<<<<<<<<<<
+ * 
+ *   @property
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__slice_bytes(__pyx_v_self->c_details.method); if (unlikely(!__pyx_t_1)) __PYX_ERR(21, 144, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":142
+ *     grpc_shutdown()
+ * 
+ *   @property             # <<<<<<<<<<<<<<
+ *   def method(self):
+ *     return _slice_bytes(self.c_details.method)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CallDetails.method.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":146
+ *     return _slice_bytes(self.c_details.method)
+ * 
+ *   @property             # <<<<<<<<<<<<<<
+ *   def host(self):
+ *     return _slice_bytes(self.c_details.host)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_4host_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_4host_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_11CallDetails_4host___get__(((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_4host___get__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__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("__get__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":148
+ *   @property
+ *   def host(self):
+ *     return _slice_bytes(self.c_details.host)             # <<<<<<<<<<<<<<
+ * 
+ *   @property
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__slice_bytes(__pyx_v_self->c_details.host); if (unlikely(!__pyx_t_1)) __PYX_ERR(21, 148, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":146
+ *     return _slice_bytes(self.c_details.method)
+ * 
+ *   @property             # <<<<<<<<<<<<<<
+ *   def host(self):
+ *     return _slice_bytes(self.c_details.host)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CallDetails.host.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":150
+ *     return _slice_bytes(self.c_details.host)
+ * 
+ *   @property             # <<<<<<<<<<<<<<
+ *   def deadline(self):
+ *     return _time_from_timespec(self.c_details.deadline)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_8deadline_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_8deadline_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_11CallDetails_8deadline___get__(((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_8deadline___get__(struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  double __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__get__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":152
+ *   @property
+ *   def deadline(self):
+ *     return _time_from_timespec(self.c_details.deadline)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__time_from_timespec(__pyx_v_self->c_details.deadline); if (unlikely(__pyx_t_1 == ((double)-1) && PyErr_Occurred())) __PYX_ERR(21, 152, __pyx_L1_error)
+  __pyx_t_2 = PyFloat_FromDouble(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 152, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":150
+ *     return _slice_bytes(self.c_details.host)
+ * 
+ *   @property             # <<<<<<<<<<<<<<
+ *   def deadline(self):
+ *     return _time_from_timespec(self.c_details.deadline)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.CallDetails.deadline.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_11CallDetails_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11CallDetails_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_11CallDetails_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallDetails.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_11CallDetails_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11CallDetails_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_11CallDetails_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CallDetails.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_11CallDetails_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_11CallDetails_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallDetails *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallDetails.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":157
+ * cdef class SslPemKeyCertPair:
+ * 
+ *   def __cinit__(self, bytes private_key, bytes certificate_chain):             # <<<<<<<<<<<<<<
+ *     self.private_key = private_key
+ *     self.certificate_chain = certificate_chain
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_private_key = 0;
+  PyObject *__pyx_v_certificate_chain = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_private_key,&__pyx_n_s_certificate_chain,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_private_key)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 157, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_certificate_chain)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 157, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(21, 157, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(21, 157, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_private_key = ((PyObject*)values[0]);
+    __pyx_v_certificate_chain = ((PyObject*)values[1]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(21, 157, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SslPemKeyCertPair.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_private_key), (&PyBytes_Type), 1, "private_key", 1))) __PYX_ERR(21, 157, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_certificate_chain), (&PyBytes_Type), 1, "certificate_chain", 1))) __PYX_ERR(21, 157, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair___cinit__(((struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)__pyx_v_self), __pyx_v_private_key, __pyx_v_certificate_chain);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair___cinit__(struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self, PyObject *__pyx_v_private_key, PyObject *__pyx_v_certificate_chain) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  char const *__pyx_t_1;
+  char const *__pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":158
+ * 
+ *   def __cinit__(self, bytes private_key, bytes certificate_chain):
+ *     self.private_key = private_key             # <<<<<<<<<<<<<<
+ *     self.certificate_chain = certificate_chain
+ *     self.c_pair.private_key = self.private_key
+ */
+  __Pyx_INCREF(__pyx_v_private_key);
+  __Pyx_GIVEREF(__pyx_v_private_key);
+  __Pyx_GOTREF(__pyx_v_self->private_key);
+  __Pyx_DECREF(__pyx_v_self->private_key);
+  __pyx_v_self->private_key = __pyx_v_private_key;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":159
+ *   def __cinit__(self, bytes private_key, bytes certificate_chain):
+ *     self.private_key = private_key
+ *     self.certificate_chain = certificate_chain             # <<<<<<<<<<<<<<
+ *     self.c_pair.private_key = self.private_key
+ *     self.c_pair.certificate_chain = self.certificate_chain
+ */
+  __Pyx_INCREF(__pyx_v_certificate_chain);
+  __Pyx_GIVEREF(__pyx_v_certificate_chain);
+  __Pyx_GOTREF(__pyx_v_self->certificate_chain);
+  __Pyx_DECREF(__pyx_v_self->certificate_chain);
+  __pyx_v_self->certificate_chain = __pyx_v_certificate_chain;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":160
+ *     self.private_key = private_key
+ *     self.certificate_chain = certificate_chain
+ *     self.c_pair.private_key = self.private_key             # <<<<<<<<<<<<<<
+ *     self.c_pair.certificate_chain = self.certificate_chain
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_self->private_key); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) __PYX_ERR(21, 160, __pyx_L1_error)
+  __pyx_v_self->c_pair.private_key = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":161
+ *     self.certificate_chain = certificate_chain
+ *     self.c_pair.private_key = self.private_key
+ *     self.c_pair.certificate_chain = self.certificate_chain             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_AsString(__pyx_v_self->certificate_chain); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) __PYX_ERR(21, 161, __pyx_L1_error)
+  __pyx_v_self->c_pair.cert_chain = __pyx_t_2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":157
+ * cdef class SslPemKeyCertPair:
+ * 
+ *   def __cinit__(self, bytes private_key, bytes certificate_chain):             # <<<<<<<<<<<<<<
+ *     self.private_key = private_key
+ *     self.certificate_chain = certificate_chain
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SslPemKeyCertPair.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pxd.pxi":29
+ * 
+ *   cdef grpc_ssl_pem_key_cert_pair c_pair
+ *   cdef readonly object private_key, certificate_chain             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_11private_key_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_11private_key_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_11private_key___get__(((struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_11private_key___get__(struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->private_key);
+  __pyx_r = __pyx_v_self->private_key;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_17certificate_chain_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_17certificate_chain_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_17certificate_chain___get__(((struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_17certificate_chain___get__(struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->certificate_chain);
+  __pyx_r = __pyx_v_self->certificate_chain;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17SslPemKeyCertPair_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SslPemKeyCertPair.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17SslPemKeyCertPair_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.SslPemKeyCertPair.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17SslPemKeyCertPair_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.SslPemKeyCertPair.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":166
+ * cdef class CompressionOptions:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_init(&self.c_options)
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_18CompressionOptions_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_18CompressionOptions_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18CompressionOptions___cinit__(((struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_18CompressionOptions___cinit__(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self) {
+  int __pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":167
+ * 
+ *   def __cinit__(self):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_compression_options_init(&self.c_options)
+ * 
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":168
+ *   def __cinit__(self):
+ *     with nogil:
+ *       grpc_compression_options_init(&self.c_options)             # <<<<<<<<<<<<<<
+ * 
+ *   def enable_algorithm(self, grpc_compression_algorithm algorithm):
+ */
+        grpc_compression_options_init((&__pyx_v_self->c_options));
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":167
+ * 
+ *   def __cinit__(self):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_compression_options_init(&self.c_options)
+ * 
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":166
+ * cdef class CompressionOptions:
+ * 
+ *   def __cinit__(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_init(&self.c_options)
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":170
+ *       grpc_compression_options_init(&self.c_options)
+ * 
+ *   def enable_algorithm(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_3enable_algorithm(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18CompressionOptions_3enable_algorithm = {"enable_algorithm", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_3enable_algorithm, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_3enable_algorithm(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_compression_algorithm __pyx_v_algorithm;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("enable_algorithm (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_algorithm,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_algorithm)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 170, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "enable_algorithm") < 0)) __PYX_ERR(21, 170, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_algorithm = ((grpc_compression_algorithm)__Pyx_PyInt_As_grpc_compression_algorithm(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 170, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("enable_algorithm", 1, 1, 1, __pyx_nargs); __PYX_ERR(21, 170, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompressionOptions.enable_algorithm", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18CompressionOptions_2enable_algorithm(((struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)__pyx_v_self), __pyx_v_algorithm);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_2enable_algorithm(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self, grpc_compression_algorithm __pyx_v_algorithm) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("enable_algorithm", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":171
+ * 
+ *   def enable_algorithm(self, grpc_compression_algorithm algorithm):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ * 
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":172
+ *   def enable_algorithm(self, grpc_compression_algorithm algorithm):
+ *     with nogil:
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)             # <<<<<<<<<<<<<<
+ * 
+ *   def disable_algorithm(self, grpc_compression_algorithm algorithm):
+ */
+        grpc_compression_options_enable_algorithm((&__pyx_v_self->c_options), __pyx_v_algorithm);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":171
+ * 
+ *   def enable_algorithm(self, grpc_compression_algorithm algorithm):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ * 
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":170
+ *       grpc_compression_options_init(&self.c_options)
+ * 
+ *   def enable_algorithm(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":174
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ * 
+ *   def disable_algorithm(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_5disable_algorithm(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18CompressionOptions_5disable_algorithm = {"disable_algorithm", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_5disable_algorithm, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_5disable_algorithm(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_compression_algorithm __pyx_v_algorithm;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("disable_algorithm (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_algorithm,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_algorithm)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 174, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "disable_algorithm") < 0)) __PYX_ERR(21, 174, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_algorithm = ((grpc_compression_algorithm)__Pyx_PyInt_As_grpc_compression_algorithm(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 174, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("disable_algorithm", 1, 1, 1, __pyx_nargs); __PYX_ERR(21, 174, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompressionOptions.disable_algorithm", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18CompressionOptions_4disable_algorithm(((struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)__pyx_v_self), __pyx_v_algorithm);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_4disable_algorithm(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self, grpc_compression_algorithm __pyx_v_algorithm) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("disable_algorithm", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":175
+ * 
+ *   def disable_algorithm(self, grpc_compression_algorithm algorithm):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ * 
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":176
+ *   def disable_algorithm(self, grpc_compression_algorithm algorithm):
+ *     with nogil:
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)             # <<<<<<<<<<<<<<
+ * 
+ *   def is_algorithm_enabled(self, grpc_compression_algorithm algorithm):
+ */
+        grpc_compression_options_disable_algorithm((&__pyx_v_self->c_options), __pyx_v_algorithm);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":175
+ * 
+ *   def disable_algorithm(self, grpc_compression_algorithm algorithm):
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ * 
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":174
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ * 
+ *   def disable_algorithm(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":178
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ * 
+ *   def is_algorithm_enabled(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     cdef int result
+ *     with nogil:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_7is_algorithm_enabled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18CompressionOptions_7is_algorithm_enabled = {"is_algorithm_enabled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_7is_algorithm_enabled, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_7is_algorithm_enabled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_compression_algorithm __pyx_v_algorithm;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_algorithm_enabled (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_algorithm,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_algorithm)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 178, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "is_algorithm_enabled") < 0)) __PYX_ERR(21, 178, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_algorithm = ((grpc_compression_algorithm)__Pyx_PyInt_As_grpc_compression_algorithm(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 178, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("is_algorithm_enabled", 1, 1, 1, __pyx_nargs); __PYX_ERR(21, 178, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompressionOptions.is_algorithm_enabled", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18CompressionOptions_6is_algorithm_enabled(((struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)__pyx_v_self), __pyx_v_algorithm);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_6is_algorithm_enabled(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self, grpc_compression_algorithm __pyx_v_algorithm) {
+  int __pyx_v_result;
+  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("is_algorithm_enabled", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":180
+ *   def is_algorithm_enabled(self, grpc_compression_algorithm algorithm):
+ *     cdef int result
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       result = grpc_compression_options_is_algorithm_enabled(
+ *           &self.c_options, algorithm)
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":181
+ *     cdef int result
+ *     with nogil:
+ *       result = grpc_compression_options_is_algorithm_enabled(             # <<<<<<<<<<<<<<
+ *           &self.c_options, algorithm)
+ *     return result
+ */
+        __pyx_v_result = grpc_compression_options_is_algorithm_enabled((&__pyx_v_self->c_options), __pyx_v_algorithm);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":180
+ *   def is_algorithm_enabled(self, grpc_compression_algorithm algorithm):
+ *     cdef int result
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       result = grpc_compression_options_is_algorithm_enabled(
+ *           &self.c_options, algorithm)
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":183
+ *       result = grpc_compression_options_is_algorithm_enabled(
+ *           &self.c_options, algorithm)
+ *     return result             # <<<<<<<<<<<<<<
+ * 
+ *   def to_channel_arg(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_result); if (unlikely(!__pyx_t_1)) __PYX_ERR(21, 183, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":178
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ * 
+ *   def is_algorithm_enabled(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     cdef int result
+ *     with nogil:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CompressionOptions.is_algorithm_enabled", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":185
+ *     return result
+ * 
+ *   def to_channel_arg(self):             # <<<<<<<<<<<<<<
+ *     return (
+ *         GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_9to_channel_arg(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18CompressionOptions_9to_channel_arg = {"to_channel_arg", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_9to_channel_arg, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_9to_channel_arg(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("to_channel_arg (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("to_channel_arg", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "to_channel_arg", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18CompressionOptions_8to_channel_arg(((struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_8to_channel_arg(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self) {
+  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("to_channel_arg", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":186
+ * 
+ *   def to_channel_arg(self):
+ *     return (             # <<<<<<<<<<<<<<
+ *         GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
+ *         self.c_options.enabled_algorithms_bitset,
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":187
+ *   def to_channel_arg(self):
+ *     return (
+ *         GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,             # <<<<<<<<<<<<<<
+ *         self.c_options.enabled_algorithms_bitset,
+ *     )
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET); if (unlikely(!__pyx_t_1)) __PYX_ERR(21, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":188
+ *     return (
+ *         GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
+ *         self.c_options.enabled_algorithms_bitset,             # <<<<<<<<<<<<<<
+ *     )
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__pyx_v_self->c_options.enabled_algorithms_bitset); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 188, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":187
+ *   def to_channel_arg(self):
+ *     return (
+ *         GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,             # <<<<<<<<<<<<<<
+ *         self.c_options.enabled_algorithms_bitset,
+ *     )
+ */
+  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(21, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(21, 187, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(21, 187, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":185
+ *     return result
+ * 
+ *   def to_channel_arg(self):             # <<<<<<<<<<<<<<
+ *     return (
+ *         GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.CompressionOptions.to_channel_arg", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_11__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18CompressionOptions_11__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_11__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_11__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18CompressionOptions_10__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CompressionOptions.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_13__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18CompressionOptions_13__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_13__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18CompressionOptions_13__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CompressionOptions.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18CompressionOptions_12__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18CompressionOptions_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CompressionOptions.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":192
+ * 
+ * 
+ * def compression_algorithm_name(grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *   cdef const char* name
+ *   with nogil:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_45compression_algorithm_name(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_45compression_algorithm_name = {"compression_algorithm_name", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_45compression_algorithm_name, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_45compression_algorithm_name(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_compression_algorithm __pyx_v_algorithm;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("compression_algorithm_name (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_algorithm,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_algorithm)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 192, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "compression_algorithm_name") < 0)) __PYX_ERR(21, 192, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_algorithm = ((grpc_compression_algorithm)__Pyx_PyInt_As_grpc_compression_algorithm(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(21, 192, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("compression_algorithm_name", 1, 1, 1, __pyx_nargs); __PYX_ERR(21, 192, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.compression_algorithm_name", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_44compression_algorithm_name(__pyx_self, __pyx_v_algorithm);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_44compression_algorithm_name(CYTHON_UNUSED PyObject *__pyx_self, grpc_compression_algorithm __pyx_v_algorithm) {
+  char const *__pyx_v_name;
+  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("compression_algorithm_name", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":194
+ * def compression_algorithm_name(grpc_compression_algorithm algorithm):
+ *   cdef const char* name
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     grpc_compression_algorithm_name(algorithm, &name)
+ *   # Let Cython do the right thing with string casting
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":195
+ *   cdef const char* name
+ *   with nogil:
+ *     grpc_compression_algorithm_name(algorithm, &name)             # <<<<<<<<<<<<<<
+ *   # Let Cython do the right thing with string casting
+ *   return name
+ */
+        (void)(grpc_compression_algorithm_name(__pyx_v_algorithm, (&__pyx_v_name)));
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":194
+ * def compression_algorithm_name(grpc_compression_algorithm algorithm):
+ *   cdef const char* name
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     grpc_compression_algorithm_name(algorithm, &name)
+ *   # Let Cython do the right thing with string casting
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":197
+ *     grpc_compression_algorithm_name(algorithm, &name)
+ *   # Let Cython do the right thing with string casting
+ *   return name             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(21, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":192
+ * 
+ * 
+ * def compression_algorithm_name(grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *   cdef const char* name
+ *   with nogil:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.compression_algorithm_name", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":200
+ * 
+ * 
+ * def reset_grpc_config_vars():             # <<<<<<<<<<<<<<
+ *   ConfigVars.Reset()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_47reset_grpc_config_vars(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_47reset_grpc_config_vars = {"reset_grpc_config_vars", (PyCFunction)__pyx_pw_7_cython_6cygrpc_47reset_grpc_config_vars, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_47reset_grpc_config_vars(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("reset_grpc_config_vars (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_46reset_grpc_config_vars(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_46reset_grpc_config_vars(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("reset_grpc_config_vars", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":201
+ * 
+ * def reset_grpc_config_vars():
+ *   ConfigVars.Reset()             # <<<<<<<<<<<<<<
+ */
+  grpc_core::ConfigVars::Reset();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":200
+ * 
+ * 
+ * def reset_grpc_config_vars():             # <<<<<<<<<<<<<<
+ *   ConfigVars.Reset()
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":20
+ * 
+ * 
+ * cdef grpc_ssl_roots_override_result ssl_roots_override_callback(             # <<<<<<<<<<<<<<
+ *     char **pem_root_certs) nogil:
+ *   with gil:
+ */
+
+static grpc_ssl_roots_override_result __pyx_f_7_cython_6cygrpc_ssl_roots_override_callback(char **__pyx_v_pem_root_certs) {
+  PyObject *__pyx_v_pkg = NULL;
+  PyObject *__pyx_v_temporary_pem_root_certs = NULL;
+  grpc_ssl_roots_override_result __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  Py_ssize_t __pyx_t_6;
+  char *__pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save;
+  #endif
+  __Pyx_RefNannySetupContext("ssl_roots_override_callback", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":22
+ * cdef grpc_ssl_roots_override_result ssl_roots_override_callback(
+ *     char **pem_root_certs) nogil:
+ *   with gil:             # <<<<<<<<<<<<<<
+ *     pkg = __name__
+ *     if pkg.endswith('.cygrpc'):
+ */
+  {
+      #ifdef WITH_THREAD
+      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":23
+ *     char **pem_root_certs) nogil:
+ *   with gil:
+ *     pkg = __name__             # <<<<<<<<<<<<<<
+ *     if pkg.endswith('.cygrpc'):
+ *       pkg = pkg[:-len('.cygrpc')]
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(22, 23, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_v_pkg = __pyx_t_1;
+        __pyx_t_1 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":24
+ *   with gil:
+ *     pkg = __name__
+ *     if pkg.endswith('.cygrpc'):             # <<<<<<<<<<<<<<
+ *       pkg = pkg[:-len('.cygrpc')]
+ *     temporary_pem_root_certs = pkgutil.get_data(pkg, '_credentials/roots.pem')
+ */
+        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_pkg, __pyx_n_s_endswith); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 24, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_3 = NULL;
+        __pyx_t_4 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (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);
+            __pyx_t_4 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_kp_s_cygrpc};
+          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          if (unlikely(!__pyx_t_1)) __PYX_ERR(22, 24, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        }
+        __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(22, 24, __pyx_L4_error)
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        if (__pyx_t_5) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":25
+ *     pkg = __name__
+ *     if pkg.endswith('.cygrpc'):
+ *       pkg = pkg[:-len('.cygrpc')]             # <<<<<<<<<<<<<<
+ *     temporary_pem_root_certs = pkgutil.get_data(pkg, '_credentials/roots.pem')
+ *     pem_root_certs[0] = <char *>gpr_malloc(len(temporary_pem_root_certs) + 1)
+ */
+          __pyx_t_6 = PyObject_Length(__pyx_kp_s_cygrpc); if (unlikely(__pyx_t_6 == ((Py_ssize_t)-1))) __PYX_ERR(22, 25, __pyx_L4_error)
+          __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_v_pkg, 0, (-__pyx_t_6), NULL, NULL, NULL, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(22, 25, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF_SET(__pyx_v_pkg, __pyx_t_1);
+          __pyx_t_1 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":24
+ *   with gil:
+ *     pkg = __name__
+ *     if pkg.endswith('.cygrpc'):             # <<<<<<<<<<<<<<
+ *       pkg = pkg[:-len('.cygrpc')]
+ *     temporary_pem_root_certs = pkgutil.get_data(pkg, '_credentials/roots.pem')
+ */
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":26
+ *     if pkg.endswith('.cygrpc'):
+ *       pkg = pkg[:-len('.cygrpc')]
+ *     temporary_pem_root_certs = pkgutil.get_data(pkg, '_credentials/roots.pem')             # <<<<<<<<<<<<<<
+ *     pem_root_certs[0] = <char *>gpr_malloc(len(temporary_pem_root_certs) + 1)
+ *     memcpy(
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_pkgutil); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 26, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get_data); if (unlikely(!__pyx_t_3)) __PYX_ERR(22, 26, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __pyx_t_2 = NULL;
+        __pyx_t_4 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_3))) {
+          __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+          if (likely(__pyx_t_2)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+            __Pyx_INCREF(__pyx_t_2);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_3, function);
+            __pyx_t_4 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_pkg, __pyx_kp_s_credentials_roots_pem};
+          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          if (unlikely(!__pyx_t_1)) __PYX_ERR(22, 26, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        }
+        __pyx_v_temporary_pem_root_certs = __pyx_t_1;
+        __pyx_t_1 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":27
+ *       pkg = pkg[:-len('.cygrpc')]
+ *     temporary_pem_root_certs = pkgutil.get_data(pkg, '_credentials/roots.pem')
+ *     pem_root_certs[0] = <char *>gpr_malloc(len(temporary_pem_root_certs) + 1)             # <<<<<<<<<<<<<<
+ *     memcpy(
+ *         pem_root_certs[0], <char *>temporary_pem_root_certs,
+ */
+        __pyx_t_6 = PyObject_Length(__pyx_v_temporary_pem_root_certs); if (unlikely(__pyx_t_6 == ((Py_ssize_t)-1))) __PYX_ERR(22, 27, __pyx_L4_error)
+        (__pyx_v_pem_root_certs[0]) = ((char *)gpr_malloc((__pyx_t_6 + 1)));
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":29
+ *     pem_root_certs[0] = <char *>gpr_malloc(len(temporary_pem_root_certs) + 1)
+ *     memcpy(
+ *         pem_root_certs[0], <char *>temporary_pem_root_certs,             # <<<<<<<<<<<<<<
+ *         len(temporary_pem_root_certs))
+ *     pem_root_certs[0][len(temporary_pem_root_certs)] = '\0'
+ */
+        __pyx_t_7 = __Pyx_PyObject_AsWritableString(__pyx_v_temporary_pem_root_certs); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(22, 29, __pyx_L4_error)
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":30
+ *     memcpy(
+ *         pem_root_certs[0], <char *>temporary_pem_root_certs,
+ *         len(temporary_pem_root_certs))             # <<<<<<<<<<<<<<
+ *     pem_root_certs[0][len(temporary_pem_root_certs)] = '\0'
+ * 
+ */
+        __pyx_t_6 = PyObject_Length(__pyx_v_temporary_pem_root_certs); if (unlikely(__pyx_t_6 == ((Py_ssize_t)-1))) __PYX_ERR(22, 30, __pyx_L4_error)
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":28
+ *     temporary_pem_root_certs = pkgutil.get_data(pkg, '_credentials/roots.pem')
+ *     pem_root_certs[0] = <char *>gpr_malloc(len(temporary_pem_root_certs) + 1)
+ *     memcpy(             # <<<<<<<<<<<<<<
+ *         pem_root_certs[0], <char *>temporary_pem_root_certs,
+ *         len(temporary_pem_root_certs))
+ */
+        (void)(memcpy((__pyx_v_pem_root_certs[0]), ((char *)__pyx_t_7), __pyx_t_6));
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":31
+ *         pem_root_certs[0], <char *>temporary_pem_root_certs,
+ *         len(temporary_pem_root_certs))
+ *     pem_root_certs[0][len(temporary_pem_root_certs)] = '\0'             # <<<<<<<<<<<<<<
+ * 
+ *   return GRPC_SSL_ROOTS_OVERRIDE_OK
+ */
+        __pyx_t_6 = PyObject_Length(__pyx_v_temporary_pem_root_certs); if (unlikely(__pyx_t_6 == ((Py_ssize_t)-1))) __PYX_ERR(22, 31, __pyx_L4_error)
+        ((__pyx_v_pem_root_certs[0])[__pyx_t_6]) = '\x00';
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":22
+ * cdef grpc_ssl_roots_override_result ssl_roots_override_callback(
+ *     char **pem_root_certs) nogil:
+ *   with gil:             # <<<<<<<<<<<<<<
+ *     pkg = __name__
+ *     if pkg.endswith('.cygrpc'):
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L4_error: {
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L1_error;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":33
+ *     pem_root_certs[0][len(temporary_pem_root_certs)] = '\0'
+ * 
+ *   return GRPC_SSL_ROOTS_OVERRIDE_OK             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = GRPC_SSL_ROOTS_OVERRIDE_OK;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":20
+ * 
+ * 
+ * cdef grpc_ssl_roots_override_result ssl_roots_override_callback(             # <<<<<<<<<<<<<<
+ *     char **pem_root_certs) nogil:
+ *   with gil:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  #ifdef WITH_THREAD
+  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.ssl_roots_override_callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = (grpc_ssl_roots_override_result) 0;
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  __pyx_L0:;
+  #ifdef WITH_THREAD
+  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_XDECREF(__pyx_v_pkg);
+  __Pyx_XDECREF(__pyx_v_temporary_pem_root_certs);
+  __Pyx_RefNannyFinishContext();
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":36
+ * 
+ * 
+ * def peer_identities(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef grpc_auth_property_iterator properties
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_49peer_identities(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_49peer_identities = {"peer_identities", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_49peer_identities, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_49peer_identities(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer_identities (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(22, 36, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "peer_identities") < 0)) __PYX_ERR(22, 36, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("peer_identities", 1, 1, 1, __pyx_nargs); __PYX_ERR(22, 36, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.peer_identities", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call), __pyx_ptype_7_cython_6cygrpc_Call, 1, "call", 0))) __PYX_ERR(22, 36, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_48peer_identities(__pyx_self, __pyx_v_call);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_48peer_identities(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call) {
+  grpc_auth_context *__pyx_v_auth_context;
+  grpc_auth_property_iterator __pyx_v_properties;
+  grpc_auth_property const *__pyx_v_property;
+  PyObject *__pyx_v_identities = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("peer_identities", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":41
+ *   cdef const grpc_auth_property* property
+ * 
+ *   auth_context = grpc_call_auth_context(call.c_call)             # <<<<<<<<<<<<<<
+ *   if auth_context == NULL:
+ *     return None
+ */
+  __pyx_v_auth_context = grpc_call_auth_context(__pyx_v_call->c_call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":42
+ * 
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:             # <<<<<<<<<<<<<<
+ *     return None
+ *   properties = grpc_auth_context_peer_identity(auth_context)
+ */
+  __pyx_t_1 = (__pyx_v_auth_context == NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":43
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:
+ *     return None             # <<<<<<<<<<<<<<
+ *   properties = grpc_auth_context_peer_identity(auth_context)
+ *   identities = []
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":42
+ * 
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:             # <<<<<<<<<<<<<<
+ *     return None
+ *   properties = grpc_auth_context_peer_identity(auth_context)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":44
+ *   if auth_context == NULL:
+ *     return None
+ *   properties = grpc_auth_context_peer_identity(auth_context)             # <<<<<<<<<<<<<<
+ *   identities = []
+ *   while True:
+ */
+  __pyx_v_properties = grpc_auth_context_peer_identity(__pyx_v_auth_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":45
+ *     return None
+ *   properties = grpc_auth_context_peer_identity(auth_context)
+ *   identities = []             # <<<<<<<<<<<<<<
+ *   while True:
+ *     property = grpc_auth_property_iterator_next(&properties)
+ */
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 45, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_v_identities = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":46
+ *   properties = grpc_auth_context_peer_identity(auth_context)
+ *   identities = []
+ *   while True:             # <<<<<<<<<<<<<<
+ *     property = grpc_auth_property_iterator_next(&properties)
+ *     if property == NULL:
+ */
+  while (1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":47
+ *   identities = []
+ *   while True:
+ *     property = grpc_auth_property_iterator_next(&properties)             # <<<<<<<<<<<<<<
+ *     if property == NULL:
+ *       break
+ */
+    __pyx_v_property = grpc_auth_property_iterator_next((&__pyx_v_properties));
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":48
+ *   while True:
+ *     property = grpc_auth_property_iterator_next(&properties)
+ *     if property == NULL:             # <<<<<<<<<<<<<<
+ *       break
+ *     if property.value != NULL:
+ */
+    __pyx_t_1 = (__pyx_v_property == NULL);
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":49
+ *     property = grpc_auth_property_iterator_next(&properties)
+ *     if property == NULL:
+ *       break             # <<<<<<<<<<<<<<
+ *     if property.value != NULL:
+ *       identities.append(<bytes>(property.value))
+ */
+      goto __pyx_L5_break;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":48
+ *   while True:
+ *     property = grpc_auth_property_iterator_next(&properties)
+ *     if property == NULL:             # <<<<<<<<<<<<<<
+ *       break
+ *     if property.value != NULL:
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":50
+ *     if property == NULL:
+ *       break
+ *     if property.value != NULL:             # <<<<<<<<<<<<<<
+ *       identities.append(<bytes>(property.value))
+ *   grpc_auth_context_release(auth_context)
+ */
+    __pyx_t_1 = (__pyx_v_property->value != NULL);
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":51
+ *       break
+ *     if property.value != NULL:
+ *       identities.append(<bytes>(property.value))             # <<<<<<<<<<<<<<
+ *   grpc_auth_context_release(auth_context)
+ *   return identities if identities else None
+ */
+      __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_property->value); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 51, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = __Pyx_PyList_Append(__pyx_v_identities, __pyx_t_2); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(22, 51, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":50
+ *     if property == NULL:
+ *       break
+ *     if property.value != NULL:             # <<<<<<<<<<<<<<
+ *       identities.append(<bytes>(property.value))
+ *   grpc_auth_context_release(auth_context)
+ */
+    }
+  }
+  __pyx_L5_break:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":52
+ *     if property.value != NULL:
+ *       identities.append(<bytes>(property.value))
+ *   grpc_auth_context_release(auth_context)             # <<<<<<<<<<<<<<
+ *   return identities if identities else None
+ * 
+ */
+  grpc_auth_context_release(__pyx_v_auth_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":53
+ *       identities.append(<bytes>(property.value))
+ *   grpc_auth_context_release(auth_context)
+ *   return identities if identities else None             # <<<<<<<<<<<<<<
+ * 
+ * def peer_identity_key(Call call):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = (PyList_GET_SIZE(__pyx_v_identities) != 0);
+  if (__pyx_t_1) {
+    __Pyx_INCREF(__pyx_v_identities);
+    __pyx_t_2 = __pyx_v_identities;
+  } else {
+    __Pyx_INCREF(Py_None);
+    __pyx_t_2 = Py_None;
+  }
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":36
+ * 
+ * 
+ * def peer_identities(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef grpc_auth_property_iterator properties
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.peer_identities", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_identities);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":55
+ *   return identities if identities else None
+ * 
+ * def peer_identity_key(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef const char* c_key
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_51peer_identity_key(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_51peer_identity_key = {"peer_identity_key", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_51peer_identity_key, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_51peer_identity_key(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer_identity_key (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(22, 55, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "peer_identity_key") < 0)) __PYX_ERR(22, 55, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("peer_identity_key", 1, 1, 1, __pyx_nargs); __PYX_ERR(22, 55, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.peer_identity_key", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call), __pyx_ptype_7_cython_6cygrpc_Call, 1, "call", 0))) __PYX_ERR(22, 55, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_50peer_identity_key(__pyx_self, __pyx_v_call);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_50peer_identity_key(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call) {
+  grpc_auth_context *__pyx_v_auth_context;
+  char const *__pyx_v_c_key;
+  PyObject *__pyx_v_key = NULL;
+  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("peer_identity_key", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":58
+ *   cdef grpc_auth_context* auth_context
+ *   cdef const char* c_key
+ *   auth_context = grpc_call_auth_context(call.c_call)             # <<<<<<<<<<<<<<
+ *   if auth_context == NULL:
+ *     return None
+ */
+  __pyx_v_auth_context = grpc_call_auth_context(__pyx_v_call->c_call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":59
+ *   cdef const char* c_key
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:             # <<<<<<<<<<<<<<
+ *     return None
+ *   c_key = grpc_auth_context_peer_identity_property_name(auth_context)
+ */
+  __pyx_t_1 = (__pyx_v_auth_context == NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":60
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:
+ *     return None             # <<<<<<<<<<<<<<
+ *   c_key = grpc_auth_context_peer_identity_property_name(auth_context)
+ *   if c_key == NULL:
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":59
+ *   cdef const char* c_key
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:             # <<<<<<<<<<<<<<
+ *     return None
+ *   c_key = grpc_auth_context_peer_identity_property_name(auth_context)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":61
+ *   if auth_context == NULL:
+ *     return None
+ *   c_key = grpc_auth_context_peer_identity_property_name(auth_context)             # <<<<<<<<<<<<<<
+ *   if c_key == NULL:
+ *     key = None
+ */
+  __pyx_v_c_key = grpc_auth_context_peer_identity_property_name(__pyx_v_auth_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":62
+ *     return None
+ *   c_key = grpc_auth_context_peer_identity_property_name(auth_context)
+ *   if c_key == NULL:             # <<<<<<<<<<<<<<
+ *     key = None
+ *   else:
+ */
+  __pyx_t_1 = (__pyx_v_c_key == NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":63
+ *   c_key = grpc_auth_context_peer_identity_property_name(auth_context)
+ *   if c_key == NULL:
+ *     key = None             # <<<<<<<<<<<<<<
+ *   else:
+ *     key = <bytes> grpc_auth_context_peer_identity_property_name(auth_context)
+ */
+    __Pyx_INCREF(Py_None);
+    __pyx_v_key = ((PyObject*)Py_None);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":62
+ *     return None
+ *   c_key = grpc_auth_context_peer_identity_property_name(auth_context)
+ *   if c_key == NULL:             # <<<<<<<<<<<<<<
+ *     key = None
+ *   else:
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":65
+ *     key = None
+ *   else:
+ *     key = <bytes> grpc_auth_context_peer_identity_property_name(auth_context)             # <<<<<<<<<<<<<<
+ *   grpc_auth_context_release(auth_context)
+ *   return key
+ */
+  /*else*/ {
+    __pyx_t_2 = __Pyx_PyBytes_FromString(grpc_auth_context_peer_identity_property_name(__pyx_v_auth_context)); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 65, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __pyx_t_2;
+    __Pyx_INCREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_v_key = ((PyObject*)__pyx_t_3);
+    __pyx_t_3 = 0;
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":66
+ *   else:
+ *     key = <bytes> grpc_auth_context_peer_identity_property_name(auth_context)
+ *   grpc_auth_context_release(auth_context)             # <<<<<<<<<<<<<<
+ *   return key
+ * 
+ */
+  grpc_auth_context_release(__pyx_v_auth_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":67
+ *     key = <bytes> grpc_auth_context_peer_identity_property_name(auth_context)
+ *   grpc_auth_context_release(auth_context)
+ *   return key             # <<<<<<<<<<<<<<
+ * 
+ * def auth_context(Call call):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_key);
+  __pyx_r = __pyx_v_key;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":55
+ *   return identities if identities else None
+ * 
+ * def peer_identity_key(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef const char* c_key
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.peer_identity_key", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_key);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":69
+ *   return key
+ * 
+ * def auth_context(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef grpc_auth_property_iterator properties
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_53auth_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_53auth_context = {"auth_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_53auth_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_53auth_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("auth_context (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(22, 69, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "auth_context") < 0)) __PYX_ERR(22, 69, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("auth_context", 1, 1, 1, __pyx_nargs); __PYX_ERR(22, 69, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.auth_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call), __pyx_ptype_7_cython_6cygrpc_Call, 1, "call", 0))) __PYX_ERR(22, 69, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_52auth_context(__pyx_self, __pyx_v_call);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_52auth_context(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_call) {
+  grpc_auth_context *__pyx_v_auth_context;
+  grpc_auth_property_iterator __pyx_v_properties;
+  grpc_auth_property const *__pyx_v_property;
+  PyObject *__pyx_v_py_auth_context = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("auth_context", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":74
+ *   cdef const grpc_auth_property* property
+ * 
+ *   auth_context = grpc_call_auth_context(call.c_call)             # <<<<<<<<<<<<<<
+ *   if auth_context == NULL:
+ *     return {}
+ */
+  __pyx_v_auth_context = grpc_call_auth_context(__pyx_v_call->c_call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":75
+ * 
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:             # <<<<<<<<<<<<<<
+ *     return {}
+ *   properties = grpc_auth_context_property_iterator(auth_context)
+ */
+  __pyx_t_1 = (__pyx_v_auth_context == NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":76
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:
+ *     return {}             # <<<<<<<<<<<<<<
+ *   properties = grpc_auth_context_property_iterator(auth_context)
+ *   py_auth_context = {}
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 76, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_r = __pyx_t_2;
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":75
+ * 
+ *   auth_context = grpc_call_auth_context(call.c_call)
+ *   if auth_context == NULL:             # <<<<<<<<<<<<<<
+ *     return {}
+ *   properties = grpc_auth_context_property_iterator(auth_context)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":77
+ *   if auth_context == NULL:
+ *     return {}
+ *   properties = grpc_auth_context_property_iterator(auth_context)             # <<<<<<<<<<<<<<
+ *   py_auth_context = {}
+ *   while True:
+ */
+  __pyx_v_properties = grpc_auth_context_property_iterator(__pyx_v_auth_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":78
+ *     return {}
+ *   properties = grpc_auth_context_property_iterator(auth_context)
+ *   py_auth_context = {}             # <<<<<<<<<<<<<<
+ *   while True:
+ *     property = grpc_auth_property_iterator_next(&properties)
+ */
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_v_py_auth_context = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":79
+ *   properties = grpc_auth_context_property_iterator(auth_context)
+ *   py_auth_context = {}
+ *   while True:             # <<<<<<<<<<<<<<
+ *     property = grpc_auth_property_iterator_next(&properties)
+ *     if property == NULL:
+ */
+  while (1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":80
+ *   py_auth_context = {}
+ *   while True:
+ *     property = grpc_auth_property_iterator_next(&properties)             # <<<<<<<<<<<<<<
+ *     if property == NULL:
+ *       break
+ */
+    __pyx_v_property = grpc_auth_property_iterator_next((&__pyx_v_properties));
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":81
+ *   while True:
+ *     property = grpc_auth_property_iterator_next(&properties)
+ *     if property == NULL:             # <<<<<<<<<<<<<<
+ *       break
+ *     if property.name != NULL and property.value != NULL:
+ */
+    __pyx_t_1 = (__pyx_v_property == NULL);
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":82
+ *     property = grpc_auth_property_iterator_next(&properties)
+ *     if property == NULL:
+ *       break             # <<<<<<<<<<<<<<
+ *     if property.name != NULL and property.value != NULL:
+ *       key = <bytes> property.name
+ */
+      goto __pyx_L5_break;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":81
+ *   while True:
+ *     property = grpc_auth_property_iterator_next(&properties)
+ *     if property == NULL:             # <<<<<<<<<<<<<<
+ *       break
+ *     if property.name != NULL and property.value != NULL:
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":83
+ *     if property == NULL:
+ *       break
+ *     if property.name != NULL and property.value != NULL:             # <<<<<<<<<<<<<<
+ *       key = <bytes> property.name
+ *       if key in py_auth_context:
+ */
+    __pyx_t_3 = (__pyx_v_property->name != NULL);
+    if (__pyx_t_3) {
+    } else {
+      __pyx_t_1 = __pyx_t_3;
+      goto __pyx_L8_bool_binop_done;
+    }
+    __pyx_t_3 = (__pyx_v_property->value != NULL);
+    __pyx_t_1 = __pyx_t_3;
+    __pyx_L8_bool_binop_done:;
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":84
+ *       break
+ *     if property.name != NULL and property.value != NULL:
+ *       key = <bytes> property.name             # <<<<<<<<<<<<<<
+ *       if key in py_auth_context:
+ *         py_auth_context[key].append(<bytes>(property.value))
+ */
+      __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_property->name); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 84, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_4 = __pyx_t_2;
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XDECREF_SET(__pyx_v_key, ((PyObject*)__pyx_t_4));
+      __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":85
+ *     if property.name != NULL and property.value != NULL:
+ *       key = <bytes> property.name
+ *       if key in py_auth_context:             # <<<<<<<<<<<<<<
+ *         py_auth_context[key].append(<bytes>(property.value))
+ *       else:
+ */
+      __pyx_t_1 = (__Pyx_PyDict_ContainsTF(__pyx_v_key, __pyx_v_py_auth_context, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(22, 85, __pyx_L1_error)
+      if (__pyx_t_1) {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":86
+ *       key = <bytes> property.name
+ *       if key in py_auth_context:
+ *         py_auth_context[key].append(<bytes>(property.value))             # <<<<<<<<<<<<<<
+ *       else:
+ *         py_auth_context[key] = [<bytes> property.value]
+ */
+        __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_py_auth_context, __pyx_v_key); if (unlikely(!__pyx_t_4)) __PYX_ERR(22, 86, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_property->value); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 86, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_5 = __Pyx_PyObject_Append(__pyx_t_4, __pyx_t_2); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(22, 86, __pyx_L1_error)
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":85
+ *     if property.name != NULL and property.value != NULL:
+ *       key = <bytes> property.name
+ *       if key in py_auth_context:             # <<<<<<<<<<<<<<
+ *         py_auth_context[key].append(<bytes>(property.value))
+ *       else:
+ */
+        goto __pyx_L10;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":88
+ *         py_auth_context[key].append(<bytes>(property.value))
+ *       else:
+ *         py_auth_context[key] = [<bytes> property.value]             # <<<<<<<<<<<<<<
+ *   grpc_auth_context_release(auth_context)
+ *   return py_auth_context
+ */
+      /*else*/ {
+        __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_property->value); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 88, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(22, 88, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_INCREF(((PyObject*)__pyx_t_2));
+        __Pyx_GIVEREF(((PyObject*)__pyx_t_2));
+        if (__Pyx_PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_2)) __PYX_ERR(22, 88, __pyx_L1_error);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        if (unlikely((PyDict_SetItem(__pyx_v_py_auth_context, __pyx_v_key, __pyx_t_4) < 0))) __PYX_ERR(22, 88, __pyx_L1_error)
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      }
+      __pyx_L10:;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":83
+ *     if property == NULL:
+ *       break
+ *     if property.name != NULL and property.value != NULL:             # <<<<<<<<<<<<<<
+ *       key = <bytes> property.name
+ *       if key in py_auth_context:
+ */
+    }
+  }
+  __pyx_L5_break:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":89
+ *       else:
+ *         py_auth_context[key] = [<bytes> property.value]
+ *   grpc_auth_context_release(auth_context)             # <<<<<<<<<<<<<<
+ *   return py_auth_context
+ * 
+ */
+  grpc_auth_context_release(__pyx_v_auth_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":90
+ *         py_auth_context[key] = [<bytes> property.value]
+ *   grpc_auth_context_release(auth_context)
+ *   return py_auth_context             # <<<<<<<<<<<<<<
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_py_auth_context);
+  __pyx_r = __pyx_v_py_auth_context;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":69
+ *   return key
+ * 
+ * def auth_context(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef grpc_auth_property_iterator properties
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.auth_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_py_auth_context);
+  __Pyx_XDECREF(__pyx_v_key);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":18
+ * cdef class Server:
+ * 
+ *   def __cinit__(self, object arguments, bint xds):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self.references = []
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_6Server_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_6Server_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_arguments = 0;
+  int __pyx_v_xds;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_arguments,&__pyx_n_s_xds,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_arguments)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 18, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_xds)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 18, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(23, 18, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(23, 18, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_arguments = values[0];
+    __pyx_v_xds = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_xds == (int)-1) && PyErr_Occurred())) __PYX_ERR(23, 18, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(23, 18, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Server.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server___cinit__(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self), __pyx_v_arguments, __pyx_v_xds);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_6Server___cinit__(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, PyObject *__pyx_v_arguments, int __pyx_v_xds) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_channel_args = 0;
+  grpc_server_xds_status_notifier __pyx_v_notifier;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  grpc_channel_args *__pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":19
+ * 
+ *   def __cinit__(self, object arguments, bint xds):
+ *     fork_handlers_and_grpc_init()             # <<<<<<<<<<<<<<
+ *     self.references = []
+ *     self.registered_completion_queues = []
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_handlers_and_grpc_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 19, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":20
+ *   def __cinit__(self, object arguments, bint xds):
+ *     fork_handlers_and_grpc_init()
+ *     self.references = []             # <<<<<<<<<<<<<<
+ *     self.registered_completion_queues = []
+ *     self.is_started = False
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->references);
+  __Pyx_DECREF(__pyx_v_self->references);
+  __pyx_v_self->references = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":21
+ *     fork_handlers_and_grpc_init()
+ *     self.references = []
+ *     self.registered_completion_queues = []             # <<<<<<<<<<<<<<
+ *     self.is_started = False
+ *     self.is_shutting_down = False
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->registered_completion_queues);
+  __Pyx_DECREF(__pyx_v_self->registered_completion_queues);
+  __pyx_v_self->registered_completion_queues = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":22
+ *     self.references = []
+ *     self.registered_completion_queues = []
+ *     self.is_started = False             # <<<<<<<<<<<<<<
+ *     self.is_shutting_down = False
+ *     self.is_shutdown = False
+ */
+  __pyx_v_self->is_started = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":23
+ *     self.registered_completion_queues = []
+ *     self.is_started = False
+ *     self.is_shutting_down = False             # <<<<<<<<<<<<<<
+ *     self.is_shutdown = False
+ *     self.c_server = NULL
+ */
+  __pyx_v_self->is_shutting_down = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":24
+ *     self.is_started = False
+ *     self.is_shutting_down = False
+ *     self.is_shutdown = False             # <<<<<<<<<<<<<<
+ *     self.c_server = NULL
+ *     cdef _ChannelArgs channel_args = _ChannelArgs(arguments)
+ */
+  __pyx_v_self->is_shutdown = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":25
+ *     self.is_shutting_down = False
+ *     self.is_shutdown = False
+ *     self.c_server = NULL             # <<<<<<<<<<<<<<
+ *     cdef _ChannelArgs channel_args = _ChannelArgs(arguments)
+ *     self.c_server = grpc_server_create(channel_args.c_args(), NULL)
+ */
+  __pyx_v_self->c_server = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":26
+ *     self.is_shutdown = False
+ *     self.c_server = NULL
+ *     cdef _ChannelArgs channel_args = _ChannelArgs(arguments)             # <<<<<<<<<<<<<<
+ *     self.c_server = grpc_server_create(channel_args.c_args(), NULL)
+ *     cdef grpc_server_xds_status_notifier notifier
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ChannelArgs), __pyx_v_arguments); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 26, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_channel_args = ((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":27
+ *     self.c_server = NULL
+ *     cdef _ChannelArgs channel_args = _ChannelArgs(arguments)
+ *     self.c_server = grpc_server_create(channel_args.c_args(), NULL)             # <<<<<<<<<<<<<<
+ *     cdef grpc_server_xds_status_notifier notifier
+ *     notifier.on_serving_status_update = NULL
+ */
+  __pyx_t_5 = ((struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs *)__pyx_v_channel_args->__pyx_vtab)->c_args(__pyx_v_channel_args); if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 27, __pyx_L1_error)
+  __pyx_v_self->c_server = grpc_server_create(__pyx_t_5, NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":29
+ *     self.c_server = grpc_server_create(channel_args.c_args(), NULL)
+ *     cdef grpc_server_xds_status_notifier notifier
+ *     notifier.on_serving_status_update = NULL             # <<<<<<<<<<<<<<
+ *     notifier.user_data = NULL
+ *     if xds:
+ */
+  __pyx_v_notifier.on_serving_status_update = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":30
+ *     cdef grpc_server_xds_status_notifier notifier
+ *     notifier.on_serving_status_update = NULL
+ *     notifier.user_data = NULL             # <<<<<<<<<<<<<<
+ *     if xds:
+ *       grpc_server_set_config_fetcher(self.c_server,
+ */
+  __pyx_v_notifier.user_data = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":31
+ *     notifier.on_serving_status_update = NULL
+ *     notifier.user_data = NULL
+ *     if xds:             # <<<<<<<<<<<<<<
+ *       grpc_server_set_config_fetcher(self.c_server,
+ *         grpc_server_config_fetcher_xds_create(notifier, channel_args.c_args()))
+ */
+  if (__pyx_v_xds) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":33
+ *     if xds:
+ *       grpc_server_set_config_fetcher(self.c_server,
+ *         grpc_server_config_fetcher_xds_create(notifier, channel_args.c_args()))             # <<<<<<<<<<<<<<
+ *     self.references.append(arguments)
+ * 
+ */
+    __pyx_t_5 = ((struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs *)__pyx_v_channel_args->__pyx_vtab)->c_args(__pyx_v_channel_args); if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 33, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":32
+ *     notifier.user_data = NULL
+ *     if xds:
+ *       grpc_server_set_config_fetcher(self.c_server,             # <<<<<<<<<<<<<<
+ *         grpc_server_config_fetcher_xds_create(notifier, channel_args.c_args()))
+ *     self.references.append(arguments)
+ */
+    grpc_server_set_config_fetcher(__pyx_v_self->c_server, grpc_server_config_fetcher_xds_create(__pyx_v_notifier, __pyx_t_5));
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":31
+ *     notifier.on_serving_status_update = NULL
+ *     notifier.user_data = NULL
+ *     if xds:             # <<<<<<<<<<<<<<
+ *       grpc_server_set_config_fetcher(self.c_server,
+ *         grpc_server_config_fetcher_xds_create(notifier, channel_args.c_args()))
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":34
+ *       grpc_server_set_config_fetcher(self.c_server,
+ *         grpc_server_config_fetcher_xds_create(notifier, channel_args.c_args()))
+ *     self.references.append(arguments)             # <<<<<<<<<<<<<<
+ * 
+ *   def request_call(
+ */
+  if (unlikely(__pyx_v_self->references == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(23, 34, __pyx_L1_error)
+  }
+  __pyx_t_6 = __Pyx_PyList_Append(__pyx_v_self->references, __pyx_v_arguments); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(23, 34, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":18
+ * cdef class Server:
+ * 
+ *   def __cinit__(self, object arguments, bint xds):             # <<<<<<<<<<<<<<
+ *     fork_handlers_and_grpc_init()
+ *     self.references = []
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.Server.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_channel_args);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":36
+ *     self.references.append(arguments)
+ * 
+ *   def request_call(             # <<<<<<<<<<<<<<
+ *       self, CompletionQueue call_queue not None,
+ *       CompletionQueue server_queue not None, tag):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_3request_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_3request_call = {"request_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_3request_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_3request_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_call_queue = 0;
+  struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_server_queue = 0;
+  PyObject *__pyx_v_tag = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("request_call (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call_queue,&__pyx_n_s_server_queue,&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_queue)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 36, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_server_queue)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 36, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("request_call", 1, 3, 3, 1); __PYX_ERR(23, 36, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 36, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("request_call", 1, 3, 3, 2); __PYX_ERR(23, 36, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "request_call") < 0)) __PYX_ERR(23, 36, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_call_queue = ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)values[0]);
+    __pyx_v_server_queue = ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)values[1]);
+    __pyx_v_tag = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("request_call", 1, 3, 3, __pyx_nargs); __PYX_ERR(23, 36, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Server.request_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_queue), __pyx_ptype_7_cython_6cygrpc_CompletionQueue, 0, "call_queue", 0))) __PYX_ERR(23, 37, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_server_queue), __pyx_ptype_7_cython_6cygrpc_CompletionQueue, 0, "server_queue", 0))) __PYX_ERR(23, 38, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_2request_call(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self), __pyx_v_call_queue, __pyx_v_server_queue, __pyx_v_tag);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_2request_call(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_call_queue, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_server_queue, PyObject *__pyx_v_tag) {
+  struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_request_call_tag = 0;
+  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("request_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":39
+ *       self, CompletionQueue call_queue not None,
+ *       CompletionQueue server_queue not None, tag):
+ *     if not self.is_started or self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       raise ValueError("server must be started and not shutting down")
+ *     if server_queue not in self.registered_completion_queues:
+ */
+  __pyx_t_2 = (!__pyx_v_self->is_started);
+  if (!__pyx_t_2) {
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_1 = __pyx_v_self->is_shutting_down;
+  __pyx_L4_bool_binop_done:;
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":40
+ *       CompletionQueue server_queue not None, tag):
+ *     if not self.is_started or self.is_shutting_down:
+ *       raise ValueError("server must be started and not shutting down")             # <<<<<<<<<<<<<<
+ *     if server_queue not in self.registered_completion_queues:
+ *       raise ValueError("server_queue must be a registered completion queue")
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__29, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 40, __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_ERR(23, 40, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":39
+ *       self, CompletionQueue call_queue not None,
+ *       CompletionQueue server_queue not None, tag):
+ *     if not self.is_started or self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       raise ValueError("server must be started and not shutting down")
+ *     if server_queue not in self.registered_completion_queues:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":41
+ *     if not self.is_started or self.is_shutting_down:
+ *       raise ValueError("server must be started and not shutting down")
+ *     if server_queue not in self.registered_completion_queues:             # <<<<<<<<<<<<<<
+ *       raise ValueError("server_queue must be a registered completion queue")
+ *     cdef _RequestCallTag request_call_tag = _RequestCallTag(tag)
+ */
+  __pyx_t_1 = (__Pyx_PySequence_ContainsTF(((PyObject *)__pyx_v_server_queue), __pyx_v_self->registered_completion_queues, Py_NE)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(23, 41, __pyx_L1_error)
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":42
+ *       raise ValueError("server must be started and not shutting down")
+ *     if server_queue not in self.registered_completion_queues:
+ *       raise ValueError("server_queue must be a registered completion queue")             # <<<<<<<<<<<<<<
+ *     cdef _RequestCallTag request_call_tag = _RequestCallTag(tag)
+ *     request_call_tag.prepare()
+ */
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__30, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 42, __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_ERR(23, 42, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":41
+ *     if not self.is_started or self.is_shutting_down:
+ *       raise ValueError("server must be started and not shutting down")
+ *     if server_queue not in self.registered_completion_queues:             # <<<<<<<<<<<<<<
+ *       raise ValueError("server_queue must be a registered completion queue")
+ *     cdef _RequestCallTag request_call_tag = _RequestCallTag(tag)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":43
+ *     if server_queue not in self.registered_completion_queues:
+ *       raise ValueError("server_queue must be a registered completion queue")
+ *     cdef _RequestCallTag request_call_tag = _RequestCallTag(tag)             # <<<<<<<<<<<<<<
+ *     request_call_tag.prepare()
+ *     cpython.Py_INCREF(request_call_tag)
+ */
+  __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__RequestCallTag), __pyx_v_tag); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 43, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_v_request_call_tag = ((struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":44
+ *       raise ValueError("server_queue must be a registered completion queue")
+ *     cdef _RequestCallTag request_call_tag = _RequestCallTag(tag)
+ *     request_call_tag.prepare()             # <<<<<<<<<<<<<<
+ *     cpython.Py_INCREF(request_call_tag)
+ *     return grpc_server_request_call(
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__RequestCallTag *)__pyx_v_request_call_tag->__pyx_base.__pyx_vtab)->prepare(__pyx_v_request_call_tag); if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 44, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":45
+ *     cdef _RequestCallTag request_call_tag = _RequestCallTag(tag)
+ *     request_call_tag.prepare()
+ *     cpython.Py_INCREF(request_call_tag)             # <<<<<<<<<<<<<<
+ *     return grpc_server_request_call(
+ *         self.c_server, &request_call_tag.call.c_call,
+ */
+  Py_INCREF(((PyObject *)__pyx_v_request_call_tag));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":46
+ *     request_call_tag.prepare()
+ *     cpython.Py_INCREF(request_call_tag)
+ *     return grpc_server_request_call(             # <<<<<<<<<<<<<<
+ *         self.c_server, &request_call_tag.call.c_call,
+ *         &request_call_tag.call_details.c_details,
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":51
+ *         &request_call_tag.c_invocation_metadata,
+ *         call_queue.c_completion_queue, server_queue.c_completion_queue,
+ *         <cpython.PyObject *>request_call_tag)             # <<<<<<<<<<<<<<
+ * 
+ *   def register_completion_queue(
+ */
+  __pyx_t_3 = __Pyx_PyInt_From_grpc_call_error(grpc_server_request_call(__pyx_v_self->c_server, (&__pyx_v_request_call_tag->call->c_call), (&__pyx_v_request_call_tag->call_details->c_details), (&__pyx_v_request_call_tag->c_invocation_metadata), __pyx_v_call_queue->c_completion_queue, __pyx_v_server_queue->c_completion_queue, ((PyObject *)__pyx_v_request_call_tag))); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 46, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_r = __pyx_t_3;
+  __pyx_t_3 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":36
+ *     self.references.append(arguments)
+ * 
+ *   def request_call(             # <<<<<<<<<<<<<<
+ *       self, CompletionQueue call_queue not None,
+ *       CompletionQueue server_queue not None, tag):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.Server.request_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_request_call_tag);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":53
+ *         <cpython.PyObject *>request_call_tag)
+ * 
+ *   def register_completion_queue(             # <<<<<<<<<<<<<<
+ *       self, CompletionQueue queue not None):
+ *     if self.is_started:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_5register_completion_queue(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_5register_completion_queue = {"register_completion_queue", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_5register_completion_queue, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_5register_completion_queue(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_queue = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("register_completion_queue (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_queue,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_queue)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 53, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "register_completion_queue") < 0)) __PYX_ERR(23, 53, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_queue = ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("register_completion_queue", 1, 1, 1, __pyx_nargs); __PYX_ERR(23, 53, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Server.register_completion_queue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_queue), __pyx_ptype_7_cython_6cygrpc_CompletionQueue, 0, "queue", 0))) __PYX_ERR(23, 54, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_4register_completion_queue(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self), __pyx_v_queue);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_4register_completion_queue(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_queue) {
+  PyObject *__pyx_r = NULL;
+  __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("register_completion_queue", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":55
+ *   def register_completion_queue(
+ *       self, CompletionQueue queue not None):
+ *     if self.is_started:             # <<<<<<<<<<<<<<
+ *       raise ValueError("cannot register completion queues after start")
+ *     with nogil:
+ */
+  if (unlikely(__pyx_v_self->is_started)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":56
+ *       self, CompletionQueue queue not None):
+ *     if self.is_started:
+ *       raise ValueError("cannot register completion queues after start")             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_server_register_completion_queue(
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__31, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 56, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(23, 56, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":55
+ *   def register_completion_queue(
+ *       self, CompletionQueue queue not None):
+ *     if self.is_started:             # <<<<<<<<<<<<<<
+ *       raise ValueError("cannot register completion queues after start")
+ *     with nogil:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":57
+ *     if self.is_started:
+ *       raise ValueError("cannot register completion queues after start")
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_server_register_completion_queue(
+ *           self.c_server, queue.c_completion_queue, NULL)
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":58
+ *       raise ValueError("cannot register completion queues after start")
+ *     with nogil:
+ *       grpc_server_register_completion_queue(             # <<<<<<<<<<<<<<
+ *           self.c_server, queue.c_completion_queue, NULL)
+ *     self.registered_completion_queues.append(queue)
+ */
+        grpc_server_register_completion_queue(__pyx_v_self->c_server, __pyx_v_queue->c_completion_queue, NULL);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":57
+ *     if self.is_started:
+ *       raise ValueError("cannot register completion queues after start")
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_server_register_completion_queue(
+ *           self.c_server, queue.c_completion_queue, NULL)
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L6;
+        }
+        __pyx_L6:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":60
+ *       grpc_server_register_completion_queue(
+ *           self.c_server, queue.c_completion_queue, NULL)
+ *     self.registered_completion_queues.append(queue)             # <<<<<<<<<<<<<<
+ * 
+ *   def start(self, backup_queue=True):
+ */
+  if (unlikely(__pyx_v_self->registered_completion_queues == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(23, 60, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_self->registered_completion_queues, ((PyObject *)__pyx_v_queue)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(23, 60, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":53
+ *         <cpython.PyObject *>request_call_tag)
+ * 
+ *   def register_completion_queue(             # <<<<<<<<<<<<<<
+ *       self, CompletionQueue queue not None):
+ *     if self.is_started:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.Server.register_completion_queue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":62
+ *     self.registered_completion_queues.append(queue)
+ * 
+ *   def start(self, backup_queue=True):             # <<<<<<<<<<<<<<
+ *     """Start the Cython gRPC Server.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_7start(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_6Server_6start, "Start the Cython gRPC Server.\n    \n    Args:\n      backup_queue: a bool indicates whether to spawn a backup completion\n        queue. In the case that no CQ is bound to the server, and the shutdown\n        of server becomes un-observable.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_7start = {"start", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_7start, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_6Server_6start};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_7start(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_backup_queue = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("start (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_backup_queue,0};
+    values[0] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_True));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_backup_queue);
+          if (value) { values[0] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 62, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "start") < 0)) __PYX_ERR(23, 62, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_backup_queue = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("start", 0, 0, 1, __pyx_nargs); __PYX_ERR(23, 62, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Server.start", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_6start(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self), __pyx_v_backup_queue);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_6start(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, PyObject *__pyx_v_backup_queue) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("start", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":70
+ *         of server becomes un-observable.
+ *     """
+ *     if self.is_started:             # <<<<<<<<<<<<<<
+ *       raise ValueError("the server has already started")
+ *     if backup_queue:
+ */
+  if (unlikely(__pyx_v_self->is_started)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":71
+ *     """
+ *     if self.is_started:
+ *       raise ValueError("the server has already started")             # <<<<<<<<<<<<<<
+ *     if backup_queue:
+ *       self.backup_shutdown_queue = CompletionQueue(shutdown_cq=True)
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__32, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 71, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(23, 71, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":70
+ *         of server becomes un-observable.
+ *     """
+ *     if self.is_started:             # <<<<<<<<<<<<<<
+ *       raise ValueError("the server has already started")
+ *     if backup_queue:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":72
+ *     if self.is_started:
+ *       raise ValueError("the server has already started")
+ *     if backup_queue:             # <<<<<<<<<<<<<<
+ *       self.backup_shutdown_queue = CompletionQueue(shutdown_cq=True)
+ *       self.register_completion_queue(self.backup_shutdown_queue)
+ */
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_backup_queue); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(23, 72, __pyx_L1_error)
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":73
+ *       raise ValueError("the server has already started")
+ *     if backup_queue:
+ *       self.backup_shutdown_queue = CompletionQueue(shutdown_cq=True)             # <<<<<<<<<<<<<<
+ *       self.register_completion_queue(self.backup_shutdown_queue)
+ *     self.is_started = True
+ */
+    __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 73, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_shutdown_cq, Py_True) < 0) __PYX_ERR(23, 73, __pyx_L1_error)
+    __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompletionQueue), __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 73, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_GIVEREF(__pyx_t_3);
+    __Pyx_GOTREF((PyObject *)__pyx_v_self->backup_shutdown_queue);
+    __Pyx_DECREF((PyObject *)__pyx_v_self->backup_shutdown_queue);
+    __pyx_v_self->backup_shutdown_queue = ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":74
+ *     if backup_queue:
+ *       self.backup_shutdown_queue = CompletionQueue(shutdown_cq=True)
+ *       self.register_completion_queue(self.backup_shutdown_queue)             # <<<<<<<<<<<<<<
+ *     self.is_started = True
+ *     with nogil:
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_register_completion_queue); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 74, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_1))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_1, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, ((PyObject *)__pyx_v_self->backup_shutdown_queue)};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 74, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":72
+ *     if self.is_started:
+ *       raise ValueError("the server has already started")
+ *     if backup_queue:             # <<<<<<<<<<<<<<
+ *       self.backup_shutdown_queue = CompletionQueue(shutdown_cq=True)
+ *       self.register_completion_queue(self.backup_shutdown_queue)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":75
+ *       self.backup_shutdown_queue = CompletionQueue(shutdown_cq=True)
+ *       self.register_completion_queue(self.backup_shutdown_queue)
+ *     self.is_started = True             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_server_start(self.c_server)
+ */
+  __pyx_v_self->is_started = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":76
+ *       self.register_completion_queue(self.backup_shutdown_queue)
+ *     self.is_started = True
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_server_start(self.c_server)
+ *     if backup_queue:
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":77
+ *     self.is_started = True
+ *     with nogil:
+ *       grpc_server_start(self.c_server)             # <<<<<<<<<<<<<<
+ *     if backup_queue:
+ *       # Ensure the core has gotten a chance to do the start-up work
+ */
+        grpc_server_start(__pyx_v_self->c_server);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":76
+ *       self.register_completion_queue(self.backup_shutdown_queue)
+ *     self.is_started = True
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_server_start(self.c_server)
+ *     if backup_queue:
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L7;
+        }
+        __pyx_L7:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":78
+ *     with nogil:
+ *       grpc_server_start(self.c_server)
+ *     if backup_queue:             # <<<<<<<<<<<<<<
+ *       # Ensure the core has gotten a chance to do the start-up work
+ *       self.backup_shutdown_queue.poll(deadline=time.time())
+ */
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_backup_queue); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(23, 78, __pyx_L1_error)
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":80
+ *     if backup_queue:
+ *       # Ensure the core has gotten a chance to do the start-up work
+ *       self.backup_shutdown_queue.poll(deadline=time.time())             # <<<<<<<<<<<<<<
+ * 
+ *   def add_http2_port(self, bytes address,
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->backup_shutdown_queue), __pyx_n_s_poll); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_time); if (unlikely(!__pyx_t_6)) __PYX_ERR(23, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_time); if (unlikely(!__pyx_t_7)) __PYX_ERR(23, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_6 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_7))) {
+      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7);
+      if (likely(__pyx_t_6)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+        __Pyx_INCREF(__pyx_t_6);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_7, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(23, 80, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    }
+    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_deadline, __pyx_t_4) < 0) __PYX_ERR(23, 80, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(23, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":78
+ *     with nogil:
+ *       grpc_server_start(self.c_server)
+ *     if backup_queue:             # <<<<<<<<<<<<<<
+ *       # Ensure the core has gotten a chance to do the start-up work
+ *       self.backup_shutdown_queue.poll(deadline=time.time())
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":62
+ *     self.registered_completion_queues.append(queue)
+ * 
+ *   def start(self, backup_queue=True):             # <<<<<<<<<<<<<<
+ *     """Start the Cython gRPC Server.
+ * 
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_cython.cygrpc.Server.start", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":82
+ *       self.backup_shutdown_queue.poll(deadline=time.time())
+ * 
+ *   def add_http2_port(self, bytes address,             # <<<<<<<<<<<<<<
+ *                      ServerCredentials server_credentials=None):
+ *     address = str_to_bytes(address)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_9add_http2_port(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_9add_http2_port = {"add_http2_port", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_9add_http2_port, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_9add_http2_port(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_address = 0;
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_server_credentials = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("add_http2_port (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_address,&__pyx_n_s_server_credentials,0};
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":83
+ * 
+ *   def add_http2_port(self, bytes address,
+ *                      ServerCredentials server_credentials=None):             # <<<<<<<<<<<<<<
+ *     address = str_to_bytes(address)
+ *     self.references.append(address)
+ */
+    values[1] = __Pyx_Arg_NewRef_FASTCALL((PyObject *)((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_address)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 82, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_server_credentials);
+          if (value) { values[1] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 82, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_http2_port") < 0)) __PYX_ERR(23, 82, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_address = ((PyObject*)values[0]);
+    __pyx_v_server_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)values[1]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("add_http2_port", 0, 1, 2, __pyx_nargs); __PYX_ERR(23, 82, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Server.add_http2_port", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_address), (&PyBytes_Type), 1, "address", 1))) __PYX_ERR(23, 82, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_server_credentials), __pyx_ptype_7_cython_6cygrpc_ServerCredentials, 1, "server_credentials", 0))) __PYX_ERR(23, 83, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_8add_http2_port(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self), __pyx_v_address, __pyx_v_server_credentials);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":82
+ *       self.backup_shutdown_queue.poll(deadline=time.time())
+ * 
+ *   def add_http2_port(self, bytes address,             # <<<<<<<<<<<<<<
+ *                      ServerCredentials server_credentials=None):
+ *     address = str_to_bytes(address)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_8add_http2_port(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, PyObject *__pyx_v_address, struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *__pyx_v_server_credentials) {
+  int __pyx_v_result;
+  char *__pyx_v_address_c_string;
+  grpc_server_credentials *__pyx_v_creds;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  char *__pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("add_http2_port", 0);
+  __Pyx_INCREF(__pyx_v_address);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":84
+ *   def add_http2_port(self, bytes address,
+ *                      ServerCredentials server_credentials=None):
+ *     address = str_to_bytes(address)             # <<<<<<<<<<<<<<
+ *     self.references.append(address)
+ *     cdef int result
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_str_to_bytes(__pyx_v_address); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 84, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF_SET(__pyx_v_address, ((PyObject*)__pyx_t_1));
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":85
+ *                      ServerCredentials server_credentials=None):
+ *     address = str_to_bytes(address)
+ *     self.references.append(address)             # <<<<<<<<<<<<<<
+ *     cdef int result
+ *     cdef char *address_c_string = address
+ */
+  if (unlikely(__pyx_v_self->references == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(23, 85, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_self->references, __pyx_v_address); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(23, 85, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":87
+ *     self.references.append(address)
+ *     cdef int result
+ *     cdef char *address_c_string = address             # <<<<<<<<<<<<<<
+ *     if server_credentials is not None:
+ *       self.references.append(server_credentials)
+ */
+  if (unlikely(__pyx_v_address == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+    __PYX_ERR(23, 87, __pyx_L1_error)
+  }
+  __pyx_t_3 = __Pyx_PyBytes_AsWritableString(__pyx_v_address); if (unlikely((!__pyx_t_3) && PyErr_Occurred())) __PYX_ERR(23, 87, __pyx_L1_error)
+  __pyx_v_address_c_string = __pyx_t_3;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":88
+ *     cdef int result
+ *     cdef char *address_c_string = address
+ *     if server_credentials is not None:             # <<<<<<<<<<<<<<
+ *       self.references.append(server_credentials)
+ *       with nogil:
+ */
+  __pyx_t_4 = (((PyObject *)__pyx_v_server_credentials) != Py_None);
+  if (__pyx_t_4) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":89
+ *     cdef char *address_c_string = address
+ *     if server_credentials is not None:
+ *       self.references.append(server_credentials)             # <<<<<<<<<<<<<<
+ *       with nogil:
+ *         result = grpc_server_add_http2_port(
+ */
+    if (unlikely(__pyx_v_self->references == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+      __PYX_ERR(23, 89, __pyx_L1_error)
+    }
+    __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_self->references, ((PyObject *)__pyx_v_server_credentials)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(23, 89, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":90
+ *     if server_credentials is not None:
+ *       self.references.append(server_credentials)
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         result = grpc_server_add_http2_port(
+ *             self.c_server, address_c_string, server_credentials.c_credentials)
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":91
+ *       self.references.append(server_credentials)
+ *       with nogil:
+ *         result = grpc_server_add_http2_port(             # <<<<<<<<<<<<<<
+ *             self.c_server, address_c_string, server_credentials.c_credentials)
+ *     else:
+ */
+          __pyx_v_result = grpc_server_add_http2_port(__pyx_v_self->c_server, __pyx_v_address_c_string, __pyx_v_server_credentials->c_credentials);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":90
+ *     if server_credentials is not None:
+ *       self.references.append(server_credentials)
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         result = grpc_server_add_http2_port(
+ *             self.c_server, address_c_string, server_credentials.c_credentials)
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L6;
+          }
+          __pyx_L6:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":88
+ *     cdef int result
+ *     cdef char *address_c_string = address
+ *     if server_credentials is not None:             # <<<<<<<<<<<<<<
+ *       self.references.append(server_credentials)
+ *       with nogil:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":94
+ *             self.c_server, address_c_string, server_credentials.c_credentials)
+ *     else:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         creds = grpc_insecure_server_credentials_create()
+ *         result = grpc_server_add_http2_port(self.c_server,
+ */
+  /*else*/ {
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":95
+ *     else:
+ *       with nogil:
+ *         creds = grpc_insecure_server_credentials_create()             # <<<<<<<<<<<<<<
+ *         result = grpc_server_add_http2_port(self.c_server,
+ *                                             address_c_string, creds)
+ */
+          __pyx_v_creds = grpc_insecure_server_credentials_create();
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":96
+ *       with nogil:
+ *         creds = grpc_insecure_server_credentials_create()
+ *         result = grpc_server_add_http2_port(self.c_server,             # <<<<<<<<<<<<<<
+ *                                             address_c_string, creds)
+ *         grpc_server_credentials_release(creds)
+ */
+          __pyx_v_result = grpc_server_add_http2_port(__pyx_v_self->c_server, __pyx_v_address_c_string, __pyx_v_creds);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":98
+ *         result = grpc_server_add_http2_port(self.c_server,
+ *                                             address_c_string, creds)
+ *         grpc_server_credentials_release(creds)             # <<<<<<<<<<<<<<
+ *     return result
+ * 
+ */
+          grpc_server_credentials_release(__pyx_v_creds);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":94
+ *             self.c_server, address_c_string, server_credentials.c_credentials)
+ *     else:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         creds = grpc_insecure_server_credentials_create()
+ *         result = grpc_server_add_http2_port(self.c_server,
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L9;
+          }
+          __pyx_L9:;
+        }
+    }
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":99
+ *                                             address_c_string, creds)
+ *         grpc_server_credentials_release(creds)
+ *     return result             # <<<<<<<<<<<<<<
+ * 
+ *   cdef _c_shutdown(self, CompletionQueue queue, tag):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_result); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 99, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":82
+ *       self.backup_shutdown_queue.poll(deadline=time.time())
+ * 
+ *   def add_http2_port(self, bytes address,             # <<<<<<<<<<<<<<
+ *                      ServerCredentials server_credentials=None):
+ *     address = str_to_bytes(address)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.Server.add_http2_port", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_address);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":101
+ *     return result
+ * 
+ *   cdef _c_shutdown(self, CompletionQueue queue, tag):             # <<<<<<<<<<<<<<
+ *     self.is_shutting_down = True
+ *     cdef _ServerShutdownTag server_shutdown_tag = _ServerShutdownTag(tag, self)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_6Server__c_shutdown(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_queue, PyObject *__pyx_v_tag) {
+  struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_server_shutdown_tag = 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("_c_shutdown", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":102
+ * 
+ *   cdef _c_shutdown(self, CompletionQueue queue, tag):
+ *     self.is_shutting_down = True             # <<<<<<<<<<<<<<
+ *     cdef _ServerShutdownTag server_shutdown_tag = _ServerShutdownTag(tag, self)
+ *     cpython.Py_INCREF(server_shutdown_tag)
+ */
+  __pyx_v_self->is_shutting_down = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":103
+ *   cdef _c_shutdown(self, CompletionQueue queue, tag):
+ *     self.is_shutting_down = True
+ *     cdef _ServerShutdownTag server_shutdown_tag = _ServerShutdownTag(tag, self)             # <<<<<<<<<<<<<<
+ *     cpython.Py_INCREF(server_shutdown_tag)
+ *     with nogil:
+ */
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_tag);
+  __Pyx_GIVEREF(__pyx_v_tag);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tag)) __PYX_ERR(23, 103, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_self);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_self))) __PYX_ERR(23, 103, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_server_shutdown_tag = ((struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":104
+ *     self.is_shutting_down = True
+ *     cdef _ServerShutdownTag server_shutdown_tag = _ServerShutdownTag(tag, self)
+ *     cpython.Py_INCREF(server_shutdown_tag)             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_server_shutdown_and_notify(
+ */
+  Py_INCREF(((PyObject *)__pyx_v_server_shutdown_tag));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":105
+ *     cdef _ServerShutdownTag server_shutdown_tag = _ServerShutdownTag(tag, self)
+ *     cpython.Py_INCREF(server_shutdown_tag)
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_server_shutdown_and_notify(
+ *           self.c_server, queue.c_completion_queue,
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":106
+ *     cpython.Py_INCREF(server_shutdown_tag)
+ *     with nogil:
+ *       grpc_server_shutdown_and_notify(             # <<<<<<<<<<<<<<
+ *           self.c_server, queue.c_completion_queue,
+ *           <cpython.PyObject *>server_shutdown_tag)
+ */
+        grpc_server_shutdown_and_notify(__pyx_v_self->c_server, __pyx_v_queue->c_completion_queue, ((PyObject *)__pyx_v_server_shutdown_tag));
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":105
+ *     cdef _ServerShutdownTag server_shutdown_tag = _ServerShutdownTag(tag, self)
+ *     cpython.Py_INCREF(server_shutdown_tag)
+ *     with nogil:             # <<<<<<<<<<<<<<
+ *       grpc_server_shutdown_and_notify(
+ *           self.c_server, queue.c_completion_queue,
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":101
+ *     return result
+ * 
+ *   cdef _c_shutdown(self, CompletionQueue queue, tag):             # <<<<<<<<<<<<<<
+ *     self.is_shutting_down = True
+ *     cdef _ServerShutdownTag server_shutdown_tag = _ServerShutdownTag(tag, self)
+ */
+
+  /* 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_AddTraceback("_cython.cygrpc.Server._c_shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_server_shutdown_tag);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":110
+ *           <cpython.PyObject *>server_shutdown_tag)
+ * 
+ *   def shutdown(self, CompletionQueue queue not None, tag):             # <<<<<<<<<<<<<<
+ *     if queue.is_shutting_down:
+ *       raise ValueError("queue must be live")
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_11shutdown(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_11shutdown = {"shutdown", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_11shutdown, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_11shutdown(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_queue = 0;
+  PyObject *__pyx_v_tag = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("shutdown (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_queue,&__pyx_n_s_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_queue)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 110, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(23, 110, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("shutdown", 1, 2, 2, 1); __PYX_ERR(23, 110, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "shutdown") < 0)) __PYX_ERR(23, 110, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_queue = ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)values[0]);
+    __pyx_v_tag = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("shutdown", 1, 2, 2, __pyx_nargs); __PYX_ERR(23, 110, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Server.shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_queue), __pyx_ptype_7_cython_6cygrpc_CompletionQueue, 0, "queue", 0))) __PYX_ERR(23, 110, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_10shutdown(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self), __pyx_v_queue, __pyx_v_tag);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_10shutdown(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *__pyx_v_queue, PyObject *__pyx_v_tag) {
+  PyObject *__pyx_r = NULL;
+  __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("shutdown", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":111
+ * 
+ *   def shutdown(self, CompletionQueue queue not None, tag):
+ *     if queue.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       raise ValueError("queue must be live")
+ *     elif not self.is_started:
+ */
+  if (unlikely(__pyx_v_queue->is_shutting_down)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":112
+ *   def shutdown(self, CompletionQueue queue not None, tag):
+ *     if queue.is_shutting_down:
+ *       raise ValueError("queue must be live")             # <<<<<<<<<<<<<<
+ *     elif not self.is_started:
+ *       raise ValueError("the server hasn't started yet")
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__33, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 112, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(23, 112, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":111
+ * 
+ *   def shutdown(self, CompletionQueue queue not None, tag):
+ *     if queue.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       raise ValueError("queue must be live")
+ *     elif not self.is_started:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":113
+ *     if queue.is_shutting_down:
+ *       raise ValueError("queue must be live")
+ *     elif not self.is_started:             # <<<<<<<<<<<<<<
+ *       raise ValueError("the server hasn't started yet")
+ *     elif self.is_shutting_down:
+ */
+  __pyx_t_2 = (!__pyx_v_self->is_started);
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":114
+ *       raise ValueError("queue must be live")
+ *     elif not self.is_started:
+ *       raise ValueError("the server hasn't started yet")             # <<<<<<<<<<<<<<
+ *     elif self.is_shutting_down:
+ *       return
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 114, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(23, 114, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":113
+ *     if queue.is_shutting_down:
+ *       raise ValueError("queue must be live")
+ *     elif not self.is_started:             # <<<<<<<<<<<<<<
+ *       raise ValueError("the server hasn't started yet")
+ *     elif self.is_shutting_down:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":115
+ *     elif not self.is_started:
+ *       raise ValueError("the server hasn't started yet")
+ *     elif self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       return
+ *     elif queue not in self.registered_completion_queues:
+ */
+  if (__pyx_v_self->is_shutting_down) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":116
+ *       raise ValueError("the server hasn't started yet")
+ *     elif self.is_shutting_down:
+ *       return             # <<<<<<<<<<<<<<
+ *     elif queue not in self.registered_completion_queues:
+ *       raise ValueError("expected registered completion queue")
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":115
+ *     elif not self.is_started:
+ *       raise ValueError("the server hasn't started yet")
+ *     elif self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       return
+ *     elif queue not in self.registered_completion_queues:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":117
+ *     elif self.is_shutting_down:
+ *       return
+ *     elif queue not in self.registered_completion_queues:             # <<<<<<<<<<<<<<
+ *       raise ValueError("expected registered completion queue")
+ *     else:
+ */
+  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(((PyObject *)__pyx_v_queue), __pyx_v_self->registered_completion_queues, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(23, 117, __pyx_L1_error)
+  if (unlikely(__pyx_t_2)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":118
+ *       return
+ *     elif queue not in self.registered_completion_queues:
+ *       raise ValueError("expected registered completion queue")             # <<<<<<<<<<<<<<
+ *     else:
+ *       self._c_shutdown(queue, tag)
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 118, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(23, 118, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":117
+ *     elif self.is_shutting_down:
+ *       return
+ *     elif queue not in self.registered_completion_queues:             # <<<<<<<<<<<<<<
+ *       raise ValueError("expected registered completion queue")
+ *     else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":120
+ *       raise ValueError("expected registered completion queue")
+ *     else:
+ *       self._c_shutdown(queue, tag)             # <<<<<<<<<<<<<<
+ * 
+ *   cdef notify_shutdown_complete(self):
+ */
+  /*else*/ {
+    __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_Server *)__pyx_v_self->__pyx_vtab)->_c_shutdown(__pyx_v_self, __pyx_v_queue, __pyx_v_tag); if (unlikely(!__pyx_t_1)) __PYX_ERR(23, 120, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":110
+ *           <cpython.PyObject *>server_shutdown_tag)
+ * 
+ *   def shutdown(self, CompletionQueue queue not None, tag):             # <<<<<<<<<<<<<<
+ *     if queue.is_shutting_down:
+ *       raise ValueError("queue must be live")
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.Server.shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":122
+ *       self._c_shutdown(queue, tag)
+ * 
+ *   cdef notify_shutdown_complete(self):             # <<<<<<<<<<<<<<
+ *     # called only after our server shutdown tag has emerged from a completion
+ *     # queue.
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_6Server_notify_shutdown_complete(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("notify_shutdown_complete", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":125
+ *     # called only after our server shutdown tag has emerged from a completion
+ *     # queue.
+ *     self.is_shutdown = True             # <<<<<<<<<<<<<<
+ * 
+ *   def cancel_all_calls(self):
+ */
+  __pyx_v_self->is_shutdown = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":122
+ *       self._c_shutdown(queue, tag)
+ * 
+ *   cdef notify_shutdown_complete(self):             # <<<<<<<<<<<<<<
+ *     # called only after our server shutdown tag has emerged from a completion
+ *     # queue.
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":127
+ *     self.is_shutdown = True
+ * 
+ *   def cancel_all_calls(self):             # <<<<<<<<<<<<<<
+ *     if not self.is_shutting_down:
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_13cancel_all_calls(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_13cancel_all_calls = {"cancel_all_calls", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_13cancel_all_calls, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_13cancel_all_calls(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancel_all_calls (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("cancel_all_calls", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "cancel_all_calls", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_12cancel_all_calls(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_12cancel_all_calls(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("cancel_all_calls", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":128
+ * 
+ *   def cancel_all_calls(self):
+ *     if not self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ *     elif self.is_shutdown:
+ */
+  __pyx_t_1 = (!__pyx_v_self->is_shutting_down);
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":129
+ *   def cancel_all_calls(self):
+ *     if not self.is_shutting_down:
+ *       raise UsageError("the server must be shutting down to cancel all calls")             # <<<<<<<<<<<<<<
+ *     elif self.is_shutdown:
+ *       return
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_UsageError); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 129, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_s_the_server_must_be_shutting_down};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 129, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(23, 129, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":128
+ * 
+ *   def cancel_all_calls(self):
+ *     if not self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ *     elif self.is_shutdown:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":130
+ *     if not self.is_shutting_down:
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ *     elif self.is_shutdown:             # <<<<<<<<<<<<<<
+ *       return
+ *     else:
+ */
+  if (__pyx_v_self->is_shutdown) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":131
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ *     elif self.is_shutdown:
+ *       return             # <<<<<<<<<<<<<<
+ *     else:
+ *       with nogil:
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":130
+ *     if not self.is_shutting_down:
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ *     elif self.is_shutdown:             # <<<<<<<<<<<<<<
+ *       return
+ *     else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":133
+ *       return
+ *     else:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         grpc_server_cancel_all_calls(self.c_server)
+ * 
+ */
+  /*else*/ {
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":134
+ *     else:
+ *       with nogil:
+ *         grpc_server_cancel_all_calls(self.c_server)             # <<<<<<<<<<<<<<
+ * 
+ *   # TODO(https://github.com/grpc/grpc/issues/17515) Determine what, if any,
+ */
+          grpc_server_cancel_all_calls(__pyx_v_self->c_server);
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":133
+ *       return
+ *     else:
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         grpc_server_cancel_all_calls(self.c_server)
+ * 
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L6;
+          }
+          __pyx_L6:;
+        }
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":127
+ *     self.is_shutdown = True
+ * 
+ *   def cancel_all_calls(self):             # <<<<<<<<<<<<<<
+ *     if not self.is_shutting_down:
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.Server.cancel_all_calls", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":139
+ *   # portion of this is safe to call from __dealloc__, and potentially remove
+ *   # backup_shutdown_queue.
+ *   def destroy(self):             # <<<<<<<<<<<<<<
+ *     if self.c_server != NULL:
+ *       if not self.is_started:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_15destroy(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_15destroy = {"destroy", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_15destroy, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_15destroy(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("destroy (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("destroy", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "destroy", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_14destroy(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_14destroy(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("destroy", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":140
+ *   # backup_shutdown_queue.
+ *   def destroy(self):
+ *     if self.c_server != NULL:             # <<<<<<<<<<<<<<
+ *       if not self.is_started:
+ *         pass
+ */
+  __pyx_t_1 = (__pyx_v_self->c_server != NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":141
+ *   def destroy(self):
+ *     if self.c_server != NULL:
+ *       if not self.is_started:             # <<<<<<<<<<<<<<
+ *         pass
+ *       elif self.is_shutdown:
+ */
+    __pyx_t_1 = (!__pyx_v_self->is_started);
+    if (__pyx_t_1) {
+      goto __pyx_L4;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":143
+ *       if not self.is_started:
+ *         pass
+ *       elif self.is_shutdown:             # <<<<<<<<<<<<<<
+ *         pass
+ *       elif not self.is_shutting_down:
+ */
+    if (__pyx_v_self->is_shutdown) {
+      goto __pyx_L4;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":145
+ *       elif self.is_shutdown:
+ *         pass
+ *       elif not self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *         if self.backup_shutdown_queue is None:
+ *           raise InternalError('Server shutdown failed: no completion queue.')
+ */
+    __pyx_t_1 = (!__pyx_v_self->is_shutting_down);
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":146
+ *         pass
+ *       elif not self.is_shutting_down:
+ *         if self.backup_shutdown_queue is None:             # <<<<<<<<<<<<<<
+ *           raise InternalError('Server shutdown failed: no completion queue.')
+ *         else:
+ */
+      __pyx_t_1 = (((PyObject *)__pyx_v_self->backup_shutdown_queue) == Py_None);
+      if (unlikely(__pyx_t_1)) {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":147
+ *       elif not self.is_shutting_down:
+ *         if self.backup_shutdown_queue is None:
+ *           raise InternalError('Server shutdown failed: no completion queue.')             # <<<<<<<<<<<<<<
+ *         else:
+ *           # the user didn't call shutdown - use our backup queue
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_InternalError); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 147, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_4 = NULL;
+        __pyx_t_5 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_3))) {
+          __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+          if (likely(__pyx_t_4)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+            __Pyx_INCREF(__pyx_t_4);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_3, function);
+            __pyx_t_5 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_s_Server_shutdown_failed_no_comple};
+          __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 147, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        }
+        __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __PYX_ERR(23, 147, __pyx_L1_error)
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":146
+ *         pass
+ *       elif not self.is_shutting_down:
+ *         if self.backup_shutdown_queue is None:             # <<<<<<<<<<<<<<
+ *           raise InternalError('Server shutdown failed: no completion queue.')
+ *         else:
+ */
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":150
+ *         else:
+ *           # the user didn't call shutdown - use our backup queue
+ *           self._c_shutdown(self.backup_shutdown_queue, None)             # <<<<<<<<<<<<<<
+ *           # and now we wait
+ *           while not self.is_shutdown:
+ */
+      /*else*/ {
+        __pyx_t_2 = ((PyObject *)__pyx_v_self->backup_shutdown_queue);
+        __Pyx_INCREF(__pyx_t_2);
+        __pyx_t_3 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_Server *)__pyx_v_self->__pyx_vtab)->_c_shutdown(__pyx_v_self, ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)__pyx_t_2), Py_None); if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 150, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":152
+ *           self._c_shutdown(self.backup_shutdown_queue, None)
+ *           # and now we wait
+ *           while not self.is_shutdown:             # <<<<<<<<<<<<<<
+ *             self.backup_shutdown_queue.poll()
+ *       else:
+ */
+        while (1) {
+          __pyx_t_1 = (!__pyx_v_self->is_shutdown);
+          if (!__pyx_t_1) break;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":153
+ *           # and now we wait
+ *           while not self.is_shutdown:
+ *             self.backup_shutdown_queue.poll()             # <<<<<<<<<<<<<<
+ *       else:
+ *         # We're in the process of shutting down, but have not shutdown; can't do
+ */
+          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->backup_shutdown_queue), __pyx_n_s_poll); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 153, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_4 = NULL;
+          __pyx_t_5 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (likely(PyMethod_Check(__pyx_t_2))) {
+            __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+            if (likely(__pyx_t_4)) {
+              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+              __Pyx_INCREF(__pyx_t_4);
+              __Pyx_INCREF(function);
+              __Pyx_DECREF_SET(__pyx_t_2, function);
+              __pyx_t_5 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+            __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+            if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 153, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":145
+ *       elif self.is_shutdown:
+ *         pass
+ *       elif not self.is_shutting_down:             # <<<<<<<<<<<<<<
+ *         if self.backup_shutdown_queue is None:
+ *           raise InternalError('Server shutdown failed: no completion queue.')
+ */
+      goto __pyx_L4;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":157
+ *         # We're in the process of shutting down, but have not shutdown; can't do
+ *         # much but repeatedly release the GIL and wait
+ *         while not self.is_shutdown:             # <<<<<<<<<<<<<<
+ *           time.sleep(0)
+ *       with nogil:
+ */
+    /*else*/ {
+      while (1) {
+        __pyx_t_1 = (!__pyx_v_self->is_shutdown);
+        if (!__pyx_t_1) break;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":158
+ *         # much but repeatedly release the GIL and wait
+ *         while not self.is_shutdown:
+ *           time.sleep(0)             # <<<<<<<<<<<<<<
+ *       with nogil:
+ *         grpc_server_destroy(self.c_server)
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_time); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 158, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_sleep); if (unlikely(!__pyx_t_4)) __PYX_ERR(23, 158, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __pyx_t_2 = NULL;
+        __pyx_t_5 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (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);
+            __pyx_t_5 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_int_0};
+          __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          if (unlikely(!__pyx_t_3)) __PYX_ERR(23, 158, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      }
+    }
+    __pyx_L4:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":159
+ *         while not self.is_shutdown:
+ *           time.sleep(0)
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         grpc_server_destroy(self.c_server)
+ *         self.c_server = NULL
+ */
+    {
+        #ifdef WITH_THREAD
+        PyThreadState *_save;
+        _save = NULL;
+        Py_UNBLOCK_THREADS
+        __Pyx_FastGIL_Remember();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":160
+ *           time.sleep(0)
+ *       with nogil:
+ *         grpc_server_destroy(self.c_server)             # <<<<<<<<<<<<<<
+ *         self.c_server = NULL
+ * 
+ */
+          grpc_server_destroy(__pyx_v_self->c_server);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":161
+ *       with nogil:
+ *         grpc_server_destroy(self.c_server)
+ *         self.c_server = NULL             # <<<<<<<<<<<<<<
+ * 
+ *   def __dealloc__(self):
+ */
+          __pyx_v_self->c_server = NULL;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":159
+ *         while not self.is_shutdown:
+ *           time.sleep(0)
+ *       with nogil:             # <<<<<<<<<<<<<<
+ *         grpc_server_destroy(self.c_server)
+ *         self.c_server = NULL
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_FastGIL_Forget();
+            Py_BLOCK_THREADS
+            #endif
+            goto __pyx_L12;
+          }
+          __pyx_L12:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":140
+ *   # backup_shutdown_queue.
+ *   def destroy(self):
+ *     if self.c_server != NULL:             # <<<<<<<<<<<<<<
+ *       if not self.is_started:
+ *         pass
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":139
+ *   # portion of this is safe to call from __dealloc__, and potentially remove
+ *   # backup_shutdown_queue.
+ *   def destroy(self):             # <<<<<<<<<<<<<<
+ *     if self.c_server != NULL:
+ *       if not self.is_started:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.Server.destroy", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":163
+ *         self.c_server = NULL
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self.c_server == NULL:
+ *       grpc_shutdown()
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_6Server_17__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_6Server_17__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_6Server_16__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_6Server_16__dealloc__(struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self) {
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":164
+ * 
+ *   def __dealloc__(self):
+ *     if self.c_server == NULL:             # <<<<<<<<<<<<<<
+ *       grpc_shutdown()
+ */
+  __pyx_t_1 = (__pyx_v_self->c_server == NULL);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":165
+ *   def __dealloc__(self):
+ *     if self.c_server == NULL:
+ *       grpc_shutdown()             # <<<<<<<<<<<<<<
+ */
+    grpc_shutdown();
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":164
+ * 
+ *   def __dealloc__(self):
+ *     if self.c_server == NULL:             # <<<<<<<<<<<<<<
+ *       grpc_shutdown()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":163
+ *         self.c_server = NULL
+ * 
+ *   def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *     if self.c_server == NULL:
+ *       grpc_shutdown()
+ */
+
+  /* function exit code */
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_19__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_19__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_19__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_19__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_18__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_18__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.Server.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_21__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_6Server_21__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_21__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_6Server_21__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.Server.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_6Server_20__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_6Server_20__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_Server *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.Server.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":18
+ * cdef class _Tag:
+ * 
+ *   cdef BaseEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+static struct __pyx_obj_7_cython_6cygrpc_BaseEvent *__pyx_f_7_cython_6cygrpc_4_Tag_event(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__Tag *__pyx_v_self, CYTHON_UNUSED grpc_event __pyx_v_c_event) {
+  struct __pyx_obj_7_cython_6cygrpc_BaseEvent *__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("event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":19
+ * 
+ *   cdef BaseEvent event(self, grpc_event c_event):
+ *     raise NotImplementedError()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_builtin_NotImplementedError); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __PYX_ERR(24, 19, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":18
+ * cdef class _Tag:
+ * 
+ *   cdef BaseEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     raise NotImplementedError()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._Tag.event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_Tag_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4_Tag_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_Tag_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_Tag_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4_Tag___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__Tag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_Tag___reduce_cython__(struct __pyx_obj_7_cython_6cygrpc__Tag *__pyx_v_self) {
+  PyObject *__pyx_v_state = 0;
+  PyObject *__pyx_v__dict = 0;
+  int __pyx_v_use_setstate;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__reduce_cython__", 1);
+
+  /* "(tree fragment)":5
+ *     cdef object _dict
+ *     cdef bint use_setstate
+ *     state = ()             # <<<<<<<<<<<<<<
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ */
+  __Pyx_INCREF(__pyx_empty_tuple);
+  __pyx_v_state = __pyx_empty_tuple;
+
+  /* "(tree fragment)":6
+ *     cdef bint use_setstate
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)             # <<<<<<<<<<<<<<
+ *     if _dict is not None:
+ *         state += (_dict,)
+ */
+  __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v__dict = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":7
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+  __pyx_t_2 = (__pyx_v__dict != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":8
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ *         state += (_dict,)             # <<<<<<<<<<<<<<
+ *         use_setstate = True
+ *     else:
+ */
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_v__dict);
+    __Pyx_GIVEREF(__pyx_v__dict);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(10, 8, __pyx_L1_error);
+    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3));
+    __pyx_t_3 = 0;
+
+    /* "(tree fragment)":9
+ *     if _dict is not None:
+ *         state += (_dict,)
+ *         use_setstate = True             # <<<<<<<<<<<<<<
+ *     else:
+ *         use_setstate = False
+ */
+    __pyx_v_use_setstate = 1;
+
+    /* "(tree fragment)":7
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+    goto __pyx_L3;
+  }
+
+  /* "(tree fragment)":11
+ *         use_setstate = True
+ *     else:
+ *         use_setstate = False             # <<<<<<<<<<<<<<
+ *     if use_setstate:
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, None), state
+ */
+  /*else*/ {
+    __pyx_v_use_setstate = 0;
+  }
+  __pyx_L3:;
+
+  /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = False
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, None), state
+ *     else:
+ */
+  if (__pyx_v_use_setstate) {
+
+    /* "(tree fragment)":13
+ *         use_setstate = False
+ *     if use_setstate:
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, None), state             # <<<<<<<<<<<<<<
+ *     else:
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, state)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle__Tag); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_238750788);
+    __Pyx_GIVEREF(__pyx_int_238750788);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_238750788)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_3);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_3 = 0;
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_4;
+    __pyx_t_4 = 0;
+    goto __pyx_L0;
+
+    /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = False
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, None), state
+ *     else:
+ */
+  }
+
+  /* "(tree fragment)":15
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, None), state
+ *     else:
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, state)             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle__Tag__set_state(self, __pyx_state)
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle__Tag); if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_238750788);
+    __Pyx_GIVEREF(__pyx_int_238750788);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_238750788)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_4);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_4 = 0;
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_3;
+    __pyx_t_3 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._Tag.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_state);
+  __Pyx_XDECREF(__pyx_v__dict);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle__Tag__set_state(self, __pyx_state)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_Tag_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4_Tag_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_Tag_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_Tag_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 16, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 16, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 16, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._Tag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4_Tag_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__Tag *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_Tag_2__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc__Tag *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+  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("__setstate_cython__", 1);
+
+  /* "(tree fragment)":17
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle__Tag__set_state(self, __pyx_state)             # <<<<<<<<<<<<<<
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 17, __pyx_L1_error)
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle__Tag__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle__Tag__set_state(self, __pyx_state)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._Tag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":24
+ * cdef class _ConnectivityTag(_Tag):
+ * 
+ *   def __cinit__(self, user_tag):             # <<<<<<<<<<<<<<
+ *     self._user_tag = user_tag
+ * 
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_user_tag = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_user_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_user_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 24, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(24, 24, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_user_tag = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(24, 24, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ConnectivityTag.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ConnectivityTag___cinit__(((struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)__pyx_v_self), __pyx_v_user_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_16_ConnectivityTag___cinit__(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self, PyObject *__pyx_v_user_tag) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":25
+ * 
+ *   def __cinit__(self, user_tag):
+ *     self._user_tag = user_tag             # <<<<<<<<<<<<<<
+ * 
+ *   cdef ConnectivityEvent event(self, grpc_event c_event):
+ */
+  __Pyx_INCREF(__pyx_v_user_tag);
+  __Pyx_GIVEREF(__pyx_v_user_tag);
+  __Pyx_GOTREF(__pyx_v_self->_user_tag);
+  __Pyx_DECREF(__pyx_v_self->_user_tag);
+  __pyx_v_self->_user_tag = __pyx_v_user_tag;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":24
+ * cdef class _ConnectivityTag(_Tag):
+ * 
+ *   def __cinit__(self, user_tag):             # <<<<<<<<<<<<<<
+ *     self._user_tag = user_tag
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":27
+ *     self._user_tag = user_tag
+ * 
+ *   cdef ConnectivityEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     return ConnectivityEvent(c_event.type, c_event.success, self._user_tag)
+ * 
+ */
+
+struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_f_7_cython_6cygrpc_16_ConnectivityTag_event(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__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("event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":28
+ * 
+ *   cdef ConnectivityEvent event(self, grpc_event c_event):
+ *     return ConnectivityEvent(c_event.type, c_event.success, self._user_tag)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF((PyObject *)__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_c_event.type); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_c_event.success); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(24, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(24, 28, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(24, 28, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_user_tag);
+  __Pyx_GIVEREF(__pyx_v_self->_user_tag);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_self->_user_tag)) __PYX_ERR(24, 28, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = ((struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)__pyx_t_2);
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":27
+ *     self._user_tag = user_tag
+ * 
+ *   cdef ConnectivityEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     return ConnectivityEvent(c_event.type, c_event.success, self._user_tag)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._ConnectivityTag.event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *__pyx_f_7_cython_6cygrpc_16_ConnectivityTag_event__pyx_wrap_1(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  return __pyx_f_7_cython_6cygrpc_16_ConnectivityTag_event(__pyx_v_self, __pyx_v_c_event);
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":23
+ * cdef class _ConnectivityTag(_Tag):
+ * 
+ *   cdef readonly object _user_tag             # <<<<<<<<<<<<<<
+ * 
+ *   cdef ConnectivityEvent event(self, grpc_event c_event)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_9_user_tag_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_9_user_tag_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_9_user_tag___get__(((struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_9_user_tag___get__(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_user_tag);
+  __pyx_r = __pyx_v_self->_user_tag;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ConnectivityTag_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ConnectivityTag.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ConnectivityTag_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ConnectivityTag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ConnectivityTag_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ConnectivityTag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":33
+ * cdef class _RequestCallTag(_Tag):
+ * 
+ *   def __cinit__(self, user_tag):             # <<<<<<<<<<<<<<
+ *     self._user_tag = user_tag
+ *     self.call = None
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_15_RequestCallTag_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_15_RequestCallTag_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_user_tag = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_user_tag,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_user_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 33, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(24, 33, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_user_tag = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(24, 33, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._RequestCallTag.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_RequestCallTag___cinit__(((struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)__pyx_v_self), __pyx_v_user_tag);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_15_RequestCallTag___cinit__(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self, PyObject *__pyx_v_user_tag) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":34
+ * 
+ *   def __cinit__(self, user_tag):
+ *     self._user_tag = user_tag             # <<<<<<<<<<<<<<
+ *     self.call = None
+ *     self.call_details = None
+ */
+  __Pyx_INCREF(__pyx_v_user_tag);
+  __Pyx_GIVEREF(__pyx_v_user_tag);
+  __Pyx_GOTREF(__pyx_v_self->_user_tag);
+  __Pyx_DECREF(__pyx_v_self->_user_tag);
+  __pyx_v_self->_user_tag = __pyx_v_user_tag;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":35
+ *   def __cinit__(self, user_tag):
+ *     self._user_tag = user_tag
+ *     self.call = None             # <<<<<<<<<<<<<<
+ *     self.call_details = None
+ * 
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->call);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->call);
+  __pyx_v_self->call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)Py_None);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":36
+ *     self._user_tag = user_tag
+ *     self.call = None
+ *     self.call_details = None             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void prepare(self) except *:
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->call_details);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->call_details);
+  __pyx_v_self->call_details = ((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)Py_None);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":33
+ * cdef class _RequestCallTag(_Tag):
+ * 
+ *   def __cinit__(self, user_tag):             # <<<<<<<<<<<<<<
+ *     self._user_tag = user_tag
+ *     self.call = None
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":38
+ *     self.call_details = None
+ * 
+ *   cdef void prepare(self) except *:             # <<<<<<<<<<<<<<
+ *     self.call = Call()
+ *     self.call_details = CallDetails()
+ */
+
+static void __pyx_f_7_cython_6cygrpc_15_RequestCallTag_prepare(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("prepare", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":39
+ * 
+ *   cdef void prepare(self) except *:
+ *     self.call = Call()             # <<<<<<<<<<<<<<
+ *     self.call_details = CallDetails()
+ *     grpc_metadata_array_init(&self.c_invocation_metadata)
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call)); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->call);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->call);
+  __pyx_v_self->call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":40
+ *   cdef void prepare(self) except *:
+ *     self.call = Call()
+ *     self.call_details = CallDetails()             # <<<<<<<<<<<<<<
+ *     grpc_metadata_array_init(&self.c_invocation_metadata)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallDetails)); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 40, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->call_details);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->call_details);
+  __pyx_v_self->call_details = ((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":41
+ *     self.call = Call()
+ *     self.call_details = CallDetails()
+ *     grpc_metadata_array_init(&self.c_invocation_metadata)             # <<<<<<<<<<<<<<
+ * 
+ *   cdef RequestCallEvent event(self, grpc_event c_event):
+ */
+  grpc_metadata_array_init((&__pyx_v_self->c_invocation_metadata));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":38
+ *     self.call_details = None
+ * 
+ *   cdef void prepare(self) except *:             # <<<<<<<<<<<<<<
+ *     self.call = Call()
+ *     self.call_details = CallDetails()
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._RequestCallTag.prepare", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":43
+ *     grpc_metadata_array_init(&self.c_invocation_metadata)
+ * 
+ *   cdef RequestCallEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     cdef tuple invocation_metadata = _metadata(&self.c_invocation_metadata)
+ *     grpc_metadata_array_destroy(&self.c_invocation_metadata)
+ */
+
+struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_f_7_cython_6cygrpc_15_RequestCallTag_event(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  PyObject *__pyx_v_invocation_metadata = 0;
+  struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__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("event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":44
+ * 
+ *   cdef RequestCallEvent event(self, grpc_event c_event):
+ *     cdef tuple invocation_metadata = _metadata(&self.c_invocation_metadata)             # <<<<<<<<<<<<<<
+ *     grpc_metadata_array_destroy(&self.c_invocation_metadata)
+ *     return RequestCallEvent(
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__metadata((&__pyx_v_self->c_invocation_metadata)); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 44, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_invocation_metadata = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":45
+ *   cdef RequestCallEvent event(self, grpc_event c_event):
+ *     cdef tuple invocation_metadata = _metadata(&self.c_invocation_metadata)
+ *     grpc_metadata_array_destroy(&self.c_invocation_metadata)             # <<<<<<<<<<<<<<
+ *     return RequestCallEvent(
+ *         c_event.type, c_event.success, self._user_tag, self.call,
+ */
+  grpc_metadata_array_destroy((&__pyx_v_self->c_invocation_metadata));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":46
+ *     cdef tuple invocation_metadata = _metadata(&self.c_invocation_metadata)
+ *     grpc_metadata_array_destroy(&self.c_invocation_metadata)
+ *     return RequestCallEvent(             # <<<<<<<<<<<<<<
+ *         c_event.type, c_event.success, self._user_tag, self.call,
+ *         self.call_details, invocation_metadata)
+ */
+  __Pyx_XDECREF((PyObject *)__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":47
+ *     grpc_metadata_array_destroy(&self.c_invocation_metadata)
+ *     return RequestCallEvent(
+ *         c_event.type, c_event.success, self._user_tag, self.call,             # <<<<<<<<<<<<<<
+ *         self.call_details, invocation_metadata)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_c_event.type); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 47, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_c_event.success); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 47, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":46
+ *     cdef tuple invocation_metadata = _metadata(&self.c_invocation_metadata)
+ *     grpc_metadata_array_destroy(&self.c_invocation_metadata)
+ *     return RequestCallEvent(             # <<<<<<<<<<<<<<
+ *         c_event.type, c_event.success, self._user_tag, self.call,
+ *         self.call_details, invocation_metadata)
+ */
+  __pyx_t_3 = PyTuple_New(6); if (unlikely(!__pyx_t_3)) __PYX_ERR(24, 46, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(24, 46, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(24, 46, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_user_tag);
+  __Pyx_GIVEREF(__pyx_v_self->_user_tag);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_self->_user_tag)) __PYX_ERR(24, 46, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->call);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_self->call);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 3, ((PyObject *)__pyx_v_self->call))) __PYX_ERR(24, 46, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->call_details);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_self->call_details);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 4, ((PyObject *)__pyx_v_self->call_details))) __PYX_ERR(24, 46, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_invocation_metadata);
+  __Pyx_GIVEREF(__pyx_v_invocation_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_v_invocation_metadata)) __PYX_ERR(24, 46, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_RequestCallEvent), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 46, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = ((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)__pyx_t_2);
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":43
+ *     grpc_metadata_array_init(&self.c_invocation_metadata)
+ * 
+ *   cdef RequestCallEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     cdef tuple invocation_metadata = _metadata(&self.c_invocation_metadata)
+ *     grpc_metadata_array_destroy(&self.c_invocation_metadata)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._RequestCallTag.event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_invocation_metadata);
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_f_7_cython_6cygrpc_15_RequestCallTag_event__pyx_wrap_1(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  return __pyx_f_7_cython_6cygrpc_15_RequestCallTag_event(__pyx_v_self, __pyx_v_c_event);
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":30
+ * cdef class _RequestCallTag(_Tag):
+ * 
+ *   cdef readonly object _user_tag             # <<<<<<<<<<<<<<
+ *   cdef Call call
+ *   cdef CallDetails call_details
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_9_user_tag_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_9_user_tag_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_RequestCallTag_9_user_tag___get__(((struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_RequestCallTag_9_user_tag___get__(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_user_tag);
+  __pyx_r = __pyx_v_self->_user_tag;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15_RequestCallTag_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_RequestCallTag_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_RequestCallTag_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._RequestCallTag.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15_RequestCallTag_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._RequestCallTag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_RequestCallTag_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_RequestCallTag_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._RequestCallTag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":53
+ * cdef class _BatchOperationTag:
+ * 
+ *   def __cinit__(self, user_tag, operations, call):             # <<<<<<<<<<<<<<
+ *     self._user_tag = user_tag
+ *     self._operations = operations
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_user_tag = 0;
+  PyObject *__pyx_v_operations = 0;
+  PyObject *__pyx_v_call = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_user_tag,&__pyx_n_s_operations,&__pyx_n_s_call,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_user_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 53, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operations)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 53, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(24, 53, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 53, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(24, 53, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(24, 53, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+    }
+    __pyx_v_user_tag = values[0];
+    __pyx_v_operations = values[1];
+    __pyx_v_call = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(24, 53, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._BatchOperationTag.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_BatchOperationTag___cinit__(((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_self), __pyx_v_user_tag, __pyx_v_operations, __pyx_v_call);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_18_BatchOperationTag___cinit__(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self, PyObject *__pyx_v_user_tag, PyObject *__pyx_v_operations, PyObject *__pyx_v_call) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":54
+ * 
+ *   def __cinit__(self, user_tag, operations, call):
+ *     self._user_tag = user_tag             # <<<<<<<<<<<<<<
+ *     self._operations = operations
+ *     self._retained_call = call
+ */
+  __Pyx_INCREF(__pyx_v_user_tag);
+  __Pyx_GIVEREF(__pyx_v_user_tag);
+  __Pyx_GOTREF(__pyx_v_self->_user_tag);
+  __Pyx_DECREF(__pyx_v_self->_user_tag);
+  __pyx_v_self->_user_tag = __pyx_v_user_tag;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":55
+ *   def __cinit__(self, user_tag, operations, call):
+ *     self._user_tag = user_tag
+ *     self._operations = operations             # <<<<<<<<<<<<<<
+ *     self._retained_call = call
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_operations);
+  __Pyx_GIVEREF(__pyx_v_operations);
+  __Pyx_GOTREF(__pyx_v_self->_operations);
+  __Pyx_DECREF(__pyx_v_self->_operations);
+  __pyx_v_self->_operations = __pyx_v_operations;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":56
+ *     self._user_tag = user_tag
+ *     self._operations = operations
+ *     self._retained_call = call             # <<<<<<<<<<<<<<
+ * 
+ *   cdef void prepare(self) except *:
+ */
+  __Pyx_INCREF(__pyx_v_call);
+  __Pyx_GIVEREF(__pyx_v_call);
+  __Pyx_GOTREF(__pyx_v_self->_retained_call);
+  __Pyx_DECREF(__pyx_v_self->_retained_call);
+  __pyx_v_self->_retained_call = __pyx_v_call;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":53
+ * cdef class _BatchOperationTag:
+ * 
+ *   def __cinit__(self, user_tag, operations, call):             # <<<<<<<<<<<<<<
+ *     self._user_tag = user_tag
+ *     self._operations = operations
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":58
+ *     self._retained_call = call
+ * 
+ *   cdef void prepare(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef Operation operation
+ *     self.c_nops = 0 if self._operations is None else len(self._operations)
+ */
+
+static void __pyx_f_7_cython_6cygrpc_18_BatchOperationTag_prepare(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_operation = 0;
+  PyObject *__pyx_v_index = NULL;
+  __Pyx_RefNannyDeclarations
+  size_t __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  Py_ssize_t __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  PyObject *__pyx_t_7 = NULL;
+  grpc_op __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("prepare", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":60
+ *   cdef void prepare(self) except *:
+ *     cdef Operation operation
+ *     self.c_nops = 0 if self._operations is None else len(self._operations)             # <<<<<<<<<<<<<<
+ *     if 0 < self.c_nops:
+ *       self.c_ops = <grpc_op *>gpr_malloc(sizeof(grpc_op) * self.c_nops)
+ */
+  __pyx_t_2 = (__pyx_v_self->_operations == Py_None);
+  if (__pyx_t_2) {
+    __pyx_t_1 = 0;
+  } else {
+    __pyx_t_3 = __pyx_v_self->_operations;
+    __Pyx_INCREF(__pyx_t_3);
+    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(24, 60, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_1 = __pyx_t_4;
+  }
+  __pyx_v_self->c_nops = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":61
+ *     cdef Operation operation
+ *     self.c_nops = 0 if self._operations is None else len(self._operations)
+ *     if 0 < self.c_nops:             # <<<<<<<<<<<<<<
+ *       self.c_ops = <grpc_op *>gpr_malloc(sizeof(grpc_op) * self.c_nops)
+ *       for index, operation in enumerate(self._operations):
+ */
+  __pyx_t_2 = (0 < __pyx_v_self->c_nops);
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":62
+ *     self.c_nops = 0 if self._operations is None else len(self._operations)
+ *     if 0 < self.c_nops:
+ *       self.c_ops = <grpc_op *>gpr_malloc(sizeof(grpc_op) * self.c_nops)             # <<<<<<<<<<<<<<
+ *       for index, operation in enumerate(self._operations):
+ *         operation.c()
+ */
+    __pyx_v_self->c_ops = ((grpc_op *)gpr_malloc(((sizeof(grpc_op)) * __pyx_v_self->c_nops)));
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":63
+ *     if 0 < self.c_nops:
+ *       self.c_ops = <grpc_op *>gpr_malloc(sizeof(grpc_op) * self.c_nops)
+ *       for index, operation in enumerate(self._operations):             # <<<<<<<<<<<<<<
+ *         operation.c()
+ *         self.c_ops[index] = operation.c_op
+ */
+    __Pyx_INCREF(__pyx_int_0);
+    __pyx_t_3 = __pyx_int_0;
+    if (likely(PyList_CheckExact(__pyx_v_self->_operations)) || PyTuple_CheckExact(__pyx_v_self->_operations)) {
+      __pyx_t_5 = __pyx_v_self->_operations; __Pyx_INCREF(__pyx_t_5);
+      __pyx_t_4 = 0;
+      __pyx_t_6 = NULL;
+    } else {
+      __pyx_t_4 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_self->_operations); if (unlikely(!__pyx_t_5)) __PYX_ERR(24, 63, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(24, 63, __pyx_L1_error)
+    }
+    for (;;) {
+      if (likely(!__pyx_t_6)) {
+        if (likely(PyList_CheckExact(__pyx_t_5))) {
+          {
+            Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_5);
+            #if !CYTHON_ASSUME_SAFE_MACROS
+            if (unlikely((__pyx_temp < 0))) __PYX_ERR(24, 63, __pyx_L1_error)
+            #endif
+            if (__pyx_t_4 >= __pyx_temp) break;
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          __pyx_t_7 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_7); __pyx_t_4++; if (unlikely((0 < 0))) __PYX_ERR(24, 63, __pyx_L1_error)
+          #else
+          __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_7)) __PYX_ERR(24, 63, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          #endif
+        } else {
+          {
+            Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_5);
+            #if !CYTHON_ASSUME_SAFE_MACROS
+            if (unlikely((__pyx_temp < 0))) __PYX_ERR(24, 63, __pyx_L1_error)
+            #endif
+            if (__pyx_t_4 >= __pyx_temp) break;
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_4); __Pyx_INCREF(__pyx_t_7); __pyx_t_4++; if (unlikely((0 < 0))) __PYX_ERR(24, 63, __pyx_L1_error)
+          #else
+          __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_5, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_7)) __PYX_ERR(24, 63, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          #endif
+        }
+      } else {
+        __pyx_t_7 = __pyx_t_6(__pyx_t_5);
+        if (unlikely(!__pyx_t_7)) {
+          PyObject* exc_type = PyErr_Occurred();
+          if (exc_type) {
+            if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+            else __PYX_ERR(24, 63, __pyx_L1_error)
+          }
+          break;
+        }
+        __Pyx_GOTREF(__pyx_t_7);
+      }
+      if (!(likely(((__pyx_t_7) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_7, __pyx_ptype_7_cython_6cygrpc_Operation))))) __PYX_ERR(24, 63, __pyx_L1_error)
+      __Pyx_XDECREF_SET(__pyx_v_operation, ((struct __pyx_obj_7_cython_6cygrpc_Operation *)__pyx_t_7));
+      __pyx_t_7 = 0;
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_3);
+      __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(24, 63, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3);
+      __pyx_t_3 = __pyx_t_7;
+      __pyx_t_7 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":64
+ *       self.c_ops = <grpc_op *>gpr_malloc(sizeof(grpc_op) * self.c_nops)
+ *       for index, operation in enumerate(self._operations):
+ *         operation.c()             # <<<<<<<<<<<<<<
+ *         self.c_ops[index] = operation.c_op
+ * 
+ */
+      ((struct __pyx_vtabstruct_7_cython_6cygrpc_Operation *)__pyx_v_operation->__pyx_vtab)->c(__pyx_v_operation); if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 64, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":65
+ *       for index, operation in enumerate(self._operations):
+ *         operation.c()
+ *         self.c_ops[index] = operation.c_op             # <<<<<<<<<<<<<<
+ * 
+ *   cdef BatchOperationEvent event(self, grpc_event c_event):
+ */
+      __pyx_t_8 = __pyx_v_operation->c_op;
+      __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(24, 65, __pyx_L1_error)
+      (__pyx_v_self->c_ops[__pyx_t_9]) = __pyx_t_8;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":63
+ *     if 0 < self.c_nops:
+ *       self.c_ops = <grpc_op *>gpr_malloc(sizeof(grpc_op) * self.c_nops)
+ *       for index, operation in enumerate(self._operations):             # <<<<<<<<<<<<<<
+ *         operation.c()
+ *         self.c_ops[index] = operation.c_op
+ */
+    }
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":61
+ *     cdef Operation operation
+ *     self.c_nops = 0 if self._operations is None else len(self._operations)
+ *     if 0 < self.c_nops:             # <<<<<<<<<<<<<<
+ *       self.c_ops = <grpc_op *>gpr_malloc(sizeof(grpc_op) * self.c_nops)
+ *       for index, operation in enumerate(self._operations):
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":58
+ *     self._retained_call = call
+ * 
+ *   cdef void prepare(self) except *:             # <<<<<<<<<<<<<<
+ *     cdef Operation operation
+ *     self.c_nops = 0 if self._operations is None else len(self._operations)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_cython.cygrpc._BatchOperationTag.prepare", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_operation);
+  __Pyx_XDECREF(__pyx_v_index);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":67
+ *         self.c_ops[index] = operation.c_op
+ * 
+ *   cdef BatchOperationEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     cdef Operation operation
+ *     if 0 < self.c_nops:
+ */
+
+struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_f_7_cython_6cygrpc_18_BatchOperationTag_event(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_operation = 0;
+  struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *(*__pyx_t_4)(PyObject *);
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":69
+ *   cdef BatchOperationEvent event(self, grpc_event c_event):
+ *     cdef Operation operation
+ *     if 0 < self.c_nops:             # <<<<<<<<<<<<<<
+ *       for operation in self._operations:
+ *         operation.un_c()
+ */
+  __pyx_t_1 = (0 < __pyx_v_self->c_nops);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":70
+ *     cdef Operation operation
+ *     if 0 < self.c_nops:
+ *       for operation in self._operations:             # <<<<<<<<<<<<<<
+ *         operation.un_c()
+ *       gpr_free(self.c_ops)
+ */
+    if (likely(PyList_CheckExact(__pyx_v_self->_operations)) || PyTuple_CheckExact(__pyx_v_self->_operations)) {
+      __pyx_t_2 = __pyx_v_self->_operations; __Pyx_INCREF(__pyx_t_2);
+      __pyx_t_3 = 0;
+      __pyx_t_4 = NULL;
+    } else {
+      __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self->_operations); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 70, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(24, 70, __pyx_L1_error)
+    }
+    for (;;) {
+      if (likely(!__pyx_t_4)) {
+        if (likely(PyList_CheckExact(__pyx_t_2))) {
+          {
+            Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2);
+            #if !CYTHON_ASSUME_SAFE_MACROS
+            if (unlikely((__pyx_temp < 0))) __PYX_ERR(24, 70, __pyx_L1_error)
+            #endif
+            if (__pyx_t_3 >= __pyx_temp) break;
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(24, 70, __pyx_L1_error)
+          #else
+          __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(24, 70, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_5);
+          #endif
+        } else {
+          {
+            Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2);
+            #if !CYTHON_ASSUME_SAFE_MACROS
+            if (unlikely((__pyx_temp < 0))) __PYX_ERR(24, 70, __pyx_L1_error)
+            #endif
+            if (__pyx_t_3 >= __pyx_temp) break;
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(24, 70, __pyx_L1_error)
+          #else
+          __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(24, 70, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_5);
+          #endif
+        }
+      } else {
+        __pyx_t_5 = __pyx_t_4(__pyx_t_2);
+        if (unlikely(!__pyx_t_5)) {
+          PyObject* exc_type = PyErr_Occurred();
+          if (exc_type) {
+            if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+            else __PYX_ERR(24, 70, __pyx_L1_error)
+          }
+          break;
+        }
+        __Pyx_GOTREF(__pyx_t_5);
+      }
+      if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_7_cython_6cygrpc_Operation))))) __PYX_ERR(24, 70, __pyx_L1_error)
+      __Pyx_XDECREF_SET(__pyx_v_operation, ((struct __pyx_obj_7_cython_6cygrpc_Operation *)__pyx_t_5));
+      __pyx_t_5 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":71
+ *     if 0 < self.c_nops:
+ *       for operation in self._operations:
+ *         operation.un_c()             # <<<<<<<<<<<<<<
+ *       gpr_free(self.c_ops)
+ *       return BatchOperationEvent(
+ */
+      ((struct __pyx_vtabstruct_7_cython_6cygrpc_Operation *)__pyx_v_operation->__pyx_vtab)->un_c(__pyx_v_operation); if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 71, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":70
+ *     cdef Operation operation
+ *     if 0 < self.c_nops:
+ *       for operation in self._operations:             # <<<<<<<<<<<<<<
+ *         operation.un_c()
+ *       gpr_free(self.c_ops)
+ */
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":72
+ *       for operation in self._operations:
+ *         operation.un_c()
+ *       gpr_free(self.c_ops)             # <<<<<<<<<<<<<<
+ *       return BatchOperationEvent(
+ *           c_event.type, c_event.success, self._user_tag, self._operations)
+ */
+    gpr_free(__pyx_v_self->c_ops);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":73
+ *         operation.un_c()
+ *       gpr_free(self.c_ops)
+ *       return BatchOperationEvent(             # <<<<<<<<<<<<<<
+ *           c_event.type, c_event.success, self._user_tag, self._operations)
+ *     else:
+ */
+    __Pyx_XDECREF((PyObject *)__pyx_r);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":74
+ *       gpr_free(self.c_ops)
+ *       return BatchOperationEvent(
+ *           c_event.type, c_event.success, self._user_tag, self._operations)             # <<<<<<<<<<<<<<
+ *     else:
+ *       return BatchOperationEvent(
+ */
+    __pyx_t_2 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_c_event.type); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 74, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_c_event.success); if (unlikely(!__pyx_t_5)) __PYX_ERR(24, 74, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":73
+ *         operation.un_c()
+ *       gpr_free(self.c_ops)
+ *       return BatchOperationEvent(             # <<<<<<<<<<<<<<
+ *           c_event.type, c_event.success, self._user_tag, self._operations)
+ *     else:
+ */
+    __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(24, 73, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GIVEREF(__pyx_t_2);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(24, 73, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_5);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5)) __PYX_ERR(24, 73, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_self->_user_tag);
+    __Pyx_GIVEREF(__pyx_v_self->_user_tag);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_self->_user_tag)) __PYX_ERR(24, 73, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_self->_operations);
+    __Pyx_GIVEREF(__pyx_v_self->_operations);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_v_self->_operations)) __PYX_ERR(24, 73, __pyx_L1_error);
+    __pyx_t_2 = 0;
+    __pyx_t_5 = 0;
+    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(24, 73, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_r = ((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_t_5);
+    __pyx_t_5 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":69
+ *   cdef BatchOperationEvent event(self, grpc_event c_event):
+ *     cdef Operation operation
+ *     if 0 < self.c_nops:             # <<<<<<<<<<<<<<
+ *       for operation in self._operations:
+ *         operation.un_c()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":76
+ *           c_event.type, c_event.success, self._user_tag, self._operations)
+ *     else:
+ *       return BatchOperationEvent(             # <<<<<<<<<<<<<<
+ *           c_event.type, c_event.success, self._user_tag, ())
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF((PyObject *)__pyx_r);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":77
+ *     else:
+ *       return BatchOperationEvent(
+ *           c_event.type, c_event.success, self._user_tag, ())             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __pyx_t_5 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_c_event.type); if (unlikely(!__pyx_t_5)) __PYX_ERR(24, 77, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_c_event.success); if (unlikely(!__pyx_t_6)) __PYX_ERR(24, 77, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":76
+ *           c_event.type, c_event.success, self._user_tag, self._operations)
+ *     else:
+ *       return BatchOperationEvent(             # <<<<<<<<<<<<<<
+ *           c_event.type, c_event.success, self._user_tag, ())
+ * 
+ */
+    __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 76, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_5);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_5)) __PYX_ERR(24, 76, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_6);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_6)) __PYX_ERR(24, 76, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_self->_user_tag);
+    __Pyx_GIVEREF(__pyx_v_self->_user_tag);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->_user_tag)) __PYX_ERR(24, 76, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_empty_tuple);
+    __Pyx_GIVEREF(__pyx_empty_tuple);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_empty_tuple)) __PYX_ERR(24, 76, __pyx_L1_error);
+    __pyx_t_5 = 0;
+    __pyx_t_6 = 0;
+    __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent), __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(24, 76, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_r = ((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)__pyx_t_6);
+    __pyx_t_6 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":67
+ *         self.c_ops[index] = operation.c_op
+ * 
+ *   cdef BatchOperationEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     cdef Operation operation
+ *     if 0 < self.c_nops:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc._BatchOperationTag.event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_operation);
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *__pyx_f_7_cython_6cygrpc_18_BatchOperationTag_event__pyx_wrap_1(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  return __pyx_f_7_cython_6cygrpc_18_BatchOperationTag_event(__pyx_v_self, __pyx_v_c_event);
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":42
+ * 
+ *   cdef object _user_tag
+ *   cdef readonly object _operations             # <<<<<<<<<<<<<<
+ *   cdef readonly object _retained_call
+ *   cdef grpc_op *c_ops
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_11_operations_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_11_operations_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_11_operations___get__(((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_11_operations___get__(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_operations);
+  __pyx_r = __pyx_v_self->_operations;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":43
+ *   cdef object _user_tag
+ *   cdef readonly object _operations
+ *   cdef readonly object _retained_call             # <<<<<<<<<<<<<<
+ *   cdef grpc_op *c_ops
+ *   cdef size_t c_nops
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_14_retained_call_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_14_retained_call_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_14_retained_call___get__(((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_14_retained_call___get__(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_retained_call);
+  __pyx_r = __pyx_v_self->_retained_call;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18_BatchOperationTag_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._BatchOperationTag.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18_BatchOperationTag_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._BatchOperationTag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_BatchOperationTag_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._BatchOperationTag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":82
+ * cdef class _ServerShutdownTag(_Tag):
+ * 
+ *   def __cinit__(self, user_tag, shutting_down_server):             # <<<<<<<<<<<<<<
+ *     self._user_tag = user_tag
+ *     self._shutting_down_server = shutting_down_server
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_user_tag = 0;
+  PyObject *__pyx_v_shutting_down_server = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_user_tag,&__pyx_n_s_shutting_down_server,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_user_tag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 82, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_shutting_down_server)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(24, 82, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(24, 82, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(24, 82, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_user_tag = values[0];
+    __pyx_v_shutting_down_server = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(24, 82, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServerShutdownTag.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag___cinit__(((struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)__pyx_v_self), __pyx_v_user_tag, __pyx_v_shutting_down_server);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag___cinit__(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self, PyObject *__pyx_v_user_tag, PyObject *__pyx_v_shutting_down_server) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":83
+ * 
+ *   def __cinit__(self, user_tag, shutting_down_server):
+ *     self._user_tag = user_tag             # <<<<<<<<<<<<<<
+ *     self._shutting_down_server = shutting_down_server
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_user_tag);
+  __Pyx_GIVEREF(__pyx_v_user_tag);
+  __Pyx_GOTREF(__pyx_v_self->_user_tag);
+  __Pyx_DECREF(__pyx_v_self->_user_tag);
+  __pyx_v_self->_user_tag = __pyx_v_user_tag;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":84
+ *   def __cinit__(self, user_tag, shutting_down_server):
+ *     self._user_tag = user_tag
+ *     self._shutting_down_server = shutting_down_server             # <<<<<<<<<<<<<<
+ * 
+ *   cdef ServerShutdownEvent event(self, grpc_event c_event):
+ */
+  if (!(likely(((__pyx_v_shutting_down_server) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_shutting_down_server, __pyx_ptype_7_cython_6cygrpc_Server))))) __PYX_ERR(24, 84, __pyx_L1_error)
+  __pyx_t_1 = __pyx_v_shutting_down_server;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_shutting_down_server);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_shutting_down_server);
+  __pyx_v_self->_shutting_down_server = ((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":82
+ * cdef class _ServerShutdownTag(_Tag):
+ * 
+ *   def __cinit__(self, user_tag, shutting_down_server):             # <<<<<<<<<<<<<<
+ *     self._user_tag = user_tag
+ *     self._shutting_down_server = shutting_down_server
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._ServerShutdownTag.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":86
+ *     self._shutting_down_server = shutting_down_server
+ * 
+ *   cdef ServerShutdownEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     self._shutting_down_server.notify_shutdown_complete()
+ *     return ServerShutdownEvent(c_event.type, c_event.success, self._user_tag)
+ */
+
+struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_f_7_cython_6cygrpc_18_ServerShutdownTag_event(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__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("event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":87
+ * 
+ *   cdef ServerShutdownEvent event(self, grpc_event c_event):
+ *     self._shutting_down_server.notify_shutdown_complete()             # <<<<<<<<<<<<<<
+ *     return ServerShutdownEvent(c_event.type, c_event.success, self._user_tag)
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_Server *)__pyx_v_self->_shutting_down_server->__pyx_vtab)->notify_shutdown_complete(__pyx_v_self->_shutting_down_server); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 87, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":88
+ *   cdef ServerShutdownEvent event(self, grpc_event c_event):
+ *     self._shutting_down_server.notify_shutdown_complete()
+ *     return ServerShutdownEvent(c_event.type, c_event.success, self._user_tag)             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF((PyObject *)__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_completion_type(__pyx_v_c_event.type); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_c_event.success); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(24, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(24, 88, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(24, 88, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_user_tag);
+  __Pyx_GIVEREF(__pyx_v_self->_user_tag);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_self->_user_tag)) __PYX_ERR(24, 88, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(24, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = ((struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)__pyx_t_2);
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pyx.pxi":86
+ *     self._shutting_down_server = shutting_down_server
+ * 
+ *   cdef ServerShutdownEvent event(self, grpc_event c_event):             # <<<<<<<<<<<<<<
+ *     self._shutting_down_server.notify_shutdown_complete()
+ *     return ServerShutdownEvent(c_event.type, c_event.success, self._user_tag)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._ServerShutdownTag.event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *__pyx_f_7_cython_6cygrpc_18_ServerShutdownTag_event__pyx_wrap_1(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self, grpc_event __pyx_v_c_event) {
+  return __pyx_f_7_cython_6cygrpc_18_ServerShutdownTag_event(__pyx_v_self, __pyx_v_c_event);
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":53
+ * cdef class _ServerShutdownTag(_Tag):
+ * 
+ *   cdef readonly object _user_tag             # <<<<<<<<<<<<<<
+ *   # This allows CompletionQueue to notify the Python Server object that the
+ *   # underlying GRPC core server has shutdown
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_9_user_tag_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_9_user_tag_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_9_user_tag___get__(((struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_9_user_tag___get__(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_user_tag);
+  __pyx_r = __pyx_v_self->_user_tag;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/tag.pxd.pxi":56
+ *   # This allows CompletionQueue to notify the Python Server object that the
+ *   # underlying GRPC core server has shutdown
+ *   cdef readonly Server _shutting_down_server             # <<<<<<<<<<<<<<
+ * 
+ *   cdef ServerShutdownEvent event(self, grpc_event c_event)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_21_shutting_down_server_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_21_shutting_down_server_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_21_shutting_down_server___get__(((struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_21_shutting_down_server___get__(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->_shutting_down_server);
+  __pyx_r = ((PyObject *)__pyx_v_self->_shutting_down_server);
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18_ServerShutdownTag_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServerShutdownTag.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18_ServerShutdownTag_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServerShutdownTag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ServerShutdownTag_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServerShutdownTag.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":16
+ * 
+ * 
+ * cdef gpr_timespec _timespec_from_time(object time) except *:             # <<<<<<<<<<<<<<
+ *   if time is None:
+ *     return gpr_inf_future(GPR_CLOCK_REALTIME)
+ */
+
+static gpr_timespec __pyx_f_7_cython_6cygrpc__timespec_from_time(PyObject *__pyx_v_time) {
+  gpr_timespec __pyx_r;
+  int __pyx_t_1;
+  double __pyx_t_2;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":17
+ * 
+ * cdef gpr_timespec _timespec_from_time(object time) except *:
+ *   if time is None:             # <<<<<<<<<<<<<<
+ *     return gpr_inf_future(GPR_CLOCK_REALTIME)
+ *   else:
+ */
+  __pyx_t_1 = (__pyx_v_time == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":18
+ * cdef gpr_timespec _timespec_from_time(object time) except *:
+ *   if time is None:
+ *     return gpr_inf_future(GPR_CLOCK_REALTIME)             # <<<<<<<<<<<<<<
+ *   else:
+ *     return gpr_time_from_nanos(
+ */
+    __pyx_r = gpr_inf_future(GPR_CLOCK_REALTIME);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":17
+ * 
+ * cdef gpr_timespec _timespec_from_time(object time) except *:
+ *   if time is None:             # <<<<<<<<<<<<<<
+ *     return gpr_inf_future(GPR_CLOCK_REALTIME)
+ *   else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":20
+ *     return gpr_inf_future(GPR_CLOCK_REALTIME)
+ *   else:
+ *     return gpr_time_from_nanos(             # <<<<<<<<<<<<<<
+ *       <int64_t>(<double>time * GPR_NS_PER_SEC),
+ *       GPR_CLOCK_REALTIME,
+ */
+  /*else*/ {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":21
+ *   else:
+ *     return gpr_time_from_nanos(
+ *       <int64_t>(<double>time * GPR_NS_PER_SEC),             # <<<<<<<<<<<<<<
+ *       GPR_CLOCK_REALTIME,
+ *     )
+ */
+    __pyx_t_2 = __pyx_PyFloat_AsDouble(__pyx_v_time); if (unlikely((__pyx_t_2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(25, 21, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":20
+ *     return gpr_inf_future(GPR_CLOCK_REALTIME)
+ *   else:
+ *     return gpr_time_from_nanos(             # <<<<<<<<<<<<<<
+ *       <int64_t>(<double>time * GPR_NS_PER_SEC),
+ *       GPR_CLOCK_REALTIME,
+ */
+    __pyx_r = gpr_time_from_nanos(((__pyx_t_7_cython_6cygrpc_int64_t)(((double)__pyx_t_2) * GPR_NS_PER_SEC)), GPR_CLOCK_REALTIME);
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":16
+ * 
+ * 
+ * cdef gpr_timespec _timespec_from_time(object time) except *:             # <<<<<<<<<<<<<<
+ *   if time is None:
+ *     return gpr_inf_future(GPR_CLOCK_REALTIME)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._timespec_from_time", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_pretend_to_initialize(&__pyx_r);
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":26
+ * 
+ * 
+ * cdef double _time_from_timespec(gpr_timespec timespec) except *:             # <<<<<<<<<<<<<<
+ *   cdef gpr_timespec real_timespec = gpr_convert_clock_type(
+ *       timespec, GPR_CLOCK_REALTIME)
+ */
+
+static double __pyx_f_7_cython_6cygrpc__time_from_timespec(gpr_timespec __pyx_v_timespec) {
+  gpr_timespec __pyx_v_real_timespec;
+  double __pyx_r;
+  double __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":27
+ * 
+ * cdef double _time_from_timespec(gpr_timespec timespec) except *:
+ *   cdef gpr_timespec real_timespec = gpr_convert_clock_type(             # <<<<<<<<<<<<<<
+ *       timespec, GPR_CLOCK_REALTIME)
+ *   return gpr_timespec_to_micros(real_timespec) / GPR_US_PER_SEC
+ */
+  __pyx_v_real_timespec = gpr_convert_clock_type(__pyx_v_timespec, GPR_CLOCK_REALTIME);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":29
+ *   cdef gpr_timespec real_timespec = gpr_convert_clock_type(
+ *       timespec, GPR_CLOCK_REALTIME)
+ *   return gpr_timespec_to_micros(real_timespec) / GPR_US_PER_SEC             # <<<<<<<<<<<<<<
+ */
+  __pyx_t_1 = gpr_timespec_to_micros(__pyx_v_real_timespec);
+  if (unlikely(GPR_US_PER_SEC == 0)) {
+    PyErr_SetString(PyExc_ZeroDivisionError, "float division");
+    __PYX_ERR(25, 29, __pyx_L1_error)
+  }
+  __pyx_r = (__pyx_t_1 / ((double)GPR_US_PER_SEC));
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/time.pyx.pxi":26
+ * 
+ * 
+ * cdef double _time_from_timespec(gpr_timespec timespec) except *:             # <<<<<<<<<<<<<<
+ *   cdef gpr_timespec real_timespec = gpr_convert_clock_type(
+ *       timespec, GPR_CLOCK_REALTIME)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._time_from_timespec", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":16
+ * 
+ * # TODO(https://github.com/grpc/grpc/issues/15662): Reform this.
+ * cdef void* _copy_pointer(void* pointer) noexcept:             # <<<<<<<<<<<<<<
+ *   return pointer
+ * 
+ */
+
+static void *__pyx_f_7_cython_6cygrpc__copy_pointer(void *__pyx_v_pointer) {
+  void *__pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":17
+ * # TODO(https://github.com/grpc/grpc/issues/15662): Reform this.
+ * cdef void* _copy_pointer(void* pointer) noexcept:
+ *   return pointer             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_pointer;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":16
+ * 
+ * # TODO(https://github.com/grpc/grpc/issues/15662): Reform this.
+ * cdef void* _copy_pointer(void* pointer) noexcept:             # <<<<<<<<<<<<<<
+ *   return pointer
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":21
+ * 
+ * # TODO(https://github.com/grpc/grpc/issues/15662): Reform this.
+ * cdef void _destroy_pointer(void* pointer) noexcept:             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc__destroy_pointer(CYTHON_UNUSED void *__pyx_v_pointer) {
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":25
+ * 
+ * 
+ * cdef int _compare_pointer(void* first_pointer, void* second_pointer) noexcept:             # <<<<<<<<<<<<<<
+ *   if first_pointer < second_pointer:
+ *     return -1
+ */
+
+static int __pyx_f_7_cython_6cygrpc__compare_pointer(void *__pyx_v_first_pointer, void *__pyx_v_second_pointer) {
+  int __pyx_r;
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":26
+ * 
+ * cdef int _compare_pointer(void* first_pointer, void* second_pointer) noexcept:
+ *   if first_pointer < second_pointer:             # <<<<<<<<<<<<<<
+ *     return -1
+ *   elif first_pointer > second_pointer:
+ */
+  __pyx_t_1 = (__pyx_v_first_pointer < __pyx_v_second_pointer);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":27
+ * cdef int _compare_pointer(void* first_pointer, void* second_pointer) noexcept:
+ *   if first_pointer < second_pointer:
+ *     return -1             # <<<<<<<<<<<<<<
+ *   elif first_pointer > second_pointer:
+ *     return 1
+ */
+    __pyx_r = -1;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":26
+ * 
+ * cdef int _compare_pointer(void* first_pointer, void* second_pointer) noexcept:
+ *   if first_pointer < second_pointer:             # <<<<<<<<<<<<<<
+ *     return -1
+ *   elif first_pointer > second_pointer:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":28
+ *   if first_pointer < second_pointer:
+ *     return -1
+ *   elif first_pointer > second_pointer:             # <<<<<<<<<<<<<<
+ *     return 1
+ *   else:
+ */
+  __pyx_t_1 = (__pyx_v_first_pointer > __pyx_v_second_pointer);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":29
+ *     return -1
+ *   elif first_pointer > second_pointer:
+ *     return 1             # <<<<<<<<<<<<<<
+ *   else:
+ *     return 0
+ */
+    __pyx_r = 1;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":28
+ *   if first_pointer < second_pointer:
+ *     return -1
+ *   elif first_pointer > second_pointer:             # <<<<<<<<<<<<<<
+ *     return 1
+ *   else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":31
+ *     return 1
+ *   else:
+ *     return 0             # <<<<<<<<<<<<<<
+ * 
+ * cdef grpc_arg_pointer_vtable default_vtable
+ */
+  /*else*/ {
+    __pyx_r = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":25
+ * 
+ * 
+ * cdef int _compare_pointer(void* first_pointer, void* second_pointer) noexcept:             # <<<<<<<<<<<<<<
+ *   if first_pointer < second_pointer:
+ *     return -1
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":16
+ * 
+ * 
+ * cdef object _custom_op_on_c_call(int op, grpc_call *call):             # <<<<<<<<<<<<<<
+ *   raise NotImplementedError("No custom hooks are implemented")
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__custom_op_on_c_call(CYTHON_UNUSED int __pyx_v_op, CYTHON_UNUSED grpc_call *__pyx_v_call) {
+  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("_custom_op_on_c_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":17
+ * 
+ * cdef object _custom_op_on_c_call(int op, grpc_call *call):
+ *   raise NotImplementedError("No custom hooks are implemented")             # <<<<<<<<<<<<<<
+ * 
+ * def install_context_from_request_call_event(RequestCallEvent event):
+ */
+  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_NotImplementedError, __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(26, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __PYX_ERR(26, 17, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":16
+ * 
+ * 
+ * cdef object _custom_op_on_c_call(int op, grpc_call *call):             # <<<<<<<<<<<<<<
+ *   raise NotImplementedError("No custom hooks are implemented")
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._custom_op_on_c_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":19
+ *   raise NotImplementedError("No custom hooks are implemented")
+ * 
+ * def install_context_from_request_call_event(RequestCallEvent event):             # <<<<<<<<<<<<<<
+ *   maybe_save_server_trace_context(event)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_55install_context_from_request_call_event(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_55install_context_from_request_call_event = {"install_context_from_request_call_event", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_55install_context_from_request_call_event, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_55install_context_from_request_call_event(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_event = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("install_context_from_request_call_event (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_event,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(26, 19, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "install_context_from_request_call_event") < 0)) __PYX_ERR(26, 19, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_event = ((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("install_context_from_request_call_event", 1, 1, 1, __pyx_nargs); __PYX_ERR(26, 19, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.install_context_from_request_call_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_event), __pyx_ptype_7_cython_6cygrpc_RequestCallEvent, 1, "event", 0))) __PYX_ERR(26, 19, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_54install_context_from_request_call_event(__pyx_self, __pyx_v_event);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_54install_context_from_request_call_event(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_event) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("install_context_from_request_call_event", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":20
+ * 
+ * def install_context_from_request_call_event(RequestCallEvent event):
+ *   maybe_save_server_trace_context(event)             # <<<<<<<<<<<<<<
+ * 
+ * def install_context_from_request_call_event_aio(GrpcCallWrapper event):
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_maybe_save_server_trace_context); if (unlikely(!__pyx_t_2)) __PYX_ERR(26, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, ((PyObject *)__pyx_v_event)};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(26, 20, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":19
+ *   raise NotImplementedError("No custom hooks are implemented")
+ * 
+ * def install_context_from_request_call_event(RequestCallEvent event):             # <<<<<<<<<<<<<<
+ *   maybe_save_server_trace_context(event)
+ * 
+ */
+
+  /* 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("_cython.cygrpc.install_context_from_request_call_event", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":22
+ *   maybe_save_server_trace_context(event)
+ * 
+ * def install_context_from_request_call_event_aio(GrpcCallWrapper event):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_57install_context_from_request_call_event_aio(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_57install_context_from_request_call_event_aio = {"install_context_from_request_call_event_aio", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_57install_context_from_request_call_event_aio, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_57install_context_from_request_call_event_aio(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_event = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("install_context_from_request_call_event_aio (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_event,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(26, 22, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "install_context_from_request_call_event_aio") < 0)) __PYX_ERR(26, 22, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_event = ((struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("install_context_from_request_call_event_aio", 1, 1, 1, __pyx_nargs); __PYX_ERR(26, 22, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.install_context_from_request_call_event_aio", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_event), __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper, 1, "event", 0))) __PYX_ERR(26, 22, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_56install_context_from_request_call_event_aio(__pyx_self, __pyx_v_event);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_56install_context_from_request_call_event_aio(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_event) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("install_context_from_request_call_event_aio", 1);
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":25
+ *   pass
+ * 
+ * def uninstall_context():             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_59uninstall_context(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_59uninstall_context = {"uninstall_context", (PyCFunction)__pyx_pw_7_cython_6cygrpc_59uninstall_context, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_59uninstall_context(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("uninstall_context (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_58uninstall_context(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_58uninstall_context(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("uninstall_context", 1);
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":28
+ *   pass
+ * 
+ * def build_census_context():             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_61build_census_context(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_61build_census_context = {"build_census_context", (PyCFunction)__pyx_pw_7_cython_6cygrpc_61build_census_context, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_61build_census_context(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("build_census_context (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_60build_census_context(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_60build_census_context(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("build_census_context", 1);
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_13CensusContext_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_13CensusContext_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13CensusContext_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_13CensusContext_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_13CensusContext___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CensusContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_13CensusContext___reduce_cython__(struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_self) {
+  PyObject *__pyx_v_state = 0;
+  PyObject *__pyx_v__dict = 0;
+  int __pyx_v_use_setstate;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__reduce_cython__", 1);
+
+  /* "(tree fragment)":5
+ *     cdef object _dict
+ *     cdef bint use_setstate
+ *     state = ()             # <<<<<<<<<<<<<<
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ */
+  __Pyx_INCREF(__pyx_empty_tuple);
+  __pyx_v_state = __pyx_empty_tuple;
+
+  /* "(tree fragment)":6
+ *     cdef bint use_setstate
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)             # <<<<<<<<<<<<<<
+ *     if _dict is not None:
+ *         state += (_dict,)
+ */
+  __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v__dict = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":7
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+  __pyx_t_2 = (__pyx_v__dict != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":8
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ *         state += (_dict,)             # <<<<<<<<<<<<<<
+ *         use_setstate = True
+ *     else:
+ */
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_v__dict);
+    __Pyx_GIVEREF(__pyx_v__dict);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(10, 8, __pyx_L1_error);
+    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3));
+    __pyx_t_3 = 0;
+
+    /* "(tree fragment)":9
+ *     if _dict is not None:
+ *         state += (_dict,)
+ *         use_setstate = True             # <<<<<<<<<<<<<<
+ *     else:
+ *         use_setstate = False
+ */
+    __pyx_v_use_setstate = 1;
+
+    /* "(tree fragment)":7
+ *     state = ()
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+    goto __pyx_L3;
+  }
+
+  /* "(tree fragment)":11
+ *         use_setstate = True
+ *     else:
+ *         use_setstate = False             # <<<<<<<<<<<<<<
+ *     if use_setstate:
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, None), state
+ */
+  /*else*/ {
+    __pyx_v_use_setstate = 0;
+  }
+  __pyx_L3:;
+
+  /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = False
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, None), state
+ *     else:
+ */
+  if (__pyx_v_use_setstate) {
+
+    /* "(tree fragment)":13
+ *         use_setstate = False
+ *     if use_setstate:
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, None), state             # <<<<<<<<<<<<<<
+ *     else:
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, state)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_CensusContext); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_238750788);
+    __Pyx_GIVEREF(__pyx_int_238750788);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_238750788)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_3);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_3 = 0;
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_4;
+    __pyx_t_4 = 0;
+    goto __pyx_L0;
+
+    /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = False
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, None), state
+ *     else:
+ */
+  }
+
+  /* "(tree fragment)":15
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, None), state
+ *     else:
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, state)             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle_CensusContext__set_state(self, __pyx_state)
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_CensusContext); if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_238750788);
+    __Pyx_GIVEREF(__pyx_int_238750788);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_238750788)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_4);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_4 = 0;
+    __pyx_t_1 = 0;
+    __pyx_r = __pyx_t_3;
+    __pyx_t_3 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.CensusContext.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_state);
+  __Pyx_XDECREF(__pyx_v__dict);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_CensusContext__set_state(self, __pyx_state)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_13CensusContext_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_13CensusContext_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13CensusContext_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_13CensusContext_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 16, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 16, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 16, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CensusContext.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_13CensusContext_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CensusContext *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_13CensusContext_2__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+  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("__setstate_cython__", 1);
+
+  /* "(tree fragment)":17
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle_CensusContext__set_state(self, __pyx_state)             # <<<<<<<<<<<<<<
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 17, __pyx_L1_error)
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle_CensusContext__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_CensusContext__set_state(self, __pyx_state)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.CensusContext.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":34
+ *   pass
+ * 
+ * def set_census_context_on_call(_CallState call_state, CensusContext census_ctx):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_63set_census_context_on_call(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_63set_census_context_on_call = {"set_census_context_on_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_63set_census_context_on_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_63set_census_context_on_call(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state = 0;
+  CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_census_ctx = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_census_context_on_call (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call_state,&__pyx_n_s_census_ctx,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(26, 34, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_census_ctx)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(26, 34, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("set_census_context_on_call", 1, 2, 2, 1); __PYX_ERR(26, 34, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_census_context_on_call") < 0)) __PYX_ERR(26, 34, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)values[0]);
+    __pyx_v_census_ctx = ((struct __pyx_obj_7_cython_6cygrpc_CensusContext *)values[1]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_census_context_on_call", 1, 2, 2, __pyx_nargs); __PYX_ERR(26, 34, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.set_census_context_on_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_state), __pyx_ptype_7_cython_6cygrpc__CallState, 1, "call_state", 0))) __PYX_ERR(26, 34, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_census_ctx), __pyx_ptype_7_cython_6cygrpc_CensusContext, 1, "census_ctx", 0))) __PYX_ERR(26, 34, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_62set_census_context_on_call(__pyx_self, __pyx_v_call_state, __pyx_v_census_ctx);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_62set_census_context_on_call(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__CallState *__pyx_v_call_state, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_census_ctx) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_census_context_on_call", 1);
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":37
+ *   pass
+ * 
+ * def set_instrumentation_context_on_call_aio(GrpcCallWrapper call_state, CensusContext census_ctx):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_65set_instrumentation_context_on_call_aio(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_65set_instrumentation_context_on_call_aio = {"set_instrumentation_context_on_call_aio", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_65set_instrumentation_context_on_call_aio, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_65set_instrumentation_context_on_call_aio(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_call_state = 0;
+  CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_census_ctx = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_instrumentation_context_on_call_aio (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_call_state,&__pyx_n_s_census_ctx,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(26, 37, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_census_ctx)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(26, 37, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("set_instrumentation_context_on_call_aio", 1, 2, 2, 1); __PYX_ERR(26, 37, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_instrumentation_context_on_call_aio") < 0)) __PYX_ERR(26, 37, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *)values[0]);
+    __pyx_v_census_ctx = ((struct __pyx_obj_7_cython_6cygrpc_CensusContext *)values[1]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_instrumentation_context_on_call_aio", 1, 2, 2, __pyx_nargs); __PYX_ERR(26, 37, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.set_instrumentation_context_on_call_aio", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_state), __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper, 1, "call_state", 0))) __PYX_ERR(26, 37, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_census_ctx), __pyx_ptype_7_cython_6cygrpc_CensusContext, 1, "census_ctx", 0))) __PYX_ERR(26, 37, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_64set_instrumentation_context_on_call_aio(__pyx_self, __pyx_v_call_state, __pyx_v_census_ctx);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_64set_instrumentation_context_on_call_aio(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_call_state, CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v_census_ctx) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_instrumentation_context_on_call_aio", 1);
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":40
+ *   pass
+ * 
+ * def get_deadline_from_context():             # <<<<<<<<<<<<<<
+ *   return None
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_67get_deadline_from_context(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_67get_deadline_from_context = {"get_deadline_from_context", (PyCFunction)__pyx_pw_7_cython_6cygrpc_67get_deadline_from_context, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_67get_deadline_from_context(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_deadline_from_context (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_66get_deadline_from_context(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_66get_deadline_from_context(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_deadline_from_context", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":41
+ * 
+ * def get_deadline_from_context():
+ *   return None             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":40
+ *   pass
+ * 
+ * def get_deadline_from_context():             # <<<<<<<<<<<<<<
+ *   return None
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":26
+ * 
+ * 
+ * def set_server_call_tracer_factory(object observability_plugin) -> None:             # <<<<<<<<<<<<<<
+ *   capsule = observability_plugin.create_server_call_tracer_factory()
+ *   capsule_ptr = cpython.PyCapsule_GetPointer(capsule, SERVER_CALL_TRACER_FACTORY)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_69set_server_call_tracer_factory(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_69set_server_call_tracer_factory = {"set_server_call_tracer_factory", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_69set_server_call_tracer_factory, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_69set_server_call_tracer_factory(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_observability_plugin = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_server_call_tracer_factory (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_observability_plugin,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_observability_plugin)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(27, 26, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_server_call_tracer_factory") < 0)) __PYX_ERR(27, 26, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_observability_plugin = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_server_call_tracer_factory", 1, 1, 1, __pyx_nargs); __PYX_ERR(27, 26, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.set_server_call_tracer_factory", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_68set_server_call_tracer_factory(__pyx_self, __pyx_v_observability_plugin);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_68set_server_call_tracer_factory(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_observability_plugin) {
+  PyObject *__pyx_v_capsule = NULL;
+  void *__pyx_v_capsule_ptr;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  void *__pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("set_server_call_tracer_factory", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":27
+ * 
+ * def set_server_call_tracer_factory(object observability_plugin) -> None:
+ *   capsule = observability_plugin.create_server_call_tracer_factory()             # <<<<<<<<<<<<<<
+ *   capsule_ptr = cpython.PyCapsule_GetPointer(capsule, SERVER_CALL_TRACER_FACTORY)
+ *   _register_server_call_tracer_factory(capsule_ptr)
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_observability_plugin, __pyx_n_s_create_server_call_tracer_factor); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 27, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(27, 27, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_v_capsule = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":28
+ * def set_server_call_tracer_factory(object observability_plugin) -> None:
+ *   capsule = observability_plugin.create_server_call_tracer_factory()
+ *   capsule_ptr = cpython.PyCapsule_GetPointer(capsule, SERVER_CALL_TRACER_FACTORY)             # <<<<<<<<<<<<<<
+ *   _register_server_call_tracer_factory(capsule_ptr)
+ * 
+ */
+  __pyx_t_5 = PyCapsule_GetPointer(__pyx_v_capsule, __pyx_v_7_cython_6cygrpc_SERVER_CALL_TRACER_FACTORY); if (unlikely(__pyx_t_5 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(27, 28, __pyx_L1_error)
+  __pyx_v_capsule_ptr = __pyx_t_5;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":29
+ *   capsule = observability_plugin.create_server_call_tracer_factory()
+ *   capsule_ptr = cpython.PyCapsule_GetPointer(capsule, SERVER_CALL_TRACER_FACTORY)
+ *   _register_server_call_tracer_factory(capsule_ptr)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_f_7_cython_6cygrpc__register_server_call_tracer_factory(__pyx_v_capsule_ptr); if (unlikely(PyErr_Occurred())) __PYX_ERR(27, 29, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":26
+ * 
+ * 
+ * def set_server_call_tracer_factory(object observability_plugin) -> None:             # <<<<<<<<<<<<<<
+ *   capsule = observability_plugin.create_server_call_tracer_factory()
+ *   capsule_ptr = cpython.PyCapsule_GetPointer(capsule, SERVER_CALL_TRACER_FACTORY)
+ */
+
+  /* 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("_cython.cygrpc.set_server_call_tracer_factory", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_capsule);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":32
+ * 
+ * 
+ * def clear_server_call_tracer_factory() -> None:             # <<<<<<<<<<<<<<
+ *   _register_server_call_tracer_factory(NULL)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_71clear_server_call_tracer_factory(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_71clear_server_call_tracer_factory = {"clear_server_call_tracer_factory", (PyCFunction)__pyx_pw_7_cython_6cygrpc_71clear_server_call_tracer_factory, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_71clear_server_call_tracer_factory(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clear_server_call_tracer_factory (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_70clear_server_call_tracer_factory(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_70clear_server_call_tracer_factory(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("clear_server_call_tracer_factory", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":33
+ * 
+ * def clear_server_call_tracer_factory() -> None:
+ *   _register_server_call_tracer_factory(NULL)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_f_7_cython_6cygrpc__register_server_call_tracer_factory(NULL); if (unlikely(PyErr_Occurred())) __PYX_ERR(27, 33, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":32
+ * 
+ * 
+ * def clear_server_call_tracer_factory() -> None:             # <<<<<<<<<<<<<<
+ *   _register_server_call_tracer_factory(NULL)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.clear_server_call_tracer_factory", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":36
+ * 
+ * 
+ * def maybe_save_server_trace_context(RequestCallEvent event) -> None:             # <<<<<<<<<<<<<<
+ *   cdef ServerCallTracer* server_call_tracer
+ *   with _observability.get_plugin() as plugin:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_73maybe_save_server_trace_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_73maybe_save_server_trace_context = {"maybe_save_server_trace_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_73maybe_save_server_trace_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_73maybe_save_server_trace_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_event = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("maybe_save_server_trace_context (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_event,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_event)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(27, 36, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "maybe_save_server_trace_context") < 0)) __PYX_ERR(27, 36, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_event = ((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("maybe_save_server_trace_context", 1, 1, 1, __pyx_nargs); __PYX_ERR(27, 36, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.maybe_save_server_trace_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_event), __pyx_ptype_7_cython_6cygrpc_RequestCallEvent, 1, "event", 0))) __PYX_ERR(27, 36, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_72maybe_save_server_trace_context(__pyx_self, __pyx_v_event);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_72maybe_save_server_trace_context(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *__pyx_v_event) {
+  grpc_core::ServerCallTracer *__pyx_v_server_call_tracer;
+  PyObject *__pyx_v_plugin = NULL;
+  PyObject *__pyx_v_trace_id = NULL;
+  PyObject *__pyx_v_span_id = NULL;
+  int __pyx_v_is_sampled;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned 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_t_10;
+  int __pyx_t_11;
+  void *__pyx_t_12;
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("maybe_save_server_trace_context", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":38
+ * def maybe_save_server_trace_context(RequestCallEvent event) -> None:
+ *   cdef ServerCallTracer* server_call_tracer
+ *   with _observability.get_plugin() as plugin:             # <<<<<<<<<<<<<<
+ *     if not (plugin and plugin.tracing_enabled):
+ *       return
+ */
+  /*with:*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_observability); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 38, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get_plugin); if (unlikely(!__pyx_t_3)) __PYX_ERR(27, 38, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(27, 38, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __pyx_t_5 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_exit); if (unlikely(!__pyx_t_5)) __PYX_ERR(27, 38, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_enter); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 38, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_6 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(27, 38, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_t_2 = __pyx_t_3;
+    __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_9);
+        /*try:*/ {
+          __pyx_v_plugin = __pyx_t_2;
+          __pyx_t_2 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":39
+ *   cdef ServerCallTracer* server_call_tracer
+ *   with _observability.get_plugin() as plugin:
+ *     if not (plugin and plugin.tracing_enabled):             # <<<<<<<<<<<<<<
+ *       return
+ *     server_call_tracer = static_cast['ServerCallTracer*'](_get_call_tracer(event.call.c_call))
+ */
+          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_v_plugin); if (unlikely((__pyx_t_11 < 0))) __PYX_ERR(27, 39, __pyx_L7_error)
+          if (__pyx_t_11) {
+          } else {
+            __pyx_t_10 = __pyx_t_11;
+            goto __pyx_L14_bool_binop_done;
+          }
+          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin, __pyx_n_s_tracing_enabled); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 39, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_11 < 0))) __PYX_ERR(27, 39, __pyx_L7_error)
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_10 = __pyx_t_11;
+          __pyx_L14_bool_binop_done:;
+          __pyx_t_11 = (!__pyx_t_10);
+          if (__pyx_t_11) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":40
+ *   with _observability.get_plugin() as plugin:
+ *     if not (plugin and plugin.tracing_enabled):
+ *       return             # <<<<<<<<<<<<<<
+ *     server_call_tracer = static_cast['ServerCallTracer*'](_get_call_tracer(event.call.c_call))
+ *     # TraceId and SpanId is hex string, need to convert to str
+ */
+            __Pyx_XDECREF(__pyx_r);
+            __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+            goto __pyx_L11_try_return;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":39
+ *   cdef ServerCallTracer* server_call_tracer
+ *   with _observability.get_plugin() as plugin:
+ *     if not (plugin and plugin.tracing_enabled):             # <<<<<<<<<<<<<<
+ *       return
+ *     server_call_tracer = static_cast['ServerCallTracer*'](_get_call_tracer(event.call.c_call))
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":41
+ *     if not (plugin and plugin.tracing_enabled):
+ *       return
+ *     server_call_tracer = static_cast['ServerCallTracer*'](_get_call_tracer(event.call.c_call))             # <<<<<<<<<<<<<<
+ *     # TraceId and SpanId is hex string, need to convert to str
+ *     trace_id = _decode(codecs.decode(server_call_tracer.TraceId(), 'hex_codec'))
+ */
+          __pyx_t_12 = __pyx_f_7_cython_6cygrpc__get_call_tracer(__pyx_v_event->call->c_call); if (unlikely(__pyx_t_12 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(27, 41, __pyx_L7_error)
+          __pyx_v_server_call_tracer = static_cast<grpc_core::ServerCallTracer *>(__pyx_t_12);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":43
+ *     server_call_tracer = static_cast['ServerCallTracer*'](_get_call_tracer(event.call.c_call))
+ *     # TraceId and SpanId is hex string, need to convert to str
+ *     trace_id = _decode(codecs.decode(server_call_tracer.TraceId(), 'hex_codec'))             # <<<<<<<<<<<<<<
+ *     span_id = _decode(codecs.decode(server_call_tracer.SpanId(), 'hex_codec'))
+ *     is_sampled = server_call_tracer.IsSampled()
+ */
+          __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_codecs); if (unlikely(!__pyx_t_1)) __PYX_ERR(27, 43, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_decode); if (unlikely(!__pyx_t_3)) __PYX_ERR(27, 43, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_1 = __pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string(__pyx_v_server_call_tracer->TraceId()); if (unlikely(!__pyx_t_1)) __PYX_ERR(27, 43, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_6 = NULL;
+          __pyx_t_4 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (unlikely(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);
+              __pyx_t_4 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_t_1, __pyx_n_s_hex_codec};
+            __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 43, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          }
+          if (!(likely(PyBytes_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_2))) __PYX_ERR(27, 43, __pyx_L7_error)
+          __pyx_t_3 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_3)) __PYX_ERR(27, 43, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_v_trace_id = __pyx_t_3;
+          __pyx_t_3 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":44
+ *     # TraceId and SpanId is hex string, need to convert to str
+ *     trace_id = _decode(codecs.decode(server_call_tracer.TraceId(), 'hex_codec'))
+ *     span_id = _decode(codecs.decode(server_call_tracer.SpanId(), 'hex_codec'))             # <<<<<<<<<<<<<<
+ *     is_sampled = server_call_tracer.IsSampled()
+ *     plugin.save_trace_context(trace_id, span_id, is_sampled)
+ */
+          __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_codecs); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 44, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_decode); if (unlikely(!__pyx_t_1)) __PYX_ERR(27, 44, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_2 = __pyx_convert_PyBytes_string_to_py_6libcpp_6string_std__in_string(__pyx_v_server_call_tracer->SpanId()); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 44, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_6 = NULL;
+          __pyx_t_4 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (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_4 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_t_2, __pyx_n_s_hex_codec};
+            __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            if (unlikely(!__pyx_t_3)) __PYX_ERR(27, 44, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          }
+          if (!(likely(PyBytes_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_3))) __PYX_ERR(27, 44, __pyx_L7_error)
+          __pyx_t_1 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_1)) __PYX_ERR(27, 44, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_v_span_id = __pyx_t_1;
+          __pyx_t_1 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":45
+ *     trace_id = _decode(codecs.decode(server_call_tracer.TraceId(), 'hex_codec'))
+ *     span_id = _decode(codecs.decode(server_call_tracer.SpanId(), 'hex_codec'))
+ *     is_sampled = server_call_tracer.IsSampled()             # <<<<<<<<<<<<<<
+ *     plugin.save_trace_context(trace_id, span_id, is_sampled)
+ * 
+ */
+          __pyx_v_is_sampled = __pyx_v_server_call_tracer->IsSampled();
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":46
+ *     span_id = _decode(codecs.decode(server_call_tracer.SpanId(), 'hex_codec'))
+ *     is_sampled = server_call_tracer.IsSampled()
+ *     plugin.save_trace_context(trace_id, span_id, is_sampled)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+          __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_plugin, __pyx_n_s_save_trace_context); if (unlikely(!__pyx_t_3)) __PYX_ERR(27, 46, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_is_sampled); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 46, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_6 = NULL;
+          __pyx_t_4 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (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);
+              __pyx_t_4 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[4] = {__pyx_t_6, __pyx_v_trace_id, __pyx_v_span_id, __pyx_t_2};
+            __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            if (unlikely(!__pyx_t_1)) __PYX_ERR(27, 46, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":38
+ * def maybe_save_server_trace_context(RequestCallEvent event) -> None:
+ *   cdef ServerCallTracer* server_call_tracer
+ *   with _observability.get_plugin() as plugin:             # <<<<<<<<<<<<<<
+ *     if not (plugin and plugin.tracing_enabled):
+ *       return
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __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;
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc.maybe_save_server_trace_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) __PYX_ERR(27, 38, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_1);
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_2);
+          __pyx_t_6 = PyTuple_Pack(3, __pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(27, 38, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, NULL);
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          if (unlikely(!__pyx_t_13)) __PYX_ERR(27, 38, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+          if (__pyx_t_11 < 0) __PYX_ERR(27, 38, __pyx_L9_except_error)
+          __pyx_t_10 = (!__pyx_t_11);
+          if (unlikely(__pyx_t_10)) {
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_XGIVEREF(__pyx_t_2);
+            __Pyx_ErrRestoreWithState(__pyx_t_1, __pyx_t_3, __pyx_t_2);
+            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
+            __PYX_ERR(27, 38, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        goto __pyx_L1_error;
+        __pyx_L11_try_return:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        goto __pyx_L4_return;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_5) {
+          __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_9)) __PYX_ERR(27, 38, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L4_return: {
+        __pyx_t_9 = __pyx_r;
+        __pyx_r = 0;
+        if (__pyx_t_5) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(27, 38, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        __pyx_r = __pyx_t_9;
+        __pyx_t_9 = 0;
+        goto __pyx_L0;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L19;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    goto __pyx_L1_error;
+    __pyx_L19:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":36
+ * 
+ * 
+ * def maybe_save_server_trace_context(RequestCallEvent event) -> None:             # <<<<<<<<<<<<<<
+ *   cdef ServerCallTracer* server_call_tracer
+ *   with _observability.get_plugin() as plugin:
+ */
+
+  /* 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_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc.maybe_save_server_trace_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_plugin);
+  __Pyx_XDECREF(__pyx_v_trace_id);
+  __Pyx_XDECREF(__pyx_v_span_id);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":49
+ * 
+ * 
+ * cdef void _set_call_tracer(grpc_call* call, void* capsule_ptr):             # <<<<<<<<<<<<<<
+ *   cdef ClientCallTracer* call_tracer = <ClientCallTracer*>capsule_ptr
+ *   grpc_call_context_set(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE, call_tracer, NULL)
+ */
+
+static void __pyx_f_7_cython_6cygrpc__set_call_tracer(grpc_call *__pyx_v_call, void *__pyx_v_capsule_ptr) {
+  grpc_core::ClientCallTracer *__pyx_v_call_tracer;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":50
+ * 
+ * cdef void _set_call_tracer(grpc_call* call, void* capsule_ptr):
+ *   cdef ClientCallTracer* call_tracer = <ClientCallTracer*>capsule_ptr             # <<<<<<<<<<<<<<
+ *   grpc_call_context_set(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE, call_tracer, NULL)
+ * 
+ */
+  __pyx_v_call_tracer = ((grpc_core::ClientCallTracer *)__pyx_v_capsule_ptr);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":51
+ * cdef void _set_call_tracer(grpc_call* call, void* capsule_ptr):
+ *   cdef ClientCallTracer* call_tracer = <ClientCallTracer*>capsule_ptr
+ *   grpc_call_context_set(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE, call_tracer, NULL)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  grpc_call_context_set(__pyx_v_call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE, __pyx_v_call_tracer, NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":49
+ * 
+ * 
+ * cdef void _set_call_tracer(grpc_call* call, void* capsule_ptr):             # <<<<<<<<<<<<<<
+ *   cdef ClientCallTracer* call_tracer = <ClientCallTracer*>capsule_ptr
+ *   grpc_call_context_set(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE, call_tracer, NULL)
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":54
+ * 
+ * 
+ * cdef void* _get_call_tracer(grpc_call* call):             # <<<<<<<<<<<<<<
+ *   cdef void* call_tracer = grpc_call_context_get(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE)
+ *   return call_tracer
+ */
+
+static void *__pyx_f_7_cython_6cygrpc__get_call_tracer(grpc_call *__pyx_v_call) {
+  void *__pyx_v_call_tracer;
+  void *__pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":55
+ * 
+ * cdef void* _get_call_tracer(grpc_call* call):
+ *   cdef void* call_tracer = grpc_call_context_get(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE)             # <<<<<<<<<<<<<<
+ *   return call_tracer
+ * 
+ */
+  __pyx_v_call_tracer = grpc_call_context_get(__pyx_v_call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":56
+ * cdef void* _get_call_tracer(grpc_call* call):
+ *   cdef void* call_tracer = grpc_call_context_get(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE)
+ *   return call_tracer             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_call_tracer;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":54
+ * 
+ * 
+ * cdef void* _get_call_tracer(grpc_call* call):             # <<<<<<<<<<<<<<
+ *   cdef void* call_tracer = grpc_call_context_get(call, GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE)
+ *   return call_tracer
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":59
+ * 
+ * 
+ * cdef void _register_server_call_tracer_factory(void* capsule_ptr):             # <<<<<<<<<<<<<<
+ *   cdef ServerCallTracerFactory* call_tracer_factory = <ServerCallTracerFactory*>capsule_ptr
+ *   ServerCallTracerFactory.RegisterGlobal(call_tracer_factory)
+ */
+
+static void __pyx_f_7_cython_6cygrpc__register_server_call_tracer_factory(void *__pyx_v_capsule_ptr) {
+  grpc_core::ServerCallTracerFactory *__pyx_v_call_tracer_factory;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":60
+ * 
+ * cdef void _register_server_call_tracer_factory(void* capsule_ptr):
+ *   cdef ServerCallTracerFactory* call_tracer_factory = <ServerCallTracerFactory*>capsule_ptr             # <<<<<<<<<<<<<<
+ *   ServerCallTracerFactory.RegisterGlobal(call_tracer_factory)
+ */
+  __pyx_v_call_tracer_factory = ((grpc_core::ServerCallTracerFactory *)__pyx_v_capsule_ptr);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":61
+ * cdef void _register_server_call_tracer_factory(void* capsule_ptr):
+ *   cdef ServerCallTracerFactory* call_tracer_factory = <ServerCallTracerFactory*>capsule_ptr
+ *   ServerCallTracerFactory.RegisterGlobal(call_tracer_factory)             # <<<<<<<<<<<<<<
+ */
+  grpc_core::ServerCallTracerFactory::RegisterGlobal(__pyx_v_call_tracer_factory);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":59
+ * 
+ * 
+ * cdef void _register_server_call_tracer_factory(void* capsule_ptr):             # <<<<<<<<<<<<<<
+ *   cdef ServerCallTracerFactory* call_tracer_factory = <ServerCallTracerFactory*>capsule_ptr
+ *   ServerCallTracerFactory.RegisterGlobal(call_tracer_factory)
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":38
+ * 
+ * 
+ * cdef _submit_to_greenlet_queue(object cb, tuple args):             # <<<<<<<<<<<<<<
+ *   cdef tuple to_call = (cb,) + args
+ *   cdef unique_lock[mutex]* lk
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__submit_to_greenlet_queue(PyObject *__pyx_v_cb, PyObject *__pyx_v_args) {
+  PyObject *__pyx_v_to_call = 0;
+  std::unique_lock<std::mutex>  *__pyx_v_lk;
+  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("_submit_to_greenlet_queue", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":39
+ * 
+ * cdef _submit_to_greenlet_queue(object cb, tuple args):
+ *   cdef tuple to_call = (cb,) + args             # <<<<<<<<<<<<<<
+ *   cdef unique_lock[mutex]* lk
+ *   Py_INCREF(to_call)
+ */
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_cb);
+  __Pyx_GIVEREF(__pyx_v_cb);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_cb)) __PYX_ERR(28, 39, __pyx_L1_error);
+  __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_args); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_to_call = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":41
+ *   cdef tuple to_call = (cb,) + args
+ *   cdef unique_lock[mutex]* lk
+ *   Py_INCREF(to_call)             # <<<<<<<<<<<<<<
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ */
+  Py_INCREF(__pyx_v_to_call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":42
+ *   cdef unique_lock[mutex]* lk
+ *   Py_INCREF(to_call)
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_greenlets_to_run.push(<void*>(to_call))
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":43
+ *   Py_INCREF(to_call)
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)             # <<<<<<<<<<<<<<
+ *     g_greenlets_to_run.push(<void*>(to_call))
+ *     del lk
+ */
+        __pyx_v_lk = new std::unique_lock<std::mutex> (__pyx_v_7_cython_6cygrpc_g_greenlets_mu);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":44
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_greenlets_to_run.push(<void*>(to_call))             # <<<<<<<<<<<<<<
+ *     del lk
+ *     g_greenlets_cv.notify_all()
+ */
+        __pyx_v_7_cython_6cygrpc_g_greenlets_to_run.push(((void *)__pyx_v_to_call));
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":45
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_greenlets_to_run.push(<void*>(to_call))
+ *     del lk             # <<<<<<<<<<<<<<
+ *     g_greenlets_cv.notify_all()
+ * 
+ */
+        delete __pyx_v_lk;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":46
+ *     g_greenlets_to_run.push(<void*>(to_call))
+ *     del lk
+ *     g_greenlets_cv.notify_all()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+        __pyx_v_7_cython_6cygrpc_g_greenlets_cv.notify_all();
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":42
+ *   cdef unique_lock[mutex]* lk
+ *   Py_INCREF(to_call)
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_greenlets_to_run.push(<void*>(to_call))
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":38
+ * 
+ * 
+ * cdef _submit_to_greenlet_queue(object cb, tuple args):             # <<<<<<<<<<<<<<
+ *   cdef tuple to_call = (cb,) + args
+ *   cdef unique_lock[mutex]* lk
+ */
+
+  /* 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_AddTraceback("_cython.cygrpc._submit_to_greenlet_queue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_to_call);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":49
+ * 
+ * 
+ * cpdef void gevent_increment_channel_count():             # <<<<<<<<<<<<<<
+ *   global g_channel_count
+ *   cdef int old_channel_count
+ */
+
+static PyObject *__pyx_pw_7_cython_6cygrpc_75gevent_increment_channel_count(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static void __pyx_f_7_cython_6cygrpc_gevent_increment_channel_count(CYTHON_UNUSED int __pyx_skip_dispatch) {
+  int __pyx_v_old_channel_count;
+  std::unique_lock<std::mutex>  *__pyx_v_lk;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("gevent_increment_channel_count", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":52
+ *   global g_channel_count
+ *   cdef int old_channel_count
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     old_channel_count = g_channel_count
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":53
+ *   cdef int old_channel_count
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)             # <<<<<<<<<<<<<<
+ *     old_channel_count = g_channel_count
+ *     g_channel_count += 1
+ */
+        __pyx_v_lk = new std::unique_lock<std::mutex> (__pyx_v_7_cython_6cygrpc_g_greenlets_mu);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":54
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     old_channel_count = g_channel_count             # <<<<<<<<<<<<<<
+ *     g_channel_count += 1
+ *     del lk
+ */
+        __pyx_v_old_channel_count = __pyx_v_7_cython_6cygrpc_g_channel_count;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":55
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     old_channel_count = g_channel_count
+ *     g_channel_count += 1             # <<<<<<<<<<<<<<
+ *     del lk
+ *   if old_channel_count == 0:
+ */
+        __pyx_v_7_cython_6cygrpc_g_channel_count = (__pyx_v_7_cython_6cygrpc_g_channel_count + 1);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":56
+ *     old_channel_count = g_channel_count
+ *     g_channel_count += 1
+ *     del lk             # <<<<<<<<<<<<<<
+ *   if old_channel_count == 0:
+ *     run_spawn_greenlets()
+ */
+        delete __pyx_v_lk;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":52
+ *   global g_channel_count
+ *   cdef int old_channel_count
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     old_channel_count = g_channel_count
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":57
+ *     g_channel_count += 1
+ *     del lk
+ *   if old_channel_count == 0:             # <<<<<<<<<<<<<<
+ *     run_spawn_greenlets()
+ * 
+ */
+  __pyx_t_1 = (__pyx_v_old_channel_count == 0);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":58
+ *     del lk
+ *   if old_channel_count == 0:
+ *     run_spawn_greenlets()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_run_spawn_greenlets); if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 58, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 58, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":57
+ *     g_channel_count += 1
+ *     del lk
+ *   if old_channel_count == 0:             # <<<<<<<<<<<<<<
+ *     run_spawn_greenlets()
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":49
+ * 
+ * 
+ * cpdef void gevent_increment_channel_count():             # <<<<<<<<<<<<<<
+ *   global g_channel_count
+ *   cdef int old_channel_count
+ */
+
+  /* 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("_cython.cygrpc.gevent_increment_channel_count", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_75gevent_increment_channel_count(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_75gevent_increment_channel_count = {"gevent_increment_channel_count", (PyCFunction)__pyx_pw_7_cython_6cygrpc_75gevent_increment_channel_count, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_75gevent_increment_channel_count(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("gevent_increment_channel_count (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_74gevent_increment_channel_count(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_74gevent_increment_channel_count(CYTHON_UNUSED PyObject *__pyx_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("gevent_increment_channel_count", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_f_7_cython_6cygrpc_gevent_increment_channel_count(0); if (unlikely(PyErr_Occurred())) __PYX_ERR(28, 49, __pyx_L1_error)
+  __pyx_t_1 = __Pyx_void_to_None(NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 49, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.gevent_increment_channel_count", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":61
+ * 
+ * 
+ * cpdef void gevent_decrement_channel_count():             # <<<<<<<<<<<<<<
+ *   global g_channel_count
+ *   with nogil:
+ */
+
+static PyObject *__pyx_pw_7_cython_6cygrpc_77gevent_decrement_channel_count(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static void __pyx_f_7_cython_6cygrpc_gevent_decrement_channel_count(CYTHON_UNUSED int __pyx_skip_dispatch) {
+  std::unique_lock<std::mutex>  *__pyx_v_lk;
+  int __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":63
+ * cpdef void gevent_decrement_channel_count():
+ *   global g_channel_count
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_channel_count -= 1
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":64
+ *   global g_channel_count
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)             # <<<<<<<<<<<<<<
+ *     g_channel_count -= 1
+ *     if g_channel_count == 0:
+ */
+        __pyx_v_lk = new std::unique_lock<std::mutex> (__pyx_v_7_cython_6cygrpc_g_greenlets_mu);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":65
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_channel_count -= 1             # <<<<<<<<<<<<<<
+ *     if g_channel_count == 0:
+ *       g_greenlets_cv.notify_all()
+ */
+        __pyx_v_7_cython_6cygrpc_g_channel_count = (__pyx_v_7_cython_6cygrpc_g_channel_count - 1);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":66
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_channel_count -= 1
+ *     if g_channel_count == 0:             # <<<<<<<<<<<<<<
+ *       g_greenlets_cv.notify_all()
+ *     del lk
+ */
+        __pyx_t_1 = (__pyx_v_7_cython_6cygrpc_g_channel_count == 0);
+        if (__pyx_t_1) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":67
+ *     g_channel_count -= 1
+ *     if g_channel_count == 0:
+ *       g_greenlets_cv.notify_all()             # <<<<<<<<<<<<<<
+ *     del lk
+ * 
+ */
+          __pyx_v_7_cython_6cygrpc_g_greenlets_cv.notify_all();
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":66
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_channel_count -= 1
+ *     if g_channel_count == 0:             # <<<<<<<<<<<<<<
+ *       g_greenlets_cv.notify_all()
+ *     del lk
+ */
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":68
+ *     if g_channel_count == 0:
+ *       g_greenlets_cv.notify_all()
+ *     del lk             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+        delete __pyx_v_lk;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":63
+ * cpdef void gevent_decrement_channel_count():
+ *   global g_channel_count
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_channel_count -= 1
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":61
+ * 
+ * 
+ * cpdef void gevent_decrement_channel_count():             # <<<<<<<<<<<<<<
+ *   global g_channel_count
+ *   with nogil:
+ */
+
+  /* function exit code */
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_77gevent_decrement_channel_count(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_77gevent_decrement_channel_count = {"gevent_decrement_channel_count", (PyCFunction)__pyx_pw_7_cython_6cygrpc_77gevent_decrement_channel_count, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_77gevent_decrement_channel_count(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("gevent_decrement_channel_count (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_76gevent_decrement_channel_count(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_76gevent_decrement_channel_count(CYTHON_UNUSED PyObject *__pyx_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("gevent_decrement_channel_count", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_f_7_cython_6cygrpc_gevent_decrement_channel_count(0); if (unlikely(PyErr_Occurred())) __PYX_ERR(28, 61, __pyx_L1_error)
+  __pyx_t_1 = __Pyx_void_to_None(NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 61, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.gevent_decrement_channel_count", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":71
+ * 
+ * 
+ * cdef object await_next_greenlet():             # <<<<<<<<<<<<<<
+ *   cdef unique_lock[mutex]* lk
+ *   with nogil:
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_await_next_greenlet(void) {
+  std::unique_lock<std::mutex>  *__pyx_v_lk;
+  PyObject *__pyx_v_to_call = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  void *__pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  __Pyx_RefNannySetupContext("await_next_greenlet", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":73
+ * cdef object await_next_greenlet():
+ *   cdef unique_lock[mutex]* lk
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     # Cython doesn't allow us to do proper stack allocations, so we can't take
+ *     # advantage of RAII.
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":76
+ *     # Cython doesn't allow us to do proper stack allocations, so we can't take
+ *     # advantage of RAII.
+ *     lk = new unique_lock[mutex](g_greenlets_mu)             # <<<<<<<<<<<<<<
+ *     while not g_shutdown_greenlets_to_run_queue and g_channel_count != 0:
+ *       if not g_greenlets_to_run.empty():
+ */
+        __pyx_v_lk = new std::unique_lock<std::mutex> (__pyx_v_7_cython_6cygrpc_g_greenlets_mu);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":77
+ *     # advantage of RAII.
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     while not g_shutdown_greenlets_to_run_queue and g_channel_count != 0:             # <<<<<<<<<<<<<<
+ *       if not g_greenlets_to_run.empty():
+ *         break
+ */
+        while (1) {
+          __pyx_t_2 = (!__pyx_v_7_cython_6cygrpc_g_shutdown_greenlets_to_run_queue);
+          if (__pyx_t_2) {
+          } else {
+            __pyx_t_1 = __pyx_t_2;
+            goto __pyx_L8_bool_binop_done;
+          }
+          __pyx_t_2 = (__pyx_v_7_cython_6cygrpc_g_channel_count != 0);
+          __pyx_t_1 = __pyx_t_2;
+          __pyx_L8_bool_binop_done:;
+          if (!__pyx_t_1) break;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":78
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     while not g_shutdown_greenlets_to_run_queue and g_channel_count != 0:
+ *       if not g_greenlets_to_run.empty():             # <<<<<<<<<<<<<<
+ *         break
+ *       g_greenlets_cv.wait(dereference(lk))
+ */
+          __pyx_t_1 = (!__pyx_v_7_cython_6cygrpc_g_greenlets_to_run.empty());
+          if (__pyx_t_1) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":79
+ *     while not g_shutdown_greenlets_to_run_queue and g_channel_count != 0:
+ *       if not g_greenlets_to_run.empty():
+ *         break             # <<<<<<<<<<<<<<
+ *       g_greenlets_cv.wait(dereference(lk))
+ *   if g_channel_count == 0:
+ */
+            goto __pyx_L7_break;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":78
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     while not g_shutdown_greenlets_to_run_queue and g_channel_count != 0:
+ *       if not g_greenlets_to_run.empty():             # <<<<<<<<<<<<<<
+ *         break
+ *       g_greenlets_cv.wait(dereference(lk))
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":80
+ *       if not g_greenlets_to_run.empty():
+ *         break
+ *       g_greenlets_cv.wait(dereference(lk))             # <<<<<<<<<<<<<<
+ *   if g_channel_count == 0:
+ *     del lk
+ */
+          __pyx_v_7_cython_6cygrpc_g_greenlets_cv.wait((*__pyx_v_lk));
+        }
+        __pyx_L7_break:;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":73
+ * cdef object await_next_greenlet():
+ *   cdef unique_lock[mutex]* lk
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     # Cython doesn't allow us to do proper stack allocations, so we can't take
+ *     # advantage of RAII.
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":81
+ *         break
+ *       g_greenlets_cv.wait(dereference(lk))
+ *   if g_channel_count == 0:             # <<<<<<<<<<<<<<
+ *     del lk
+ *     return None
+ */
+  __pyx_t_1 = (__pyx_v_7_cython_6cygrpc_g_channel_count == 0);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":82
+ *       g_greenlets_cv.wait(dereference(lk))
+ *   if g_channel_count == 0:
+ *     del lk             # <<<<<<<<<<<<<<
+ *     return None
+ *   if g_shutdown_greenlets_to_run_queue:
+ */
+    delete __pyx_v_lk;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":83
+ *   if g_channel_count == 0:
+ *     del lk
+ *     return None             # <<<<<<<<<<<<<<
+ *   if g_shutdown_greenlets_to_run_queue:
+ *     del lk
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":81
+ *         break
+ *       g_greenlets_cv.wait(dereference(lk))
+ *   if g_channel_count == 0:             # <<<<<<<<<<<<<<
+ *     del lk
+ *     return None
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":84
+ *     del lk
+ *     return None
+ *   if g_shutdown_greenlets_to_run_queue:             # <<<<<<<<<<<<<<
+ *     del lk
+ *     return None
+ */
+  if (__pyx_v_7_cython_6cygrpc_g_shutdown_greenlets_to_run_queue) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":85
+ *     return None
+ *   if g_shutdown_greenlets_to_run_queue:
+ *     del lk             # <<<<<<<<<<<<<<
+ *     return None
+ *   cdef object to_call = <object>g_greenlets_to_run.front()
+ */
+    delete __pyx_v_lk;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":86
+ *   if g_shutdown_greenlets_to_run_queue:
+ *     del lk
+ *     return None             # <<<<<<<<<<<<<<
+ *   cdef object to_call = <object>g_greenlets_to_run.front()
+ *   Py_DECREF(to_call)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":84
+ *     del lk
+ *     return None
+ *   if g_shutdown_greenlets_to_run_queue:             # <<<<<<<<<<<<<<
+ *     del lk
+ *     return None
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":87
+ *     del lk
+ *     return None
+ *   cdef object to_call = <object>g_greenlets_to_run.front()             # <<<<<<<<<<<<<<
+ *   Py_DECREF(to_call)
+ *   g_greenlets_to_run.pop()
+ */
+  __pyx_t_3 = __pyx_v_7_cython_6cygrpc_g_greenlets_to_run.front();
+  __pyx_t_4 = ((PyObject *)__pyx_t_3);
+  __Pyx_INCREF(__pyx_t_4);
+  __pyx_v_to_call = __pyx_t_4;
+  __pyx_t_4 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":88
+ *     return None
+ *   cdef object to_call = <object>g_greenlets_to_run.front()
+ *   Py_DECREF(to_call)             # <<<<<<<<<<<<<<
+ *   g_greenlets_to_run.pop()
+ *   del lk
+ */
+  Py_DECREF(__pyx_v_to_call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":89
+ *   cdef object to_call = <object>g_greenlets_to_run.front()
+ *   Py_DECREF(to_call)
+ *   g_greenlets_to_run.pop()             # <<<<<<<<<<<<<<
+ *   del lk
+ *   return to_call
+ */
+  __pyx_v_7_cython_6cygrpc_g_greenlets_to_run.pop();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":90
+ *   Py_DECREF(to_call)
+ *   g_greenlets_to_run.pop()
+ *   del lk             # <<<<<<<<<<<<<<
+ *   return to_call
+ * 
+ */
+  delete __pyx_v_lk;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":91
+ *   g_greenlets_to_run.pop()
+ *   del lk
+ *   return to_call             # <<<<<<<<<<<<<<
+ * 
+ * def spawn_greenlets():
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_to_call);
+  __pyx_r = __pyx_v_to_call;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":71
+ * 
+ * 
+ * cdef object await_next_greenlet():             # <<<<<<<<<<<<<<
+ *   cdef unique_lock[mutex]* lk
+ *   with nogil:
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_to_call);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":93
+ *   return to_call
+ * 
+ * def spawn_greenlets():             # <<<<<<<<<<<<<<
+ *   while True:
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_79spawn_greenlets(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_79spawn_greenlets = {"spawn_greenlets", (PyCFunction)__pyx_pw_7_cython_6cygrpc_79spawn_greenlets, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_79spawn_greenlets(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("spawn_greenlets (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_78spawn_greenlets(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_78spawn_greenlets(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_v_to_call = NULL;
+  PyObject *__pyx_v_fn = NULL;
+  PyObject *__pyx_v_args = 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;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("spawn_greenlets", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":94
+ * 
+ * def spawn_greenlets():
+ *   while True:             # <<<<<<<<<<<<<<
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())
+ *     if to_call is None:
+ */
+  while (1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":95
+ * def spawn_greenlets():
+ *   while True:
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())             # <<<<<<<<<<<<<<
+ *     if to_call is None:
+ *       break
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_g_gevent_threadpool); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 95, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_apply); if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 95, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(__pyx_f_7_cython_6cygrpc_await_next_greenlet); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 95, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_2, __pyx_empty_tuple};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 95, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_XDECREF_SET(__pyx_v_to_call, __pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":96
+ *   while True:
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())
+ *     if to_call is None:             # <<<<<<<<<<<<<<
+ *       break
+ *     fn = to_call[0]
+ */
+    __pyx_t_6 = (__pyx_v_to_call == Py_None);
+    if (__pyx_t_6) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":97
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())
+ *     if to_call is None:
+ *       break             # <<<<<<<<<<<<<<
+ *     fn = to_call[0]
+ *     args = to_call[1:]
+ */
+      goto __pyx_L4_break;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":96
+ *   while True:
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())
+ *     if to_call is None:             # <<<<<<<<<<<<<<
+ *       break
+ *     fn = to_call[0]
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":98
+ *     if to_call is None:
+ *       break
+ *     fn = to_call[0]             # <<<<<<<<<<<<<<
+ *     args = to_call[1:]
+ *     fn(*args)
+ */
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_to_call, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 98, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_XDECREF_SET(__pyx_v_fn, __pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":99
+ *       break
+ *     fn = to_call[0]
+ *     args = to_call[1:]             # <<<<<<<<<<<<<<
+ *     fn(*args)
+ * 
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_v_to_call, 1, 0, NULL, NULL, &__pyx_slice__37, 1, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 99, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_XDECREF_SET(__pyx_v_args, __pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":100
+ *     fn = to_call[0]
+ *     args = to_call[1:]
+ *     fn(*args)             # <<<<<<<<<<<<<<
+ * 
+ * def run_spawn_greenlets():
+ */
+    __pyx_t_1 = __Pyx_PySequence_Tuple(__pyx_v_args); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 100, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_v_fn, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 100, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_L4_break:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":93
+ *   return to_call
+ * 
+ * def spawn_greenlets():             # <<<<<<<<<<<<<<
+ *   while True:
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())
+ */
+
+  /* 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_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.spawn_greenlets", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_to_call);
+  __Pyx_XDECREF(__pyx_v_fn);
+  __Pyx_XDECREF(__pyx_v_args);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":102
+ *     fn(*args)
+ * 
+ * def run_spawn_greenlets():             # <<<<<<<<<<<<<<
+ *   g_gevent_pool.spawn(spawn_greenlets)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_81run_spawn_greenlets(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_81run_spawn_greenlets = {"run_spawn_greenlets", (PyCFunction)__pyx_pw_7_cython_6cygrpc_81run_spawn_greenlets, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_81run_spawn_greenlets(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("run_spawn_greenlets (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_80run_spawn_greenlets(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_80run_spawn_greenlets(CYTHON_UNUSED PyObject *__pyx_self) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("run_spawn_greenlets", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":103
+ * 
+ * def run_spawn_greenlets():
+ *   g_gevent_pool.spawn(spawn_greenlets)             # <<<<<<<<<<<<<<
+ * 
+ * def shutdown_await_next_greenlet():
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_g_gevent_pool); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_spawn); if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_spawn_greenlets); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 103, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":102
+ *     fn(*args)
+ * 
+ * def run_spawn_greenlets():             # <<<<<<<<<<<<<<
+ *   g_gevent_pool.spawn(spawn_greenlets)
+ * 
+ */
+
+  /* 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_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.run_spawn_greenlets", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":105
+ *   g_gevent_pool.spawn(spawn_greenlets)
+ * 
+ * def shutdown_await_next_greenlet():             # <<<<<<<<<<<<<<
+ *   global g_shutdown_greenlets_to_run_queue
+ *   cdef unique_lock[mutex]* lk
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_83shutdown_await_next_greenlet(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_83shutdown_await_next_greenlet = {"shutdown_await_next_greenlet", (PyCFunction)__pyx_pw_7_cython_6cygrpc_83shutdown_await_next_greenlet, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_83shutdown_await_next_greenlet(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("shutdown_await_next_greenlet (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_82shutdown_await_next_greenlet(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_82shutdown_await_next_greenlet(CYTHON_UNUSED PyObject *__pyx_self) {
+  std::unique_lock<std::mutex>  *__pyx_v_lk;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("shutdown_await_next_greenlet", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":108
+ *   global g_shutdown_greenlets_to_run_queue
+ *   cdef unique_lock[mutex]* lk
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_shutdown_greenlets_to_run_queue = True
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":109
+ *   cdef unique_lock[mutex]* lk
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)             # <<<<<<<<<<<<<<
+ *     g_shutdown_greenlets_to_run_queue = True
+ *   del lk
+ */
+        __pyx_v_lk = new std::unique_lock<std::mutex> (__pyx_v_7_cython_6cygrpc_g_greenlets_mu);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":110
+ *   with nogil:
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_shutdown_greenlets_to_run_queue = True             # <<<<<<<<<<<<<<
+ *   del lk
+ *   g_greenlets_cv.notify_all()
+ */
+        __pyx_v_7_cython_6cygrpc_g_shutdown_greenlets_to_run_queue = 1;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":108
+ *   global g_shutdown_greenlets_to_run_queue
+ *   cdef unique_lock[mutex]* lk
+ *   with nogil:             # <<<<<<<<<<<<<<
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_shutdown_greenlets_to_run_queue = True
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":111
+ *     lk = new unique_lock[mutex](g_greenlets_mu)
+ *     g_shutdown_greenlets_to_run_queue = True
+ *   del lk             # <<<<<<<<<<<<<<
+ *   g_greenlets_cv.notify_all()
+ * 
+ */
+  delete __pyx_v_lk;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":112
+ *     g_shutdown_greenlets_to_run_queue = True
+ *   del lk
+ *   g_greenlets_cv.notify_all()             # <<<<<<<<<<<<<<
+ * 
+ * def init_grpc_gevent():
+ */
+  __pyx_v_7_cython_6cygrpc_g_greenlets_cv.notify_all();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":105
+ *   g_gevent_pool.spawn(spawn_greenlets)
+ * 
+ * def shutdown_await_next_greenlet():             # <<<<<<<<<<<<<<
+ *   global g_shutdown_greenlets_to_run_queue
+ *   cdef unique_lock[mutex]* lk
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":114
+ *   g_greenlets_cv.notify_all()
+ * 
+ * def init_grpc_gevent():             # <<<<<<<<<<<<<<
+ *   # Lazily import gevent
+ *   global gevent_hub
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_85init_grpc_gevent(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_85init_grpc_gevent = {"init_grpc_gevent", (PyCFunction)__pyx_pw_7_cython_6cygrpc_85init_grpc_gevent, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_85init_grpc_gevent(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("init_grpc_gevent (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_84init_grpc_gevent(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_84init_grpc_gevent(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_v_gevent = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("init_grpc_gevent", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":122
+ *   global g_gevent_pool
+ * 
+ *   import gevent             # <<<<<<<<<<<<<<
+ *   import gevent.pool
+ * 
+ */
+  __pyx_t_1 = __Pyx_ImportDottedModule(__pyx_n_s_gevent, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 122, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_gevent = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":123
+ * 
+ *   import gevent
+ *   import gevent.pool             # <<<<<<<<<<<<<<
+ * 
+ *   gevent_hub = gevent.hub
+ */
+  __pyx_t_1 = __Pyx_Import(__pyx_n_s_gevent_pool, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF_SET(__pyx_v_gevent, __pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":125
+ *   import gevent.pool
+ * 
+ *   gevent_hub = gevent.hub             # <<<<<<<<<<<<<<
+ *   g_gevent_threadpool = gevent_hub.get_hub().threadpool
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_gevent, __pyx_n_s_hub); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 125, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_gevent_hub, __pyx_t_1) < 0) __PYX_ERR(28, 125, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":126
+ * 
+ *   gevent_hub = gevent.hub
+ *   g_gevent_threadpool = gevent_hub.get_hub().threadpool             # <<<<<<<<<<<<<<
+ * 
+ *   g_gevent_activated = True
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_gevent_hub); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 126, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get_hub); if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 126, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 126, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_threadpool); if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 126, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_g_gevent_threadpool, __pyx_t_3) < 0) __PYX_ERR(28, 126, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":128
+ *   g_gevent_threadpool = gevent_hub.get_hub().threadpool
+ * 
+ *   g_gevent_activated = True             # <<<<<<<<<<<<<<
+ *   g_interrupt_check_period_ms = 2000
+ * 
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_g_gevent_activated, Py_True) < 0) __PYX_ERR(28, 128, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":129
+ * 
+ *   g_gevent_activated = True
+ *   g_interrupt_check_period_ms = 2000             # <<<<<<<<<<<<<<
+ * 
+ *   g_gevent_pool = gevent.pool.Group()
+ */
+  __pyx_v_7_cython_6cygrpc_g_interrupt_check_period_ms = 0x7D0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":131
+ *   g_interrupt_check_period_ms = 2000
+ * 
+ *   g_gevent_pool = gevent.pool.Group()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_gevent, __pyx_n_s_pool); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 131, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Group); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 131, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 131, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_g_gevent_pool, __pyx_t_3) < 0) __PYX_ERR(28, 131, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":134
+ * 
+ * 
+ *   set_async_callback_func(_submit_to_greenlet_queue)             # <<<<<<<<<<<<<<
+ * 
+ *   # TODO: Document how this all works.
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_set_async_callback_func); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 134, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = __Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(__pyx_f_7_cython_6cygrpc__submit_to_greenlet_queue); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 134, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_1};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 134, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":137
+ * 
+ *   # TODO: Document how this all works.
+ *   atexit.register(shutdown_await_next_greenlet)             # <<<<<<<<<<<<<<
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_atexit); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 137, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_register); if (unlikely(!__pyx_t_1)) __PYX_ERR(28, 137, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_shutdown_await_next_greenlet); if (unlikely(!__pyx_t_2)) __PYX_ERR(28, 137, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_5 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_5)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_5);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_2};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(28, 137, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":114
+ *   g_greenlets_cv.notify_all()
+ * 
+ * def init_grpc_gevent():             # <<<<<<<<<<<<<<
+ *   # Lazily import gevent
+ *   global gevent_hub
+ */
+
+  /* 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_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc.init_grpc_gevent", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_gevent);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * def _contextvars_supported():             # <<<<<<<<<<<<<<
+ *     """Determines if the contextvars module is supported.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_87_contextvars_supported(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_86_contextvars_supported, "Determines if the contextvars module is supported.\n\n    We use a 'try it and see if it works approach' here rather than predicting\n    based on interpreter version in order to support older interpreters that\n    may have a backported module based on, e.g. `threading.local`.\n\n    Returns:\n      A bool indicating whether `contextvars` are supported in the current\n      environment.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_87_contextvars_supported = {"_contextvars_supported", (PyCFunction)__pyx_pw_7_cython_6cygrpc_87_contextvars_supported, METH_NOARGS, __pyx_doc_7_cython_6cygrpc_86_contextvars_supported};
+static PyObject *__pyx_pw_7_cython_6cygrpc_87_contextvars_supported(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_contextvars_supported (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_86_contextvars_supported(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_86_contextvars_supported(CYTHON_UNUSED PyObject *__pyx_self) {
+  CYTHON_UNUSED PyObject *__pyx_v_contextvars = 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;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_contextvars_supported", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":26
+ *       environment.
+ *     """
+ *     try:             # <<<<<<<<<<<<<<
+ *         import contextvars
+ *         return True
+ */
+  {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":27
+ *     """
+ *     try:
+ *         import contextvars             # <<<<<<<<<<<<<<
+ *         return True
+ *     except ImportError:
+ */
+      __pyx_t_4 = __Pyx_ImportDottedModule(__pyx_n_s_contextvars, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(29, 27, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_v_contextvars = __pyx_t_4;
+      __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":28
+ *     try:
+ *         import contextvars
+ *         return True             # <<<<<<<<<<<<<<
+ *     except ImportError:
+ *         return False
+ */
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(Py_True);
+      __pyx_r = Py_True;
+      goto __pyx_L7_try_return;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":26
+ *       environment.
+ *     """
+ *     try:             # <<<<<<<<<<<<<<
+ *         import contextvars
+ *         return True
+ */
+    }
+    __pyx_L3_error:;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":29
+ *         import contextvars
+ *         return True
+ *     except ImportError:             # <<<<<<<<<<<<<<
+ *         return False
+ * 
+ */
+    __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_ImportError);
+    if (__pyx_t_5) {
+      __Pyx_AddTraceback("_cython.cygrpc._contextvars_supported", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(29, 29, __pyx_L5_except_error)
+      __Pyx_XGOTREF(__pyx_t_4);
+      __Pyx_XGOTREF(__pyx_t_6);
+      __Pyx_XGOTREF(__pyx_t_7);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":30
+ *         return True
+ *     except ImportError:
+ *         return False             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(Py_False);
+      __pyx_r = Py_False;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L6_except_return;
+    }
+    goto __pyx_L5_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":26
+ *       environment.
+ *     """
+ *     try:             # <<<<<<<<<<<<<<
+ *         import contextvars
+ *         return True
+ */
+    __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_L7_try_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_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;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * def _contextvars_supported():             # <<<<<<<<<<<<<<
+ *     """Determines if the contextvars module is supported.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_cython.cygrpc._contextvars_supported", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_contextvars);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":33
+ * 
+ * 
+ * def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *     """Runs a callable with contextvars propagated.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_89_run_with_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_88_run_with_context, "Runs a callable with contextvars propagated.\n\n    If contextvars are supported, the calling thread's context will be copied\n    and propagated. If they are not supported, this function is equivalent\n    to the identity function.\n\n    Args:\n      target: A callable object to wrap.\n    Returns:\n      A callable object with the same signature as `target` but with\n        contextvars propagated.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_89_run_with_context = {"_run_with_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_89_run_with_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_88_run_with_context};
+static PyObject *__pyx_pw_7_cython_6cygrpc_89_run_with_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v_target = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_run_with_context (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_target,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_target)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(29, 33, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_run_with_context") < 0)) __PYX_ERR(29, 33, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_target = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_run_with_context", 1, 1, 1, __pyx_nargs); __PYX_ERR(29, 33, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._run_with_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_88_run_with_context(__pyx_self, __pyx_v_target);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_88_run_with_context(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_target) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_run_with_context", 1);
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":50
+ * if _contextvars_supported():
+ *     import contextvars
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_91_run_with_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_91_run_with_context = {"_run_with_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_91_run_with_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_91_run_with_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_target = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_run_with_context (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_target,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_target)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(29, 50, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_run_with_context") < 0)) __PYX_ERR(29, 50, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_target = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_run_with_context", 1, 1, 1, __pyx_nargs); __PYX_ERR(29, 50, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._run_with_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_90_run_with_context(__pyx_self, __pyx_v_target);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":52
+ *     def _run_with_context(target):
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):             # <<<<<<<<<<<<<<
+ *             ctx.run(target, *args)
+ *         return _run
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17_run_with_context_1_run(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17_run_with_context_1_run = {"_run", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7_cython_6cygrpc_17_run_with_context_1_run, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17_run_with_context_1_run(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_args = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_run (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_run", 0))) return NULL;
+  __Pyx_INCREF(__pyx_args);
+  __pyx_v_args = __pyx_args;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17_run_with_context__run(__pyx_self, __pyx_v_args);
+
+  /* function exit code */
+  __Pyx_DECREF(__pyx_v_args);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17_run_with_context__run(PyObject *__pyx_self, PyObject *__pyx_v_args) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *__pyx_outer_scope;
+  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("_run", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":53
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):
+ *             ctx.run(target, *args)             # <<<<<<<<<<<<<<
+ *         return _run
+ * else:
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_ctx)) { __Pyx_RaiseClosureNameError("ctx"); __PYX_ERR(29, 53, __pyx_L1_error) }
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_ctx, __pyx_n_s_run); if (unlikely(!__pyx_t_1)) __PYX_ERR(29, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (unlikely(!__pyx_cur_scope->__pyx_v_target)) { __Pyx_RaiseClosureNameError("target"); __PYX_ERR(29, 53, __pyx_L1_error) }
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(29, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_target);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_target);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_target)) __PYX_ERR(29, 53, __pyx_L1_error);
+  __pyx_t_3 = PyNumber_Add(__pyx_t_2, __pyx_v_args); if (unlikely(!__pyx_t_3)) __PYX_ERR(29, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(29, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":52
+ *     def _run_with_context(target):
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):             # <<<<<<<<<<<<<<
+ *             ctx.run(target, *args)
+ *         return _run
+ */
+
+  /* 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("_cython.cygrpc._run_with_context._run", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":50
+ * if _contextvars_supported():
+ *     import contextvars
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):
+ */
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_90_run_with_context(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_target) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *__pyx_cur_scope;
+  PyObject *__pyx_v__run = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("_run_with_context", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(29, 50, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_target = __pyx_v_target;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_target);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_target);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":51
+ *     import contextvars
+ *     def _run_with_context(target):
+ *         ctx = contextvars.copy_context()             # <<<<<<<<<<<<<<
+ *         def _run(*args):
+ *             ctx.run(target, *args)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_contextvars); if (unlikely(!__pyx_t_2)) __PYX_ERR(29, 51, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_copy_context); if (unlikely(!__pyx_t_3)) __PYX_ERR(29, 51, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(29, 51, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_ctx = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":52
+ *     def _run_with_context(target):
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):             # <<<<<<<<<<<<<<
+ *             ctx.run(target, *args)
+ *         return _run
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17_run_with_context_1_run, 0, __pyx_n_s_run_with_context_locals__run, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__41)); if (unlikely(!__pyx_t_1)) __PYX_ERR(29, 52, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v__run = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":54
+ *         def _run(*args):
+ *             ctx.run(target, *args)
+ *         return _run             # <<<<<<<<<<<<<<
+ * else:
+ *     def _run_with_context(target):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v__run);
+  __pyx_r = __pyx_v__run;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":50
+ * if _contextvars_supported():
+ *     import contextvars
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._run_with_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v__run);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":56
+ *         return _run
+ * else:
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         def _run(*args):
+ *             target(*args)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_93_run_with_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_93_run_with_context = {"_run_with_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_93_run_with_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_93_run_with_context(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_target = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_run_with_context (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_target,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_target)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(29, 56, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_run_with_context") < 0)) __PYX_ERR(29, 56, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_target = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_run_with_context", 1, 1, 1, __pyx_nargs); __PYX_ERR(29, 56, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._run_with_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_92_run_with_context(__pyx_self, __pyx_v_target);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":57
+ * else:
+ *     def _run_with_context(target):
+ *         def _run(*args):             # <<<<<<<<<<<<<<
+ *             target(*args)
+ *         return _run
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17_run_with_context_3_run(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17_run_with_context_3_run = {"_run", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7_cython_6cygrpc_17_run_with_context_3_run, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17_run_with_context_3_run(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_args = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_run (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_run", 0))) return NULL;
+  __Pyx_INCREF(__pyx_args);
+  __pyx_v_args = __pyx_args;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17_run_with_context_2_run(__pyx_self, __pyx_v_args);
+
+  /* function exit code */
+  __Pyx_DECREF(__pyx_v_args);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17_run_with_context_2_run(PyObject *__pyx_self, PyObject *__pyx_v_args) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *__pyx_outer_scope;
+  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("_run", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":58
+ *     def _run_with_context(target):
+ *         def _run(*args):
+ *             target(*args)             # <<<<<<<<<<<<<<
+ *         return _run
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_target)) { __Pyx_RaiseClosureNameError("target"); __PYX_ERR(29, 58, __pyx_L1_error) }
+  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_cur_scope->__pyx_v_target, __pyx_v_args, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(29, 58, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":57
+ * else:
+ *     def _run_with_context(target):
+ *         def _run(*args):             # <<<<<<<<<<<<<<
+ *             target(*args)
+ *         return _run
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._run_with_context._run", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":56
+ *         return _run
+ * else:
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         def _run(*args):
+ *             target(*args)
+ */
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_92_run_with_context(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_target) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *__pyx_cur_scope;
+  PyObject *__pyx_v__run = 0;
+  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("_run_with_context", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(29, 56, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_target = __pyx_v_target;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_target);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_target);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":57
+ * else:
+ *     def _run_with_context(target):
+ *         def _run(*args):             # <<<<<<<<<<<<<<
+ *             target(*args)
+ *         return _run
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17_run_with_context_3_run, 0, __pyx_n_s_run_with_context_locals__run, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_1)) __PYX_ERR(29, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v__run = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":59
+ *         def _run(*args):
+ *             target(*args)
+ *         return _run             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v__run);
+  __pyx_r = __pyx_v__run;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":56
+ *         return _run
+ * else:
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         def _run(*args):
+ *             target(*args)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._run_with_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v__run);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":38
+ * _fork_handler_failed = False
+ * 
+ * cdef void __prefork() noexcept nogil:             # <<<<<<<<<<<<<<
+ *     with gil:
+ *         global _fork_handler_failed
+ */
+
+static void __pyx_f_7_cython_6cygrpc___prefork(void) {
+  __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;
+  unsigned int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save;
+  #endif
+  __Pyx_RefNannySetupContext("__prefork", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":39
+ * 
+ * cdef void __prefork() noexcept nogil:
+ *     with gil:             # <<<<<<<<<<<<<<
+ *         global _fork_handler_failed
+ *         _fork_handler_failed = False
+ */
+  {
+      #ifdef WITH_THREAD
+      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":41
+ *     with gil:
+ *         global _fork_handler_failed
+ *         _fork_handler_failed = False             # <<<<<<<<<<<<<<
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = True
+ */
+        if (PyDict_SetItem(__pyx_d, __pyx_n_s_fork_handler_failed, Py_False) < 0) __PYX_ERR(1, 41, __pyx_L4_error)
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":42
+ *         global _fork_handler_failed
+ *         _fork_handler_failed = False
+ *         with _fork_state.fork_in_progress_condition:             # <<<<<<<<<<<<<<
+ *             _fork_state.fork_in_progress = True
+ *         if not _fork_state.active_thread_count.await_zero_threads(
+ */
+        /*with:*/ {
+          __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 42, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_fork_in_progress_condition); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 42, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_t_2, __pyx_n_s_exit); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 42, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_4 = __Pyx_PyObject_LookupSpecial(__pyx_t_2, __pyx_n_s_enter); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 42, __pyx_L6_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_5 = NULL;
+          __pyx_t_6 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (likely(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;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+            __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+            if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 42, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          /*try:*/ {
+            {
+              __Pyx_PyThreadState_declare
+              __Pyx_PyThreadState_assign
+              __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
+              __Pyx_XGOTREF(__pyx_t_7);
+              __Pyx_XGOTREF(__pyx_t_8);
+              __Pyx_XGOTREF(__pyx_t_9);
+              /*try:*/ {
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":43
+ *         _fork_handler_failed = False
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = True             # <<<<<<<<<<<<<<
+ *         if not _fork_state.active_thread_count.await_zero_threads(
+ *                 _AWAIT_THREADS_TIMEOUT_SECONDS):
+ */
+                __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 43, __pyx_L10_error)
+                __Pyx_GOTREF(__pyx_t_2);
+                if (__Pyx_PyObject_SetAttrStr(__pyx_t_2, __pyx_n_s_fork_in_progress, Py_True) < 0) __PYX_ERR(1, 43, __pyx_L10_error)
+                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":42
+ *         global _fork_handler_failed
+ *         _fork_handler_failed = False
+ *         with _fork_state.fork_in_progress_condition:             # <<<<<<<<<<<<<<
+ *             _fork_state.fork_in_progress = True
+ *         if not _fork_state.active_thread_count.await_zero_threads(
+ */
+              }
+              __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+              __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+              __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+              goto __pyx_L15_try_end;
+              __pyx_L10_error:;
+              __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+              /*except:*/ {
+                __Pyx_AddTraceback("_cython.cygrpc.__prefork", __pyx_clineno, __pyx_lineno, __pyx_filename);
+                if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) __PYX_ERR(1, 42, __pyx_L12_except_error)
+                __Pyx_XGOTREF(__pyx_t_2);
+                __Pyx_XGOTREF(__pyx_t_1);
+                __Pyx_XGOTREF(__pyx_t_4);
+                __pyx_t_5 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 42, __pyx_L12_except_error)
+                __Pyx_GOTREF(__pyx_t_5);
+                __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+                if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 42, __pyx_L12_except_error)
+                __Pyx_GOTREF(__pyx_t_10);
+                __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10);
+                __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+                if (__pyx_t_11 < 0) __PYX_ERR(1, 42, __pyx_L12_except_error)
+                __pyx_t_12 = (!__pyx_t_11);
+                if (unlikely(__pyx_t_12)) {
+                  __Pyx_GIVEREF(__pyx_t_2);
+                  __Pyx_GIVEREF(__pyx_t_1);
+                  __Pyx_XGIVEREF(__pyx_t_4);
+                  __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_1, __pyx_t_4);
+                  __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
+                  __PYX_ERR(1, 42, __pyx_L12_except_error)
+                }
+                __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+                __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+                __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                goto __pyx_L11_exception_handled;
+              }
+              __pyx_L12_except_error:;
+              __Pyx_XGIVEREF(__pyx_t_7);
+              __Pyx_XGIVEREF(__pyx_t_8);
+              __Pyx_XGIVEREF(__pyx_t_9);
+              __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+              goto __pyx_L4_error;
+              __pyx_L11_exception_handled:;
+              __Pyx_XGIVEREF(__pyx_t_7);
+              __Pyx_XGIVEREF(__pyx_t_8);
+              __Pyx_XGIVEREF(__pyx_t_9);
+              __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+              __pyx_L15_try_end:;
+            }
+          }
+          /*finally:*/ {
+            /*normal exit:*/{
+              if (__pyx_t_3) {
+                __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__11, NULL);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 42, __pyx_L4_error)
+                __Pyx_GOTREF(__pyx_t_9);
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              }
+              goto __pyx_L9;
+            }
+            __pyx_L9:;
+          }
+          goto __pyx_L19;
+          __pyx_L6_error:;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          goto __pyx_L4_error;
+          __pyx_L19:;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":44
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = True
+ *         if not _fork_state.active_thread_count.await_zero_threads(             # <<<<<<<<<<<<<<
+ *                 _AWAIT_THREADS_TIMEOUT_SECONDS):
+ *             _LOGGER.error(
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 44, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_active_thread_count); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 44, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_await_zero_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 44, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":45
+ *             _fork_state.fork_in_progress = True
+ *         if not _fork_state.active_thread_count.await_zero_threads(
+ *                 _AWAIT_THREADS_TIMEOUT_SECONDS):             # <<<<<<<<<<<<<<
+ *             _LOGGER.error(
+ *                 'Failed to shutdown gRPC Python threads prior to fork. '
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_AWAIT_THREADS_TIMEOUT_SECONDS); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 45, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_5 = NULL;
+        __pyx_t_6 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(PyMethod_Check(__pyx_t_1))) {
+          __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
+          if (likely(__pyx_t_5)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+            __Pyx_INCREF(__pyx_t_5);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_1, function);
+            __pyx_t_6 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_2};
+          __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 44, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":44
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = True
+ *         if not _fork_state.active_thread_count.await_zero_threads(             # <<<<<<<<<<<<<<
+ *                 _AWAIT_THREADS_TIMEOUT_SECONDS):
+ *             _LOGGER.error(
+ */
+        __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(1, 44, __pyx_L4_error)
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __pyx_t_11 = (!__pyx_t_12);
+        if (__pyx_t_11) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":46
+ *         if not _fork_state.active_thread_count.await_zero_threads(
+ *                 _AWAIT_THREADS_TIMEOUT_SECONDS):
+ *             _LOGGER.error(             # <<<<<<<<<<<<<<
+ *                 'Failed to shutdown gRPC Python threads prior to fork. '
+ *                 'Behavior after fork will be undefined.')
+ */
+          __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 46, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_error); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 46, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_1 = NULL;
+          __pyx_t_6 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (unlikely(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);
+              __pyx_t_6 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_kp_s_Failed_to_shutdown_gRPC_Python_t};
+            __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+            __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+            if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 46, __pyx_L4_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":49
+ *                 'Failed to shutdown gRPC Python threads prior to fork. '
+ *                 'Behavior after fork will be undefined.')
+ *             _fork_handler_failed = True             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+          if (PyDict_SetItem(__pyx_d, __pyx_n_s_fork_handler_failed, Py_True) < 0) __PYX_ERR(1, 49, __pyx_L4_error)
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":44
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = True
+ *         if not _fork_state.active_thread_count.await_zero_threads(             # <<<<<<<<<<<<<<
+ *                 _AWAIT_THREADS_TIMEOUT_SECONDS):
+ *             _LOGGER.error(
+ */
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":39
+ * 
+ * cdef void __prefork() noexcept nogil:
+ *     with gil:             # <<<<<<<<<<<<<<
+ *         global _fork_handler_failed
+ *         _fork_handler_failed = False
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L4_error: {
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L1_error;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":38
+ * _fork_handler_failed = False
+ * 
+ * cdef void __prefork() noexcept nogil:             # <<<<<<<<<<<<<<
+ *     with gil:
+ *         global _fork_handler_failed
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  #ifdef WITH_THREAD
+  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_WriteUnraisable("_cython.cygrpc.__prefork", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContextNogil()
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":52
+ * 
+ * 
+ * cdef void __postfork_parent() noexcept nogil:             # <<<<<<<<<<<<<<
+ *     with gil:
+ *         with _fork_state.fork_in_progress_condition:
+ */
+
+static void __pyx_f_7_cython_6cygrpc___postfork_parent(void) {
+  __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;
+  unsigned int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save;
+  #endif
+  __Pyx_RefNannySetupContext("__postfork_parent", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":53
+ * 
+ * cdef void __postfork_parent() noexcept nogil:
+ *     with gil:             # <<<<<<<<<<<<<<
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = False
+ */
+  {
+      #ifdef WITH_THREAD
+      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":54
+ * cdef void __postfork_parent() noexcept nogil:
+ *     with gil:
+ *         with _fork_state.fork_in_progress_condition:             # <<<<<<<<<<<<<<
+ *             _fork_state.fork_in_progress = False
+ *             _fork_state.fork_in_progress_condition.notify_all()
+ */
+        /*with:*/ {
+          __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 54, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_fork_in_progress_condition); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 54, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_t_2, __pyx_n_s_exit); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 54, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_4 = __Pyx_PyObject_LookupSpecial(__pyx_t_2, __pyx_n_s_enter); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 54, __pyx_L6_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_5 = NULL;
+          __pyx_t_6 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (likely(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;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+            __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+            if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 54, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          /*try:*/ {
+            {
+              __Pyx_PyThreadState_declare
+              __Pyx_PyThreadState_assign
+              __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
+              __Pyx_XGOTREF(__pyx_t_7);
+              __Pyx_XGOTREF(__pyx_t_8);
+              __Pyx_XGOTREF(__pyx_t_9);
+              /*try:*/ {
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":55
+ *     with gil:
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = False             # <<<<<<<<<<<<<<
+ *             _fork_state.fork_in_progress_condition.notify_all()
+ * 
+ */
+                __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 55, __pyx_L10_error)
+                __Pyx_GOTREF(__pyx_t_2);
+                if (__Pyx_PyObject_SetAttrStr(__pyx_t_2, __pyx_n_s_fork_in_progress, Py_False) < 0) __PYX_ERR(1, 55, __pyx_L10_error)
+                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":56
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = False
+ *             _fork_state.fork_in_progress_condition.notify_all()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+                __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 56, __pyx_L10_error)
+                __Pyx_GOTREF(__pyx_t_1);
+                __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_fork_in_progress_condition); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 56, __pyx_L10_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+                __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_notify_all); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 56, __pyx_L10_error)
+                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+                __pyx_t_4 = NULL;
+                __pyx_t_6 = 0;
+                #if CYTHON_UNPACK_METHODS
+                if (likely(PyMethod_Check(__pyx_t_1))) {
+                  __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
+                  if (likely(__pyx_t_4)) {
+                    PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+                    __Pyx_INCREF(__pyx_t_4);
+                    __Pyx_INCREF(function);
+                    __Pyx_DECREF_SET(__pyx_t_1, function);
+                    __pyx_t_6 = 1;
+                  }
+                }
+                #endif
+                {
+                  PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+                  __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+                  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                  if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 56, __pyx_L10_error)
+                  __Pyx_GOTREF(__pyx_t_2);
+                  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+                }
+                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":54
+ * cdef void __postfork_parent() noexcept nogil:
+ *     with gil:
+ *         with _fork_state.fork_in_progress_condition:             # <<<<<<<<<<<<<<
+ *             _fork_state.fork_in_progress = False
+ *             _fork_state.fork_in_progress_condition.notify_all()
+ */
+              }
+              __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+              __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+              __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+              goto __pyx_L15_try_end;
+              __pyx_L10_error:;
+              __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+              /*except:*/ {
+                __Pyx_AddTraceback("_cython.cygrpc.__postfork_parent", __pyx_clineno, __pyx_lineno, __pyx_filename);
+                if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) __PYX_ERR(1, 54, __pyx_L12_except_error)
+                __Pyx_XGOTREF(__pyx_t_2);
+                __Pyx_XGOTREF(__pyx_t_1);
+                __Pyx_XGOTREF(__pyx_t_4);
+                __pyx_t_5 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 54, __pyx_L12_except_error)
+                __Pyx_GOTREF(__pyx_t_5);
+                __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+                if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 54, __pyx_L12_except_error)
+                __Pyx_GOTREF(__pyx_t_10);
+                __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10);
+                __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+                if (__pyx_t_11 < 0) __PYX_ERR(1, 54, __pyx_L12_except_error)
+                __pyx_t_12 = (!__pyx_t_11);
+                if (unlikely(__pyx_t_12)) {
+                  __Pyx_GIVEREF(__pyx_t_2);
+                  __Pyx_GIVEREF(__pyx_t_1);
+                  __Pyx_XGIVEREF(__pyx_t_4);
+                  __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_1, __pyx_t_4);
+                  __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
+                  __PYX_ERR(1, 54, __pyx_L12_except_error)
+                }
+                __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+                __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+                __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                goto __pyx_L11_exception_handled;
+              }
+              __pyx_L12_except_error:;
+              __Pyx_XGIVEREF(__pyx_t_7);
+              __Pyx_XGIVEREF(__pyx_t_8);
+              __Pyx_XGIVEREF(__pyx_t_9);
+              __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+              goto __pyx_L4_error;
+              __pyx_L11_exception_handled:;
+              __Pyx_XGIVEREF(__pyx_t_7);
+              __Pyx_XGIVEREF(__pyx_t_8);
+              __Pyx_XGIVEREF(__pyx_t_9);
+              __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+              __pyx_L15_try_end:;
+            }
+          }
+          /*finally:*/ {
+            /*normal exit:*/{
+              if (__pyx_t_3) {
+                __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__11, NULL);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 54, __pyx_L4_error)
+                __Pyx_GOTREF(__pyx_t_9);
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              }
+              goto __pyx_L9;
+            }
+            __pyx_L9:;
+          }
+          goto __pyx_L19;
+          __pyx_L6_error:;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          goto __pyx_L4_error;
+          __pyx_L19:;
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":53
+ * 
+ * cdef void __postfork_parent() noexcept nogil:
+ *     with gil:             # <<<<<<<<<<<<<<
+ *         with _fork_state.fork_in_progress_condition:
+ *             _fork_state.fork_in_progress = False
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L4_error: {
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L1_error;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":52
+ * 
+ * 
+ * cdef void __postfork_parent() noexcept nogil:             # <<<<<<<<<<<<<<
+ *     with gil:
+ *         with _fork_state.fork_in_progress_condition:
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  #ifdef WITH_THREAD
+  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_WriteUnraisable("_cython.cygrpc.__postfork_parent", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContextNogil()
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":59
+ * 
+ * 
+ * cdef void __postfork_child() noexcept nogil:             # <<<<<<<<<<<<<<
+ *     with gil:
+ *         try:
+ */
+
+static void __pyx_f_7_cython_6cygrpc___postfork_child(void) {
+  PyObject *__pyx_v_state_to_reset = NULL;
+  PyObject *__pyx_v_channel = 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;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  unsigned int __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
+  PyObject *(*__pyx_t_10)(PyObject *);
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  PyObject *__pyx_t_14 = NULL;
+  PyObject *__pyx_t_15 = NULL;
+  PyObject *__pyx_t_16 = NULL;
+  int __pyx_t_17;
+  PyObject *__pyx_t_18 = NULL;
+  PyObject *__pyx_t_19 = NULL;
+  PyObject *__pyx_t_20 = NULL;
+  PyObject *__pyx_t_21 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save;
+  #endif
+  __Pyx_RefNannySetupContext("__postfork_child", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":60
+ * 
+ * cdef void __postfork_child() noexcept nogil:
+ *     with gil:             # <<<<<<<<<<<<<<
+ *         try:
+ *             if _fork_handler_failed:
+ */
+  {
+      #ifdef WITH_THREAD
+      PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":61
+ * cdef void __postfork_child() noexcept nogil:
+ *     with gil:
+ *         try:             # <<<<<<<<<<<<<<
+ *             if _fork_handler_failed:
+ *                 return
+ */
+        {
+          __Pyx_PyThreadState_declare
+          __Pyx_PyThreadState_assign
+          __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:*/ {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":62
+ *     with gil:
+ *         try:
+ *             if _fork_handler_failed:             # <<<<<<<<<<<<<<
+ *                 return
+ *             # Thread could be holding the fork_in_progress_condition inside of
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_fork_handler_failed); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 62, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(1, 62, __pyx_L6_error)
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            if (__pyx_t_5) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":63
+ *         try:
+ *             if _fork_handler_failed:
+ *                 return             # <<<<<<<<<<<<<<
+ *             # Thread could be holding the fork_in_progress_condition inside of
+ *             # block_if_fork_in_progress() when fork occurs. Reset the lock here.
+ */
+              goto __pyx_L10_try_return;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":62
+ *     with gil:
+ *         try:
+ *             if _fork_handler_failed:             # <<<<<<<<<<<<<<
+ *                 return
+ *             # Thread could be holding the fork_in_progress_condition inside of
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":66
+ *             # Thread could be holding the fork_in_progress_condition inside of
+ *             # block_if_fork_in_progress() when fork occurs. Reset the lock here.
+ *             _fork_state.fork_in_progress_condition = threading.Condition()             # <<<<<<<<<<<<<<
+ *             # A thread in return_from_user_request_generator() may hold this lock
+ *             # when fork occurs.
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_threading); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 66, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_6);
+            __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_Condition); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 66, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+            __pyx_t_6 = NULL;
+            __pyx_t_8 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(PyMethod_Check(__pyx_t_7))) {
+              __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7);
+              if (likely(__pyx_t_6)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+                __Pyx_INCREF(__pyx_t_6);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_7, function);
+                __pyx_t_8 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+              __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+              __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+              if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 66, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_4);
+              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+            }
+            __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 66, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            if (__Pyx_PyObject_SetAttrStr(__pyx_t_7, __pyx_n_s_fork_in_progress_condition, __pyx_t_4) < 0) __PYX_ERR(1, 66, __pyx_L6_error)
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":69
+ *             # A thread in return_from_user_request_generator() may hold this lock
+ *             # when fork occurs.
+ *             _fork_state.active_thread_count = _ActiveThreadCount()             # <<<<<<<<<<<<<<
+ *             for state_to_reset in _fork_state.postfork_states_to_reset:
+ *                 state_to_reset.reset_postfork_child()
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ActiveThreadCount); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 69, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_6 = NULL;
+            __pyx_t_8 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(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_8 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+              __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+              __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+              if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 69, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_7);
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            }
+            __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 69, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            if (__Pyx_PyObject_SetAttrStr(__pyx_t_4, __pyx_n_s_active_thread_count, __pyx_t_7) < 0) __PYX_ERR(1, 69, __pyx_L6_error)
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":70
+ *             # when fork occurs.
+ *             _fork_state.active_thread_count = _ActiveThreadCount()
+ *             for state_to_reset in _fork_state.postfork_states_to_reset:             # <<<<<<<<<<<<<<
+ *                 state_to_reset.reset_postfork_child()
+ *             _fork_state.postfork_states_to_reset = []
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 70, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_postfork_states_to_reset); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 70, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            if (likely(PyList_CheckExact(__pyx_t_7)) || PyTuple_CheckExact(__pyx_t_7)) {
+              __pyx_t_4 = __pyx_t_7; __Pyx_INCREF(__pyx_t_4);
+              __pyx_t_9 = 0;
+              __pyx_t_10 = NULL;
+            } else {
+              __pyx_t_9 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 70, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_10 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 70, __pyx_L6_error)
+            }
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+            for (;;) {
+              if (likely(!__pyx_t_10)) {
+                if (likely(PyList_CheckExact(__pyx_t_4))) {
+                  {
+                    Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_4);
+                    #if !CYTHON_ASSUME_SAFE_MACROS
+                    if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 70, __pyx_L6_error)
+                    #endif
+                    if (__pyx_t_9 >= __pyx_temp) break;
+                  }
+                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                  __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++; if (unlikely((0 < 0))) __PYX_ERR(1, 70, __pyx_L6_error)
+                  #else
+                  __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 70, __pyx_L6_error)
+                  __Pyx_GOTREF(__pyx_t_7);
+                  #endif
+                } else {
+                  {
+                    Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4);
+                    #if !CYTHON_ASSUME_SAFE_MACROS
+                    if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 70, __pyx_L6_error)
+                    #endif
+                    if (__pyx_t_9 >= __pyx_temp) break;
+                  }
+                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                  __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++; if (unlikely((0 < 0))) __PYX_ERR(1, 70, __pyx_L6_error)
+                  #else
+                  __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 70, __pyx_L6_error)
+                  __Pyx_GOTREF(__pyx_t_7);
+                  #endif
+                }
+              } else {
+                __pyx_t_7 = __pyx_t_10(__pyx_t_4);
+                if (unlikely(!__pyx_t_7)) {
+                  PyObject* exc_type = PyErr_Occurred();
+                  if (exc_type) {
+                    if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+                    else __PYX_ERR(1, 70, __pyx_L6_error)
+                  }
+                  break;
+                }
+                __Pyx_GOTREF(__pyx_t_7);
+              }
+              __Pyx_XDECREF_SET(__pyx_v_state_to_reset, __pyx_t_7);
+              __pyx_t_7 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":71
+ *             _fork_state.active_thread_count = _ActiveThreadCount()
+ *             for state_to_reset in _fork_state.postfork_states_to_reset:
+ *                 state_to_reset.reset_postfork_child()             # <<<<<<<<<<<<<<
+ *             _fork_state.postfork_states_to_reset = []
+ *             _fork_state.fork_epoch += 1
+ */
+              __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_state_to_reset, __pyx_n_s_reset_postfork_child); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 71, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_6);
+              __pyx_t_11 = NULL;
+              __pyx_t_8 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (likely(PyMethod_Check(__pyx_t_6))) {
+                __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_6);
+                if (likely(__pyx_t_11)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+                  __Pyx_INCREF(__pyx_t_11);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_6, function);
+                  __pyx_t_8 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_11, NULL};
+                __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+                __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+                if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 71, __pyx_L6_error)
+                __Pyx_GOTREF(__pyx_t_7);
+                __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":70
+ *             # when fork occurs.
+ *             _fork_state.active_thread_count = _ActiveThreadCount()
+ *             for state_to_reset in _fork_state.postfork_states_to_reset:             # <<<<<<<<<<<<<<
+ *                 state_to_reset.reset_postfork_child()
+ *             _fork_state.postfork_states_to_reset = []
+ */
+            }
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":72
+ *             for state_to_reset in _fork_state.postfork_states_to_reset:
+ *                 state_to_reset.reset_postfork_child()
+ *             _fork_state.postfork_states_to_reset = []             # <<<<<<<<<<<<<<
+ *             _fork_state.fork_epoch += 1
+ *             for channel in _fork_state.channels:
+ */
+            __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 72, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 72, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            if (__Pyx_PyObject_SetAttrStr(__pyx_t_7, __pyx_n_s_postfork_states_to_reset, __pyx_t_4) < 0) __PYX_ERR(1, 72, __pyx_L6_error)
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":73
+ *                 state_to_reset.reset_postfork_child()
+ *             _fork_state.postfork_states_to_reset = []
+ *             _fork_state.fork_epoch += 1             # <<<<<<<<<<<<<<
+ *             for channel in _fork_state.channels:
+ *                 channel._close_on_fork()
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 73, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_fork_epoch); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 73, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+            __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_4, __pyx_int_1, 1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 73, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 73, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            if (__Pyx_PyObject_SetAttrStr(__pyx_t_4, __pyx_n_s_fork_epoch, __pyx_t_7) < 0) __PYX_ERR(1, 73, __pyx_L6_error)
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":74
+ *             _fork_state.postfork_states_to_reset = []
+ *             _fork_state.fork_epoch += 1
+ *             for channel in _fork_state.channels:             # <<<<<<<<<<<<<<
+ *                 channel._close_on_fork()
+ *             with _fork_state.fork_in_progress_condition:
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 74, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_channels); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 74, __pyx_L6_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            if (likely(PyList_CheckExact(__pyx_t_7)) || PyTuple_CheckExact(__pyx_t_7)) {
+              __pyx_t_4 = __pyx_t_7; __Pyx_INCREF(__pyx_t_4);
+              __pyx_t_9 = 0;
+              __pyx_t_10 = NULL;
+            } else {
+              __pyx_t_9 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 74, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_10 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 74, __pyx_L6_error)
+            }
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+            for (;;) {
+              if (likely(!__pyx_t_10)) {
+                if (likely(PyList_CheckExact(__pyx_t_4))) {
+                  {
+                    Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_4);
+                    #if !CYTHON_ASSUME_SAFE_MACROS
+                    if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 74, __pyx_L6_error)
+                    #endif
+                    if (__pyx_t_9 >= __pyx_temp) break;
+                  }
+                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                  __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++; if (unlikely((0 < 0))) __PYX_ERR(1, 74, __pyx_L6_error)
+                  #else
+                  __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 74, __pyx_L6_error)
+                  __Pyx_GOTREF(__pyx_t_7);
+                  #endif
+                } else {
+                  {
+                    Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4);
+                    #if !CYTHON_ASSUME_SAFE_MACROS
+                    if (unlikely((__pyx_temp < 0))) __PYX_ERR(1, 74, __pyx_L6_error)
+                    #endif
+                    if (__pyx_t_9 >= __pyx_temp) break;
+                  }
+                  #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                  __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++; if (unlikely((0 < 0))) __PYX_ERR(1, 74, __pyx_L6_error)
+                  #else
+                  __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 74, __pyx_L6_error)
+                  __Pyx_GOTREF(__pyx_t_7);
+                  #endif
+                }
+              } else {
+                __pyx_t_7 = __pyx_t_10(__pyx_t_4);
+                if (unlikely(!__pyx_t_7)) {
+                  PyObject* exc_type = PyErr_Occurred();
+                  if (exc_type) {
+                    if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+                    else __PYX_ERR(1, 74, __pyx_L6_error)
+                  }
+                  break;
+                }
+                __Pyx_GOTREF(__pyx_t_7);
+              }
+              __Pyx_XDECREF_SET(__pyx_v_channel, __pyx_t_7);
+              __pyx_t_7 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":75
+ *             _fork_state.fork_epoch += 1
+ *             for channel in _fork_state.channels:
+ *                 channel._close_on_fork()             # <<<<<<<<<<<<<<
+ *             with _fork_state.fork_in_progress_condition:
+ *                 _fork_state.fork_in_progress = False
+ */
+              __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_channel, __pyx_n_s_close_on_fork); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 75, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_6);
+              __pyx_t_11 = NULL;
+              __pyx_t_8 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (likely(PyMethod_Check(__pyx_t_6))) {
+                __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_6);
+                if (likely(__pyx_t_11)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+                  __Pyx_INCREF(__pyx_t_11);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_6, function);
+                  __pyx_t_8 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_11, NULL};
+                __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+                __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+                if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 75, __pyx_L6_error)
+                __Pyx_GOTREF(__pyx_t_7);
+                __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":74
+ *             _fork_state.postfork_states_to_reset = []
+ *             _fork_state.fork_epoch += 1
+ *             for channel in _fork_state.channels:             # <<<<<<<<<<<<<<
+ *                 channel._close_on_fork()
+ *             with _fork_state.fork_in_progress_condition:
+ */
+            }
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":76
+ *             for channel in _fork_state.channels:
+ *                 channel._close_on_fork()
+ *             with _fork_state.fork_in_progress_condition:             # <<<<<<<<<<<<<<
+ *                 _fork_state.fork_in_progress = False
+ *         except:
+ */
+            /*with:*/ {
+              __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 76, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_fork_in_progress_condition); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 76, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_7);
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __pyx_t_12 = __Pyx_PyObject_LookupSpecial(__pyx_t_7, __pyx_n_s_exit); if (unlikely(!__pyx_t_12)) __PYX_ERR(1, 76, __pyx_L6_error)
+              __Pyx_GOTREF(__pyx_t_12);
+              __pyx_t_6 = __Pyx_PyObject_LookupSpecial(__pyx_t_7, __pyx_n_s_enter); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 76, __pyx_L19_error)
+              __Pyx_GOTREF(__pyx_t_6);
+              __pyx_t_11 = NULL;
+              __pyx_t_8 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (likely(PyMethod_Check(__pyx_t_6))) {
+                __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_6);
+                if (likely(__pyx_t_11)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+                  __Pyx_INCREF(__pyx_t_11);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_6, function);
+                  __pyx_t_8 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_11, NULL};
+                __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+                __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+                if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 76, __pyx_L19_error)
+                __Pyx_GOTREF(__pyx_t_4);
+                __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+              /*try:*/ {
+                {
+                  __Pyx_PyThreadState_declare
+                  __Pyx_PyThreadState_assign
+                  __Pyx_ExceptionSave(&__pyx_t_13, &__pyx_t_14, &__pyx_t_15);
+                  __Pyx_XGOTREF(__pyx_t_13);
+                  __Pyx_XGOTREF(__pyx_t_14);
+                  __Pyx_XGOTREF(__pyx_t_15);
+                  /*try:*/ {
+
+                    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":77
+ *                 channel._close_on_fork()
+ *             with _fork_state.fork_in_progress_condition:
+ *                 _fork_state.fork_in_progress = False             # <<<<<<<<<<<<<<
+ *         except:
+ *             _LOGGER.error('Exiting child due to raised exception')
+ */
+                    __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 77, __pyx_L23_error)
+                    __Pyx_GOTREF(__pyx_t_7);
+                    if (__Pyx_PyObject_SetAttrStr(__pyx_t_7, __pyx_n_s_fork_in_progress, Py_False) < 0) __PYX_ERR(1, 77, __pyx_L23_error)
+                    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+                    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":76
+ *             for channel in _fork_state.channels:
+ *                 channel._close_on_fork()
+ *             with _fork_state.fork_in_progress_condition:             # <<<<<<<<<<<<<<
+ *                 _fork_state.fork_in_progress = False
+ *         except:
+ */
+                  }
+                  __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+                  __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
+                  __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
+                  goto __pyx_L28_try_end;
+                  __pyx_L23_error:;
+                  __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+                  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                  __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+                  __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+                  /*except:*/ {
+                    __Pyx_AddTraceback("_cython.cygrpc.__postfork_child", __pyx_clineno, __pyx_lineno, __pyx_filename);
+                    if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_4, &__pyx_t_6) < 0) __PYX_ERR(1, 76, __pyx_L25_except_error)
+                    __Pyx_XGOTREF(__pyx_t_7);
+                    __Pyx_XGOTREF(__pyx_t_4);
+                    __Pyx_XGOTREF(__pyx_t_6);
+                    __pyx_t_11 = PyTuple_Pack(3, __pyx_t_7, __pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 76, __pyx_L25_except_error)
+                    __Pyx_GOTREF(__pyx_t_11);
+                    __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_11, NULL);
+                    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+                    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+                    if (unlikely(!__pyx_t_16)) __PYX_ERR(1, 76, __pyx_L25_except_error)
+                    __Pyx_GOTREF(__pyx_t_16);
+                    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_16);
+                    __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+                    if (__pyx_t_5 < 0) __PYX_ERR(1, 76, __pyx_L25_except_error)
+                    __pyx_t_17 = (!__pyx_t_5);
+                    if (unlikely(__pyx_t_17)) {
+                      __Pyx_GIVEREF(__pyx_t_7);
+                      __Pyx_GIVEREF(__pyx_t_4);
+                      __Pyx_XGIVEREF(__pyx_t_6);
+                      __Pyx_ErrRestoreWithState(__pyx_t_7, __pyx_t_4, __pyx_t_6);
+                      __pyx_t_7 = 0; __pyx_t_4 = 0; __pyx_t_6 = 0; 
+                      __PYX_ERR(1, 76, __pyx_L25_except_error)
+                    }
+                    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+                    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+                    goto __pyx_L24_exception_handled;
+                  }
+                  __pyx_L25_except_error:;
+                  __Pyx_XGIVEREF(__pyx_t_13);
+                  __Pyx_XGIVEREF(__pyx_t_14);
+                  __Pyx_XGIVEREF(__pyx_t_15);
+                  __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15);
+                  goto __pyx_L6_error;
+                  __pyx_L24_exception_handled:;
+                  __Pyx_XGIVEREF(__pyx_t_13);
+                  __Pyx_XGIVEREF(__pyx_t_14);
+                  __Pyx_XGIVEREF(__pyx_t_15);
+                  __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15);
+                  __pyx_L28_try_end:;
+                }
+              }
+              /*finally:*/ {
+                /*normal exit:*/{
+                  if (__pyx_t_12) {
+                    __pyx_t_15 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_tuple__11, NULL);
+                    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+                    if (unlikely(!__pyx_t_15)) __PYX_ERR(1, 76, __pyx_L6_error)
+                    __Pyx_GOTREF(__pyx_t_15);
+                    __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+                  }
+                  goto __pyx_L22;
+                }
+                __pyx_L22:;
+              }
+              goto __pyx_L32;
+              __pyx_L19_error:;
+              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+              goto __pyx_L6_error;
+              __pyx_L32:;
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":61
+ * cdef void __postfork_child() noexcept nogil:
+ *     with gil:
+ *         try:             # <<<<<<<<<<<<<<
+ *             if _fork_handler_failed:
+ *                 return
+ */
+          }
+          __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_L11_try_end;
+          __pyx_L6_error:;
+          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+          __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":78
+ *             with _fork_state.fork_in_progress_condition:
+ *                 _fork_state.fork_in_progress = False
+ *         except:             # <<<<<<<<<<<<<<
+ *             _LOGGER.error('Exiting child due to raised exception')
+ *             _LOGGER.error(sys.exc_info()[0])
+ */
+          /*except:*/ {
+            __Pyx_AddTraceback("_cython.cygrpc.__postfork_child", __pyx_clineno, __pyx_lineno, __pyx_filename);
+            if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(1, 78, __pyx_L8_except_error)
+            __Pyx_XGOTREF(__pyx_t_6);
+            __Pyx_XGOTREF(__pyx_t_4);
+            __Pyx_XGOTREF(__pyx_t_7);
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":79
+ *                 _fork_state.fork_in_progress = False
+ *         except:
+ *             _LOGGER.error('Exiting child due to raised exception')             # <<<<<<<<<<<<<<
+ *             _LOGGER.error(sys.exc_info()[0])
+ *             os._exit(os.EX_USAGE)
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_18, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_18)) __PYX_ERR(1, 79, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_18);
+            __pyx_t_19 = __Pyx_PyObject_GetAttrStr(__pyx_t_18, __pyx_n_s_error); if (unlikely(!__pyx_t_19)) __PYX_ERR(1, 79, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_19);
+            __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+            __pyx_t_18 = NULL;
+            __pyx_t_8 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(PyMethod_Check(__pyx_t_19))) {
+              __pyx_t_18 = PyMethod_GET_SELF(__pyx_t_19);
+              if (likely(__pyx_t_18)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_19);
+                __Pyx_INCREF(__pyx_t_18);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_19, function);
+                __pyx_t_8 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_18, __pyx_kp_s_Exiting_child_due_to_raised_exce};
+              __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_19, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+              __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0;
+              if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 79, __pyx_L8_except_error)
+              __Pyx_GOTREF(__pyx_t_11);
+              __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":80
+ *         except:
+ *             _LOGGER.error('Exiting child due to raised exception')
+ *             _LOGGER.error(sys.exc_info()[0])             # <<<<<<<<<<<<<<
+ *             os._exit(os.EX_USAGE)
+ * 
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_19, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_19)) __PYX_ERR(1, 80, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_19);
+            __pyx_t_18 = __Pyx_PyObject_GetAttrStr(__pyx_t_19, __pyx_n_s_error); if (unlikely(!__pyx_t_18)) __PYX_ERR(1, 80, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_18);
+            __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+            __Pyx_GetModuleGlobalName(__pyx_t_20, __pyx_n_s_sys); if (unlikely(!__pyx_t_20)) __PYX_ERR(1, 80, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_20);
+            __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_20, __pyx_n_s_exc_info); if (unlikely(!__pyx_t_21)) __PYX_ERR(1, 80, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_21);
+            __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+            __pyx_t_20 = NULL;
+            __pyx_t_8 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(PyMethod_Check(__pyx_t_21))) {
+              __pyx_t_20 = PyMethod_GET_SELF(__pyx_t_21);
+              if (likely(__pyx_t_20)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_21);
+                __Pyx_INCREF(__pyx_t_20);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_21, function);
+                __pyx_t_8 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_20, NULL};
+              __pyx_t_19 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+              __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0;
+              if (unlikely(!__pyx_t_19)) __PYX_ERR(1, 80, __pyx_L8_except_error)
+              __Pyx_GOTREF(__pyx_t_19);
+              __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
+            }
+            __pyx_t_21 = __Pyx_GetItemInt(__pyx_t_19, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_21)) __PYX_ERR(1, 80, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_21);
+            __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+            __pyx_t_19 = NULL;
+            __pyx_t_8 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(PyMethod_Check(__pyx_t_18))) {
+              __pyx_t_19 = PyMethod_GET_SELF(__pyx_t_18);
+              if (likely(__pyx_t_19)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_18);
+                __Pyx_INCREF(__pyx_t_19);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_18, function);
+                __pyx_t_8 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_19, __pyx_t_21};
+              __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_18, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+              __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0;
+              __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
+              if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 80, __pyx_L8_except_error)
+              __Pyx_GOTREF(__pyx_t_11);
+              __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":81
+ *             _LOGGER.error('Exiting child due to raised exception')
+ *             _LOGGER.error(sys.exc_info()[0])
+ *             os._exit(os.EX_USAGE)             # <<<<<<<<<<<<<<
+ * 
+ *     if grpc_is_initialized() > 0:
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_18, __pyx_n_s_os); if (unlikely(!__pyx_t_18)) __PYX_ERR(1, 81, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_18);
+            __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_18, __pyx_n_s_exit_2); if (unlikely(!__pyx_t_21)) __PYX_ERR(1, 81, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_21);
+            __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+            __Pyx_GetModuleGlobalName(__pyx_t_18, __pyx_n_s_os); if (unlikely(!__pyx_t_18)) __PYX_ERR(1, 81, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_18);
+            __pyx_t_19 = __Pyx_PyObject_GetAttrStr(__pyx_t_18, __pyx_n_s_EX_USAGE); if (unlikely(!__pyx_t_19)) __PYX_ERR(1, 81, __pyx_L8_except_error)
+            __Pyx_GOTREF(__pyx_t_19);
+            __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+            __pyx_t_18 = NULL;
+            __pyx_t_8 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(PyMethod_Check(__pyx_t_21))) {
+              __pyx_t_18 = PyMethod_GET_SELF(__pyx_t_21);
+              if (likely(__pyx_t_18)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_21);
+                __Pyx_INCREF(__pyx_t_18);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_21, function);
+                __pyx_t_8 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_18, __pyx_t_19};
+              __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_21, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+              __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0;
+              __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+              if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 81, __pyx_L8_except_error)
+              __Pyx_GOTREF(__pyx_t_11);
+              __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+            goto __pyx_L7_exception_handled;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":61
+ * cdef void __postfork_child() noexcept nogil:
+ *     with gil:
+ *         try:             # <<<<<<<<<<<<<<
+ *             if _fork_handler_failed:
+ *                 return
+ */
+          __pyx_L8_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_L4_error;
+          __pyx_L10_try_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_L3_return;
+          __pyx_L7_exception_handled:;
+          __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);
+          __pyx_L11_try_end:;
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":60
+ * 
+ * cdef void __postfork_child() noexcept nogil:
+ *     with gil:             # <<<<<<<<<<<<<<
+ *         try:
+ *             if _fork_handler_failed:
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L3_return: {
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L0;
+        }
+        __pyx_L4_error: {
+          #ifdef WITH_THREAD
+          __Pyx_PyGILState_Release(__pyx_gilstate_save);
+          #endif
+          goto __pyx_L1_error;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":83
+ *             os._exit(os.EX_USAGE)
+ * 
+ *     if grpc_is_initialized() > 0:             # <<<<<<<<<<<<<<
+ *         with gil:
+ *             _LOGGER.error('Failed to shutdown gRPC Core after fork()')
+ */
+  __pyx_t_17 = (grpc_is_initialized() > 0);
+  if (__pyx_t_17) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":84
+ * 
+ *     if grpc_is_initialized() > 0:
+ *         with gil:             # <<<<<<<<<<<<<<
+ *             _LOGGER.error('Failed to shutdown gRPC Core after fork()')
+ *             os._exit(os.EX_USAGE)
+ */
+    {
+        #ifdef WITH_THREAD
+        PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+        #endif
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":85
+ *     if grpc_is_initialized() > 0:
+ *         with gil:
+ *             _LOGGER.error('Failed to shutdown gRPC Core after fork()')             # <<<<<<<<<<<<<<
+ *             os._exit(os.EX_USAGE)
+ * 
+ */
+          __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 85, __pyx_L37_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 85, __pyx_L37_error)
+          __Pyx_GOTREF(__pyx_t_6);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_t_4 = NULL;
+          __pyx_t_8 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (unlikely(PyMethod_Check(__pyx_t_6))) {
+            __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_6);
+            if (likely(__pyx_t_4)) {
+              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+              __Pyx_INCREF(__pyx_t_4);
+              __Pyx_INCREF(function);
+              __Pyx_DECREF_SET(__pyx_t_6, function);
+              __pyx_t_8 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_s_Failed_to_shutdown_gRPC_Core_aft};
+            __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+            if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 85, __pyx_L37_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":86
+ *         with gil:
+ *             _LOGGER.error('Failed to shutdown gRPC Core after fork()')
+ *             os._exit(os.EX_USAGE)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+          __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_os); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 86, __pyx_L37_error)
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_exit_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 86, __pyx_L37_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_os); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 86, __pyx_L37_error)
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_EX_USAGE); if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 86, __pyx_L37_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          __pyx_t_6 = NULL;
+          __pyx_t_8 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (unlikely(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_8 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_11};
+            __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+            if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 86, __pyx_L37_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          }
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":84
+ * 
+ *     if grpc_is_initialized() > 0:
+ *         with gil:             # <<<<<<<<<<<<<<
+ *             _LOGGER.error('Failed to shutdown gRPC Core after fork()')
+ *             os._exit(os.EX_USAGE)
+ */
+        /*finally:*/ {
+          /*normal exit:*/{
+            #ifdef WITH_THREAD
+            __Pyx_PyGILState_Release(__pyx_gilstate_save);
+            #endif
+            goto __pyx_L38;
+          }
+          __pyx_L37_error: {
+            #ifdef WITH_THREAD
+            __Pyx_PyGILState_Release(__pyx_gilstate_save);
+            #endif
+            goto __pyx_L1_error;
+          }
+          __pyx_L38:;
+        }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":83
+ *             os._exit(os.EX_USAGE)
+ * 
+ *     if grpc_is_initialized() > 0:             # <<<<<<<<<<<<<<
+ *         with gil:
+ *             _LOGGER.error('Failed to shutdown gRPC Core after fork()')
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":59
+ * 
+ * 
+ * cdef void __postfork_child() noexcept nogil:             # <<<<<<<<<<<<<<
+ *     with gil:
+ *         try:
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  #ifdef WITH_THREAD
+  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_18);
+  __Pyx_XDECREF(__pyx_t_19);
+  __Pyx_XDECREF(__pyx_t_20);
+  __Pyx_XDECREF(__pyx_t_21);
+  __Pyx_WriteUnraisable("_cython.cygrpc.__postfork_child", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  __pyx_L0:;
+  #ifdef WITH_THREAD
+  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_XDECREF(__pyx_v_state_to_reset);
+  __Pyx_XDECREF(__pyx_v_channel);
+  __Pyx_RefNannyFinishContext();
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":89
+ * 
+ * 
+ * def fork_handlers_and_grpc_init():             # <<<<<<<<<<<<<<
+ *     grpc_init()
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_95fork_handlers_and_grpc_init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_95fork_handlers_and_grpc_init = {"fork_handlers_and_grpc_init", (PyCFunction)__pyx_pw_7_cython_6cygrpc_95fork_handlers_and_grpc_init, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_95fork_handlers_and_grpc_init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("fork_handlers_and_grpc_init (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_94fork_handlers_and_grpc_init(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_94fork_handlers_and_grpc_init(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  unsigned int __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  PyObject *__pyx_t_12 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("fork_handlers_and_grpc_init", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":90
+ * 
+ * def fork_handlers_and_grpc_init():
+ *     grpc_init()             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_handler_registered_lock:
+ */
+  grpc_init();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":91
+ * def fork_handlers_and_grpc_init():
+ *     grpc_init()
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         with _fork_state.fork_handler_registered_lock:
+ *             if not _fork_state.fork_handler_registered:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 91, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 91, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":92
+ *     grpc_init()
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_handler_registered_lock:             # <<<<<<<<<<<<<<
+ *             if not _fork_state.fork_handler_registered:
+ *                 os.register_at_fork(before=__prefork,
+ */
+    /*with:*/ {
+      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 92, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_fork_handler_registered_lock); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 92, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_4 = __Pyx_PyObject_LookupSpecial(__pyx_t_3, __pyx_n_s_exit); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 92, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = __Pyx_PyObject_LookupSpecial(__pyx_t_3, __pyx_n_s_enter); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 92, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_6 = NULL;
+      __pyx_t_7 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_7 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 92, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      /*try:*/ {
+        {
+          __Pyx_PyThreadState_declare
+          __Pyx_PyThreadState_assign
+          __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:*/ {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":93
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_handler_registered_lock:
+ *             if not _fork_state.fork_handler_registered:             # <<<<<<<<<<<<<<
+ *                 os.register_at_fork(before=__prefork,
+ *                                     after_in_parent=__postfork_parent,
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 93, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_fork_handler_registered); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 93, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 93, __pyx_L8_error)
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_11 = (!__pyx_t_2);
+            if (__pyx_t_11) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":94
+ *         with _fork_state.fork_handler_registered_lock:
+ *             if not _fork_state.fork_handler_registered:
+ *                 os.register_at_fork(before=__prefork,             # <<<<<<<<<<<<<<
+ *                                     after_in_parent=__postfork_parent,
+ *                                     after_in_child=__postfork_child)
+ */
+              __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_os); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 94, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_register_at_fork); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 94, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 94, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_5 = __Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(__pyx_f_7_cython_6cygrpc___prefork); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 94, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_5);
+              if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_before, __pyx_t_5) < 0) __PYX_ERR(1, 94, __pyx_L8_error)
+              __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":95
+ *             if not _fork_state.fork_handler_registered:
+ *                 os.register_at_fork(before=__prefork,
+ *                                     after_in_parent=__postfork_parent,             # <<<<<<<<<<<<<<
+ *                                     after_in_child=__postfork_child)
+ *                 _fork_state.fork_handler_registered = True
+ */
+              __pyx_t_5 = __Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(__pyx_f_7_cython_6cygrpc___postfork_parent); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 95, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_5);
+              if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_after_in_parent, __pyx_t_5) < 0) __PYX_ERR(1, 94, __pyx_L8_error)
+              __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":96
+ *                 os.register_at_fork(before=__prefork,
+ *                                     after_in_parent=__postfork_parent,
+ *                                     after_in_child=__postfork_child)             # <<<<<<<<<<<<<<
+ *                 _fork_state.fork_handler_registered = True
+ * 
+ */
+              __pyx_t_5 = __Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(__pyx_f_7_cython_6cygrpc___postfork_child); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 96, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_5);
+              if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_after_in_child, __pyx_t_5) < 0) __PYX_ERR(1, 94, __pyx_L8_error)
+              __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":94
+ *         with _fork_state.fork_handler_registered_lock:
+ *             if not _fork_state.fork_handler_registered:
+ *                 os.register_at_fork(before=__prefork,             # <<<<<<<<<<<<<<
+ *                                     after_in_parent=__postfork_parent,
+ *                                     after_in_child=__postfork_child)
+ */
+              __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 94, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_5);
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":97
+ *                                     after_in_parent=__postfork_parent,
+ *                                     after_in_child=__postfork_child)
+ *                 _fork_state.fork_handler_registered = True             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+              __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 97, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_5);
+              if (__Pyx_PyObject_SetAttrStr(__pyx_t_5, __pyx_n_s_fork_handler_registered, Py_True) < 0) __PYX_ERR(1, 97, __pyx_L8_error)
+              __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":93
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_handler_registered_lock:
+ *             if not _fork_state.fork_handler_registered:             # <<<<<<<<<<<<<<
+ *                 os.register_at_fork(before=__prefork,
+ *                                     after_in_parent=__postfork_parent,
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":92
+ *     grpc_init()
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_handler_registered_lock:             # <<<<<<<<<<<<<<
+ *             if not _fork_state.fork_handler_registered:
+ *                 os.register_at_fork(before=__prefork,
+ */
+          }
+          __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_L13_try_end;
+          __pyx_L8_error:;
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+          /*except:*/ {
+            __Pyx_AddTraceback("_cython.cygrpc.fork_handlers_and_grpc_init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+            if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_1, &__pyx_t_3) < 0) __PYX_ERR(1, 92, __pyx_L10_except_error)
+            __Pyx_XGOTREF(__pyx_t_5);
+            __Pyx_XGOTREF(__pyx_t_1);
+            __Pyx_XGOTREF(__pyx_t_3);
+            __pyx_t_6 = PyTuple_Pack(3, __pyx_t_5, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 92, __pyx_L10_except_error)
+            __Pyx_GOTREF(__pyx_t_6);
+            __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, NULL);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+            if (unlikely(!__pyx_t_12)) __PYX_ERR(1, 92, __pyx_L10_except_error)
+            __Pyx_GOTREF(__pyx_t_12);
+            __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
+            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+            if (__pyx_t_11 < 0) __PYX_ERR(1, 92, __pyx_L10_except_error)
+            __pyx_t_2 = (!__pyx_t_11);
+            if (unlikely(__pyx_t_2)) {
+              __Pyx_GIVEREF(__pyx_t_5);
+              __Pyx_GIVEREF(__pyx_t_1);
+              __Pyx_XGIVEREF(__pyx_t_3);
+              __Pyx_ErrRestoreWithState(__pyx_t_5, __pyx_t_1, __pyx_t_3);
+              __pyx_t_5 = 0; __pyx_t_1 = 0; __pyx_t_3 = 0; 
+              __PYX_ERR(1, 92, __pyx_L10_except_error)
+            }
+            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+            __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+            goto __pyx_L9_exception_handled;
+          }
+          __pyx_L10_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_L9_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_L13_try_end:;
+        }
+      }
+      /*finally:*/ {
+        /*normal exit:*/{
+          if (__pyx_t_4) {
+            __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__11, NULL);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 92, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          }
+          goto __pyx_L7;
+        }
+        __pyx_L7:;
+      }
+      goto __pyx_L18;
+      __pyx_L4_error:;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      goto __pyx_L1_error;
+      __pyx_L18:;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":91
+ * def fork_handlers_and_grpc_init():
+ *     grpc_init()
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         with _fork_state.fork_handler_registered_lock:
+ *             if not _fork_state.fork_handler_registered:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":89
+ * 
+ * 
+ * def fork_handlers_and_grpc_init():             # <<<<<<<<<<<<<<
+ *     grpc_init()
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc.fork_handlers_and_grpc_init", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":103
+ * 
+ * class ForkManagedThread(object):
+ *     def __init__(self, target, args=()):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_1__init__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_1__init__ = {"__init__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_1__init__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_1__init__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  PyObject *__pyx_v_target = 0;
+  PyObject *__pyx_v_args = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,&__pyx_n_s_target,&__pyx_n_s_args,0};
+    values[2] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)((PyObject*)__pyx_empty_tuple)));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 103, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_target)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 103, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 3, 1); __PYX_ERR(1, 103, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_args);
+          if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 103, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 103, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_self = values[0];
+    __pyx_v_target = values[1];
+    __pyx_v_args = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 3, __pyx_nargs); __PYX_ERR(1, 103, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ForkManagedThread.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ForkManagedThread___init__(__pyx_self, __pyx_v_self, __pyx_v_target, __pyx_v_args);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":105
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):             # <<<<<<<<<<<<<<
+ *                 try:
+ *                     target(*args)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_8__init___1managed_target(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_8__init___1managed_target = {"managed_target", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_8__init___1managed_target, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_8__init___1managed_target(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_args = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("managed_target (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "managed_target", 0))) return NULL;
+  __Pyx_INCREF(__pyx_args);
+  __pyx_v_args = __pyx_args;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ForkManagedThread_8__init___managed_target(__pyx_self, __pyx_v_args);
+
+  /* function exit code */
+  __Pyx_DECREF(__pyx_v_args);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread_8__init___managed_target(PyObject *__pyx_self, PyObject *__pyx_v_args) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *__pyx_outer_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  char const *__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;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("managed_target", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":106
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):
+ *                 try:             # <<<<<<<<<<<<<<
+ *                     target(*args)
+ *                 finally:
+ */
+  /*try:*/ {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":107
+ *             def managed_target(*args):
+ *                 try:
+ *                     target(*args)             # <<<<<<<<<<<<<<
+ *                 finally:
+ *                     _fork_state.active_thread_count.decrement()
+ */
+    if (unlikely(!__pyx_cur_scope->__pyx_v_target)) { __Pyx_RaiseClosureNameError("target"); __PYX_ERR(1, 107, __pyx_L4_error) }
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_cur_scope->__pyx_v_target, __pyx_v_args, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 107, __pyx_L4_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":109
+ *                     target(*args)
+ *                 finally:
+ *                     _fork_state.active_thread_count.decrement()             # <<<<<<<<<<<<<<
+ *             self._thread = threading.Thread(target=_run_with_context(managed_target), args=args)
+ *         else:
+ */
+  /*finally:*/ {
+    /*normal exit:*/{
+      __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 109, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_active_thread_count); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 109, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_decrement); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 109, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_3 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 109, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L5;
+    }
+    __pyx_L4_error:;
+    /*exception exit:*/{
+      __Pyx_PyThreadState_declare
+      __Pyx_PyThreadState_assign
+      __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0;
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13);
+      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10) < 0)) __Pyx_ErrFetch(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
+      __Pyx_XGOTREF(__pyx_t_8);
+      __Pyx_XGOTREF(__pyx_t_9);
+      __Pyx_XGOTREF(__pyx_t_10);
+      __Pyx_XGOTREF(__pyx_t_11);
+      __Pyx_XGOTREF(__pyx_t_12);
+      __Pyx_XGOTREF(__pyx_t_13);
+      __pyx_t_5 = __pyx_lineno; __pyx_t_6 = __pyx_clineno; __pyx_t_7 = __pyx_filename;
+      {
+        __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 109, __pyx_L7_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_active_thread_count); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 109, __pyx_L7_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_decrement); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 109, __pyx_L7_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_3 = NULL;
+        __pyx_t_4 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (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);
+            __pyx_t_4 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 109, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      }
+      if (PY_MAJOR_VERSION >= 3) {
+        __Pyx_XGIVEREF(__pyx_t_11);
+        __Pyx_XGIVEREF(__pyx_t_12);
+        __Pyx_XGIVEREF(__pyx_t_13);
+        __Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13);
+      }
+      __Pyx_XGIVEREF(__pyx_t_8);
+      __Pyx_XGIVEREF(__pyx_t_9);
+      __Pyx_XGIVEREF(__pyx_t_10);
+      __Pyx_ErrRestore(__pyx_t_8, __pyx_t_9, __pyx_t_10);
+      __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0;
+      __pyx_lineno = __pyx_t_5; __pyx_clineno = __pyx_t_6; __pyx_filename = __pyx_t_7;
+      goto __pyx_L1_error;
+      __pyx_L7_error:;
+      if (PY_MAJOR_VERSION >= 3) {
+        __Pyx_XGIVEREF(__pyx_t_11);
+        __Pyx_XGIVEREF(__pyx_t_12);
+        __Pyx_XGIVEREF(__pyx_t_13);
+        __Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13);
+      }
+      __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;
+      __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0;
+      goto __pyx_L1_error;
+    }
+    __pyx_L5:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":105
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):             # <<<<<<<<<<<<<<
+ *                 try:
+ *                     target(*args)
+ */
+
+  /* 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("_cython.cygrpc.ForkManagedThread.__init__.managed_target", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":103
+ * 
+ * class ForkManagedThread(object):
+ *     def __init__(self, target, args=()):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):
+ */
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_target, PyObject *__pyx_v_args) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *__pyx_cur_scope;
+  PyObject *__pyx_v_managed_target = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  unsigned int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__init__", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_9___init__(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(1, 103, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_target = __pyx_v_target;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_target);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_target);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":104
+ * class ForkManagedThread(object):
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *             def managed_target(*args):
+ *                 try:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 104, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 104, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":105
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):             # <<<<<<<<<<<<<<
+ *                 try:
+ *                     target(*args)
+ */
+    __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_8__init___1managed_target, 0, __pyx_n_s_ForkManagedThread___init___local, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 105, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_v_managed_target = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":110
+ *                 finally:
+ *                     _fork_state.active_thread_count.decrement()
+ *             self._thread = threading.Thread(target=_run_with_context(managed_target), args=args)             # <<<<<<<<<<<<<<
+ *         else:
+ *             self._thread = threading.Thread(target=_run_with_context(target), args=args)
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_threading); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 110, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Thread); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 110, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 110, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_run_with_context); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 110, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(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);
+        __pyx_t_7 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_managed_target};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 110, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_target, __pyx_t_4) < 0) __PYX_ERR(1, 110, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_args, __pyx_v_args) < 0) __PYX_ERR(1, 110, __pyx_L1_error)
+    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 110, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_thread, __pyx_t_4) < 0) __PYX_ERR(1, 110, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":104
+ * class ForkManagedThread(object):
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *             def managed_target(*args):
+ *                 try:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":112
+ *             self._thread = threading.Thread(target=_run_with_context(managed_target), args=args)
+ *         else:
+ *             self._thread = threading.Thread(target=_run_with_context(target), args=args)             # <<<<<<<<<<<<<<
+ * 
+ *     def setDaemon(self, daemonic):
+ */
+  /*else*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_threading); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 112, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Thread); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 112, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 112, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_run_with_context); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 112, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(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);
+        __pyx_t_7 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_cur_scope->__pyx_v_target};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 112, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_target, __pyx_t_3) < 0) __PYX_ERR(1, 112, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_args, __pyx_v_args) < 0) __PYX_ERR(1, 112, __pyx_L1_error)
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 112, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_thread, __pyx_t_3) < 0) __PYX_ERR(1, 112, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":103
+ * 
+ * class ForkManagedThread(object):
+ *     def __init__(self, target, args=()):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc.ForkManagedThread.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_managed_target);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":114
+ *             self._thread = threading.Thread(target=_run_with_context(target), args=args)
+ * 
+ *     def setDaemon(self, daemonic):             # <<<<<<<<<<<<<<
+ *         self._thread.daemon = daemonic
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_3setDaemon(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_3setDaemon = {"setDaemon", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_3setDaemon, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_3setDaemon(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  PyObject *__pyx_v_daemonic = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("setDaemon (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,&__pyx_n_s_daemonic,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 114, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_daemonic)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 114, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("setDaemon", 1, 2, 2, 1); __PYX_ERR(1, 114, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "setDaemon") < 0)) __PYX_ERR(1, 114, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_self = values[0];
+    __pyx_v_daemonic = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("setDaemon", 1, 2, 2, __pyx_nargs); __PYX_ERR(1, 114, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ForkManagedThread.setDaemon", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ForkManagedThread_2setDaemon(__pyx_self, __pyx_v_self, __pyx_v_daemonic);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread_2setDaemon(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_daemonic) {
+  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("setDaemon", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":115
+ * 
+ *     def setDaemon(self, daemonic):
+ *         self._thread.daemon = daemonic             # <<<<<<<<<<<<<<
+ * 
+ *     def start(self):
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_thread); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 115, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (__Pyx_PyObject_SetAttrStr(__pyx_t_1, __pyx_n_s_daemon, __pyx_v_daemonic) < 0) __PYX_ERR(1, 115, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":114
+ *             self._thread = threading.Thread(target=_run_with_context(target), args=args)
+ * 
+ *     def setDaemon(self, daemonic):             # <<<<<<<<<<<<<<
+ *         self._thread.daemon = daemonic
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.ForkManagedThread.setDaemon", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":117
+ *         self._thread.daemon = daemonic
+ * 
+ *     def start(self):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             _fork_state.active_thread_count.increment()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_5start(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_5start = {"start", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_5start, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_5start(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("start (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 117, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "start") < 0)) __PYX_ERR(1, 117, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("start", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 117, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ForkManagedThread.start", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ForkManagedThread_4start(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread_4start(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("start", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":118
+ * 
+ *     def start(self):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *             _fork_state.active_thread_count.increment()
+ *         self._thread.start()
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 118, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 118, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":119
+ *     def start(self):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             _fork_state.active_thread_count.increment()             # <<<<<<<<<<<<<<
+ *         self._thread.start()
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 119, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_active_thread_count); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 119, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_increment); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 119, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 119, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":118
+ * 
+ *     def start(self):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *             _fork_state.active_thread_count.increment()
+ *         self._thread.start()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":120
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             _fork_state.active_thread_count.increment()
+ *         self._thread.start()             # <<<<<<<<<<<<<<
+ * 
+ *     def join(self):
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_thread); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 120, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_start); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 120, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_4))) {
+    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
+    if (likely(__pyx_t_3)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_4, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 120, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":117
+ *         self._thread.daemon = daemonic
+ * 
+ *     def start(self):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             _fork_state.active_thread_count.increment()
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.ForkManagedThread.start", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":122
+ *         self._thread.start()
+ * 
+ *     def join(self):             # <<<<<<<<<<<<<<
+ *         self._thread.join()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_7join(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_7join = {"join", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_7join, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_17ForkManagedThread_7join(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("join (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 122, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "join") < 0)) __PYX_ERR(1, 122, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("join", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 122, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.ForkManagedThread.join", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_17ForkManagedThread_6join(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_17ForkManagedThread_6join(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("join", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":123
+ * 
+ *     def join(self):
+ *         self._thread.join()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_thread); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_join); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 123, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":122
+ *         self._thread.start()
+ * 
+ *     def join(self):             # <<<<<<<<<<<<<<
+ *         self._thread.join()
+ * 
+ */
+
+  /* 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("_cython.cygrpc.ForkManagedThread.join", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":126
+ * 
+ * 
+ * def block_if_fork_in_progress(postfork_state_to_reset=None):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_in_progress_condition:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_97block_if_fork_in_progress(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_97block_if_fork_in_progress = {"block_if_fork_in_progress", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_97block_if_fork_in_progress, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_97block_if_fork_in_progress(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_postfork_state_to_reset = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("block_if_fork_in_progress (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_postfork_state_to_reset,0};
+    values[0] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_postfork_state_to_reset);
+          if (value) { values[0] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 126, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "block_if_fork_in_progress") < 0)) __PYX_ERR(1, 126, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_postfork_state_to_reset = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("block_if_fork_in_progress", 0, 0, 1, __pyx_nargs); __PYX_ERR(1, 126, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.block_if_fork_in_progress", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_96block_if_fork_in_progress(__pyx_self, __pyx_v_postfork_state_to_reset);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_96block_if_fork_in_progress(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_postfork_state_to_reset) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  unsigned int __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  int __pyx_t_12;
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("block_if_fork_in_progress", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":127
+ * 
+ * def block_if_fork_in_progress(postfork_state_to_reset=None):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         with _fork_state.fork_in_progress_condition:
+ *             if not _fork_state.fork_in_progress:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 127, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 127, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":128
+ * def block_if_fork_in_progress(postfork_state_to_reset=None):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_in_progress_condition:             # <<<<<<<<<<<<<<
+ *             if not _fork_state.fork_in_progress:
+ *                 return
+ */
+    /*with:*/ {
+      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 128, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_fork_in_progress_condition); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 128, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_4 = __Pyx_PyObject_LookupSpecial(__pyx_t_3, __pyx_n_s_exit); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 128, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = __Pyx_PyObject_LookupSpecial(__pyx_t_3, __pyx_n_s_enter); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 128, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_6 = NULL;
+      __pyx_t_7 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_7 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 128, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      /*try:*/ {
+        {
+          __Pyx_PyThreadState_declare
+          __Pyx_PyThreadState_assign
+          __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:*/ {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":129
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_in_progress_condition:
+ *             if not _fork_state.fork_in_progress:             # <<<<<<<<<<<<<<
+ *                 return
+ *             if postfork_state_to_reset is not None:
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 129, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_fork_in_progress); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 129, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 129, __pyx_L8_error)
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_11 = (!__pyx_t_2);
+            if (__pyx_t_11) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":130
+ *         with _fork_state.fork_in_progress_condition:
+ *             if not _fork_state.fork_in_progress:
+ *                 return             # <<<<<<<<<<<<<<
+ *             if postfork_state_to_reset is not None:
+ *                 _fork_state.postfork_states_to_reset.append(postfork_state_to_reset)
+ */
+              __Pyx_XDECREF(__pyx_r);
+              __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+              goto __pyx_L12_try_return;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":129
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_in_progress_condition:
+ *             if not _fork_state.fork_in_progress:             # <<<<<<<<<<<<<<
+ *                 return
+ *             if postfork_state_to_reset is not None:
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":131
+ *             if not _fork_state.fork_in_progress:
+ *                 return
+ *             if postfork_state_to_reset is not None:             # <<<<<<<<<<<<<<
+ *                 _fork_state.postfork_states_to_reset.append(postfork_state_to_reset)
+ *             _fork_state.active_thread_count.decrement()
+ */
+            __pyx_t_11 = (__pyx_v_postfork_state_to_reset != Py_None);
+            if (__pyx_t_11) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":132
+ *                 return
+ *             if postfork_state_to_reset is not None:
+ *                 _fork_state.postfork_states_to_reset.append(postfork_state_to_reset)             # <<<<<<<<<<<<<<
+ *             _fork_state.active_thread_count.decrement()
+ *             _fork_state.fork_in_progress_condition.wait()
+ */
+              __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 132, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_postfork_states_to_reset); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 132, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __pyx_t_12 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_v_postfork_state_to_reset); if (unlikely(__pyx_t_12 == ((int)-1))) __PYX_ERR(1, 132, __pyx_L8_error)
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":131
+ *             if not _fork_state.fork_in_progress:
+ *                 return
+ *             if postfork_state_to_reset is not None:             # <<<<<<<<<<<<<<
+ *                 _fork_state.postfork_states_to_reset.append(postfork_state_to_reset)
+ *             _fork_state.active_thread_count.decrement()
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":133
+ *             if postfork_state_to_reset is not None:
+ *                 _fork_state.postfork_states_to_reset.append(postfork_state_to_reset)
+ *             _fork_state.active_thread_count.decrement()             # <<<<<<<<<<<<<<
+ *             _fork_state.fork_in_progress_condition.wait()
+ *             _fork_state.active_thread_count.increment()
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 133, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_active_thread_count); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 133, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_5);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_decrement); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 133, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+            __pyx_t_5 = NULL;
+            __pyx_t_7 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (likely(PyMethod_Check(__pyx_t_1))) {
+              __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
+              if (likely(__pyx_t_5)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+                __Pyx_INCREF(__pyx_t_5);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_1, function);
+                __pyx_t_7 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+              __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+              __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+              if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 133, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":134
+ *                 _fork_state.postfork_states_to_reset.append(postfork_state_to_reset)
+ *             _fork_state.active_thread_count.decrement()
+ *             _fork_state.fork_in_progress_condition.wait()             # <<<<<<<<<<<<<<
+ *             _fork_state.active_thread_count.increment()
+ * 
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 134, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_fork_in_progress_condition); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 134, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_5);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_wait); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 134, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+            __pyx_t_5 = NULL;
+            __pyx_t_7 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (likely(PyMethod_Check(__pyx_t_1))) {
+              __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
+              if (likely(__pyx_t_5)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+                __Pyx_INCREF(__pyx_t_5);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_1, function);
+                __pyx_t_7 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+              __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+              __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+              if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 134, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":135
+ *             _fork_state.active_thread_count.decrement()
+ *             _fork_state.fork_in_progress_condition.wait()
+ *             _fork_state.active_thread_count.increment()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 135, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_active_thread_count); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 135, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_5);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_increment); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 135, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+            __pyx_t_5 = NULL;
+            __pyx_t_7 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (likely(PyMethod_Check(__pyx_t_1))) {
+              __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
+              if (likely(__pyx_t_5)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+                __Pyx_INCREF(__pyx_t_5);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_1, function);
+                __pyx_t_7 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+              __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+              __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+              if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 135, __pyx_L8_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":128
+ * def block_if_fork_in_progress(postfork_state_to_reset=None):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_in_progress_condition:             # <<<<<<<<<<<<<<
+ *             if not _fork_state.fork_in_progress:
+ *                 return
+ */
+          }
+          __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_L13_try_end;
+          __pyx_L8_error:;
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+          /*except:*/ {
+            __Pyx_AddTraceback("_cython.cygrpc.block_if_fork_in_progress", __pyx_clineno, __pyx_lineno, __pyx_filename);
+            if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_1, &__pyx_t_5) < 0) __PYX_ERR(1, 128, __pyx_L10_except_error)
+            __Pyx_XGOTREF(__pyx_t_3);
+            __Pyx_XGOTREF(__pyx_t_1);
+            __Pyx_XGOTREF(__pyx_t_5);
+            __pyx_t_6 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 128, __pyx_L10_except_error)
+            __Pyx_GOTREF(__pyx_t_6);
+            __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, NULL);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+            if (unlikely(!__pyx_t_13)) __PYX_ERR(1, 128, __pyx_L10_except_error)
+            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+            if (__pyx_t_11 < 0) __PYX_ERR(1, 128, __pyx_L10_except_error)
+            __pyx_t_2 = (!__pyx_t_11);
+            if (unlikely(__pyx_t_2)) {
+              __Pyx_GIVEREF(__pyx_t_3);
+              __Pyx_GIVEREF(__pyx_t_1);
+              __Pyx_XGIVEREF(__pyx_t_5);
+              __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_1, __pyx_t_5);
+              __pyx_t_3 = 0; __pyx_t_1 = 0; __pyx_t_5 = 0; 
+              __PYX_ERR(1, 128, __pyx_L10_except_error)
+            }
+            __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+            goto __pyx_L9_exception_handled;
+          }
+          __pyx_L10_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_L12_try_return:;
+          __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_L5_return;
+          __pyx_L9_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_L13_try_end:;
+        }
+      }
+      /*finally:*/ {
+        /*normal exit:*/{
+          if (__pyx_t_4) {
+            __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__11, NULL);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 128, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          }
+          goto __pyx_L7;
+        }
+        __pyx_L5_return: {
+          __pyx_t_10 = __pyx_r;
+          __pyx_r = 0;
+          if (__pyx_t_4) {
+            __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__11, NULL);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 128, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          }
+          __pyx_r = __pyx_t_10;
+          __pyx_t_10 = 0;
+          goto __pyx_L0;
+        }
+        __pyx_L7:;
+      }
+      goto __pyx_L19;
+      __pyx_L4_error:;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      goto __pyx_L1_error;
+      __pyx_L19:;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":127
+ * 
+ * def block_if_fork_in_progress(postfork_state_to_reset=None):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         with _fork_state.fork_in_progress_condition:
+ *             if not _fork_state.fork_in_progress:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":126
+ * 
+ * 
+ * def block_if_fork_in_progress(postfork_state_to_reset=None):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_in_progress_condition:
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc.block_if_fork_in_progress", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":138
+ * 
+ * 
+ * def enter_user_request_generator():             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.decrement()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_99enter_user_request_generator(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_99enter_user_request_generator = {"enter_user_request_generator", (PyCFunction)__pyx_pw_7_cython_6cygrpc_99enter_user_request_generator, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_99enter_user_request_generator(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("enter_user_request_generator (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_98enter_user_request_generator(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_98enter_user_request_generator(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("enter_user_request_generator", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":139
+ * 
+ * def enter_user_request_generator():
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         _fork_state.active_thread_count.decrement()
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 139, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 139, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":140
+ * def enter_user_request_generator():
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.decrement()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 140, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_active_thread_count); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 140, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_decrement); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 140, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 140, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":139
+ * 
+ * def enter_user_request_generator():
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         _fork_state.active_thread_count.decrement()
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":138
+ * 
+ * 
+ * def enter_user_request_generator():             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.decrement()
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.enter_user_request_generator", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":143
+ * 
+ * 
+ * def return_from_user_request_generator():             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.increment()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_101return_from_user_request_generator(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_101return_from_user_request_generator = {"return_from_user_request_generator", (PyCFunction)__pyx_pw_7_cython_6cygrpc_101return_from_user_request_generator, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_101return_from_user_request_generator(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("return_from_user_request_generator (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_100return_from_user_request_generator(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_100return_from_user_request_generator(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("return_from_user_request_generator", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":144
+ * 
+ * def return_from_user_request_generator():
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         _fork_state.active_thread_count.increment()
+ *         block_if_fork_in_progress()
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 144, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 144, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":145
+ * def return_from_user_request_generator():
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.increment()             # <<<<<<<<<<<<<<
+ *         block_if_fork_in_progress()
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 145, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_active_thread_count); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 145, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_increment); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 145, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 145, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":146
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.increment()
+ *         block_if_fork_in_progress()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_block_if_fork_in_progress); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 146, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 146, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":144
+ * 
+ * def return_from_user_request_generator():
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         _fork_state.active_thread_count.increment()
+ *         block_if_fork_in_progress()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":143
+ * 
+ * 
+ * def return_from_user_request_generator():             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.increment()
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.return_from_user_request_generator", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":149
+ * 
+ * 
+ * def get_fork_epoch():             # <<<<<<<<<<<<<<
+ *     return _fork_state.fork_epoch
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_103get_fork_epoch(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_103get_fork_epoch = {"get_fork_epoch", (PyCFunction)__pyx_pw_7_cython_6cygrpc_103get_fork_epoch, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_103get_fork_epoch(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_fork_epoch (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_102get_fork_epoch(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_102get_fork_epoch(CYTHON_UNUSED PyObject *__pyx_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("get_fork_epoch", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":150
+ * 
+ * def get_fork_epoch():
+ *     return _fork_state.fork_epoch             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 150, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_fork_epoch); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 150, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":149
+ * 
+ * 
+ * def get_fork_epoch():             # <<<<<<<<<<<<<<
+ *     return _fork_state.fork_epoch
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.get_fork_epoch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":153
+ * 
+ * 
+ * def is_fork_support_enabled():             # <<<<<<<<<<<<<<
+ *     return _GRPC_ENABLE_FORK_SUPPORT
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_105is_fork_support_enabled(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_105is_fork_support_enabled = {"is_fork_support_enabled", (PyCFunction)__pyx_pw_7_cython_6cygrpc_105is_fork_support_enabled, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_105is_fork_support_enabled(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_fork_support_enabled (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_104is_fork_support_enabled(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_104is_fork_support_enabled(CYTHON_UNUSED PyObject *__pyx_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("is_fork_support_enabled", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":154
+ * 
+ * def is_fork_support_enabled():
+ *     return _GRPC_ENABLE_FORK_SUPPORT             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 154, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":153
+ * 
+ * 
+ * def is_fork_support_enabled():             # <<<<<<<<<<<<<<
+ *     return _GRPC_ENABLE_FORK_SUPPORT
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.is_fork_support_enabled", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":157
+ * 
+ * 
+ * def fork_register_channel(channel):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.add(channel)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_107fork_register_channel(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_107fork_register_channel = {"fork_register_channel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_107fork_register_channel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_107fork_register_channel(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_channel = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("fork_register_channel (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_channel,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 157, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "fork_register_channel") < 0)) __PYX_ERR(1, 157, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_channel = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("fork_register_channel", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 157, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.fork_register_channel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_106fork_register_channel(__pyx_self, __pyx_v_channel);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_106fork_register_channel(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_channel) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("fork_register_channel", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":158
+ * 
+ * def fork_register_channel(channel):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         _fork_state.channels.add(channel)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 158, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 158, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":159
+ * def fork_register_channel(channel):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.add(channel)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 159, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_channels); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 159, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_add); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 159, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_channel};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 159, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":158
+ * 
+ * def fork_register_channel(channel):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         _fork_state.channels.add(channel)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":157
+ * 
+ * 
+ * def fork_register_channel(channel):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.add(channel)
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.fork_register_channel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":162
+ * 
+ * 
+ * def fork_unregister_channel(channel):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.discard(channel)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_109fork_unregister_channel(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_109fork_unregister_channel = {"fork_unregister_channel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_109fork_unregister_channel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_109fork_unregister_channel(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_channel = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("fork_unregister_channel (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_channel,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 162, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "fork_unregister_channel") < 0)) __PYX_ERR(1, 162, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_channel = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("fork_unregister_channel", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 162, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.fork_unregister_channel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_108fork_unregister_channel(__pyx_self, __pyx_v_channel);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_108fork_unregister_channel(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_channel) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("fork_unregister_channel", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":163
+ * 
+ * def fork_unregister_channel(channel):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         _fork_state.channels.discard(channel)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 163, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 163, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":164
+ * def fork_unregister_channel(channel):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.discard(channel)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_fork_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 164, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_channels); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 164, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_discard); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 164, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_channel};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 164, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":163
+ * 
+ * def fork_unregister_channel(channel):
+ *     if _GRPC_ENABLE_FORK_SUPPORT:             # <<<<<<<<<<<<<<
+ *         _fork_state.channels.discard(channel)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":162
+ * 
+ * 
+ * def fork_unregister_channel(channel):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.discard(channel)
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.fork_unregister_channel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":168
+ * 
+ * class _ActiveThreadCount(object):
+ *     def __init__(self):             # <<<<<<<<<<<<<<
+ *         self._num_active_threads = 0
+ *         self._condition = threading.Condition()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_1__init__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18_ActiveThreadCount_1__init__ = {"__init__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_1__init__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_1__init__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 168, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 168, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 168, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount___init__(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__init__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":169
+ * class _ActiveThreadCount(object):
+ *     def __init__(self):
+ *         self._num_active_threads = 0             # <<<<<<<<<<<<<<
+ *         self._condition = threading.Condition()
+ * 
+ */
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_num_active_threads, __pyx_int_0) < 0) __PYX_ERR(1, 169, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":170
+ *     def __init__(self):
+ *         self._num_active_threads = 0
+ *         self._condition = threading.Condition()             # <<<<<<<<<<<<<<
+ * 
+ *     def increment(self):
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 170, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Condition); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 170, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 170, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_condition, __pyx_t_1) < 0) __PYX_ERR(1, 170, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":168
+ * 
+ * class _ActiveThreadCount(object):
+ *     def __init__(self):             # <<<<<<<<<<<<<<
+ *         self._num_active_threads = 0
+ *         self._condition = threading.Condition()
+ */
+
+  /* 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("_cython.cygrpc._ActiveThreadCount.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":172
+ *         self._condition = threading.Condition()
+ * 
+ *     def increment(self):             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             self._num_active_threads += 1
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_3increment(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18_ActiveThreadCount_3increment = {"increment", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_3increment, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_3increment(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("increment (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 172, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "increment") < 0)) __PYX_ERR(1, 172, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("increment", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 172, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.increment", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_2increment(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_2increment(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("increment", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":173
+ * 
+ *     def increment(self):
+ *         with self._condition:             # <<<<<<<<<<<<<<
+ *             self._num_active_threads += 1
+ * 
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_condition); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 173, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_exit); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 173, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_4 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_enter); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 173, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 173, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_9);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":174
+ *     def increment(self):
+ *         with self._condition:
+ *             self._num_active_threads += 1             # <<<<<<<<<<<<<<
+ * 
+ *     def decrement(self):
+ */
+          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_num_active_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 174, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_3 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 174, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_num_active_threads, __pyx_t_3) < 0) __PYX_ERR(1, 174, __pyx_L7_error)
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":173
+ * 
+ *     def increment(self):
+ *         with self._condition:             # <<<<<<<<<<<<<<
+ *             self._num_active_threads += 1
+ * 
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.increment", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_1, &__pyx_t_4) < 0) __PYX_ERR(1, 173, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_1);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_5 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 173, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_5);
+          __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 173, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10);
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (__pyx_t_11 < 0) __PYX_ERR(1, 173, __pyx_L9_except_error)
+          __pyx_t_12 = (!__pyx_t_11);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_1, __pyx_t_4);
+            __pyx_t_3 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(1, 173, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_2) {
+          __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 173, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L16;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L1_error;
+    __pyx_L16:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":172
+ *         self._condition = threading.Condition()
+ * 
+ *     def increment(self):             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             self._num_active_threads += 1
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.increment", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":176
+ *             self._num_active_threads += 1
+ * 
+ *     def decrement(self):             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             self._num_active_threads -= 1
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_5decrement(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18_ActiveThreadCount_5decrement = {"decrement", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_5decrement, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_5decrement(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("decrement (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 176, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "decrement") < 0)) __PYX_ERR(1, 176, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("decrement", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 176, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.decrement", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_4decrement(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_4decrement(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("decrement", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":177
+ * 
+ *     def decrement(self):
+ *         with self._condition:             # <<<<<<<<<<<<<<
+ *             self._num_active_threads -= 1
+ *             if self._num_active_threads == 0:
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_condition); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 177, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_exit); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 177, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_4 = __Pyx_PyObject_LookupSpecial(__pyx_t_1, __pyx_n_s_enter); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 177, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 177, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_9);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":178
+ *     def decrement(self):
+ *         with self._condition:
+ *             self._num_active_threads -= 1             # <<<<<<<<<<<<<<
+ *             if self._num_active_threads == 0:
+ *                 self._condition.notify_all()
+ */
+          __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_num_active_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 178, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_3 = __Pyx_PyInt_SubtractObjC(__pyx_t_1, __pyx_int_1, 1, 1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 178, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_num_active_threads, __pyx_t_3) < 0) __PYX_ERR(1, 178, __pyx_L7_error)
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":179
+ *         with self._condition:
+ *             self._num_active_threads -= 1
+ *             if self._num_active_threads == 0:             # <<<<<<<<<<<<<<
+ *                 self._condition.notify_all()
+ * 
+ */
+          __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_num_active_threads); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 179, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_10 = (__Pyx_PyInt_BoolEqObjC(__pyx_t_3, __pyx_int_0, 0, 0)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(1, 179, __pyx_L7_error)
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          if (__pyx_t_10) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":180
+ *             self._num_active_threads -= 1
+ *             if self._num_active_threads == 0:
+ *                 self._condition.notify_all()             # <<<<<<<<<<<<<<
+ * 
+ *     def await_zero_threads(self, timeout_secs):
+ */
+            __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_condition); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 180, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_notify_all); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 180, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_4);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_1 = NULL;
+            __pyx_t_6 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (likely(PyMethod_Check(__pyx_t_4))) {
+              __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+              if (likely(__pyx_t_1)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+                __Pyx_INCREF(__pyx_t_1);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_4, function);
+                __pyx_t_6 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+              __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+              __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+              if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 180, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":179
+ *         with self._condition:
+ *             self._num_active_threads -= 1
+ *             if self._num_active_threads == 0:             # <<<<<<<<<<<<<<
+ *                 self._condition.notify_all()
+ * 
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":177
+ * 
+ *     def decrement(self):
+ *         with self._condition:             # <<<<<<<<<<<<<<
+ *             self._num_active_threads -= 1
+ *             if self._num_active_threads == 0:
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.decrement", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_4, &__pyx_t_1) < 0) __PYX_ERR(1, 177, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __Pyx_XGOTREF(__pyx_t_1);
+          __pyx_t_5 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 177, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_5);
+          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 177, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (__pyx_t_10 < 0) __PYX_ERR(1, 177, __pyx_L9_except_error)
+          __pyx_t_12 = (!__pyx_t_10);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_XGIVEREF(__pyx_t_1);
+            __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_4, __pyx_t_1);
+            __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
+            __PYX_ERR(1, 177, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_2) {
+          __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 177, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L17;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L1_error;
+    __pyx_L17:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":176
+ *             self._num_active_threads += 1
+ * 
+ *     def decrement(self):             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             self._num_active_threads -= 1
+ */
+
+  /* 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_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.decrement", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":182
+ *                 self._condition.notify_all()
+ * 
+ *     def await_zero_threads(self, timeout_secs):             # <<<<<<<<<<<<<<
+ *         end_time = time.time() + timeout_secs
+ *         wait_time = timeout_secs
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_7await_zero_threads(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_18_ActiveThreadCount_7await_zero_threads = {"await_zero_threads", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_7await_zero_threads, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_18_ActiveThreadCount_7await_zero_threads(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  PyObject *__pyx_v_timeout_secs = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("await_zero_threads (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,&__pyx_n_s_timeout_secs,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 182, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_timeout_secs)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 182, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("await_zero_threads", 1, 2, 2, 1); __PYX_ERR(1, 182, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "await_zero_threads") < 0)) __PYX_ERR(1, 182, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_self = values[0];
+    __pyx_v_timeout_secs = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("await_zero_threads", 1, 2, 2, __pyx_nargs); __PYX_ERR(1, 182, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.await_zero_threads", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_6await_zero_threads(__pyx_self, __pyx_v_self, __pyx_v_timeout_secs);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_18_ActiveThreadCount_6await_zero_threads(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_timeout_secs) {
+  PyObject *__pyx_v_end_time = NULL;
+  PyObject *__pyx_v_wait_time = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned 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_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("await_zero_threads", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":183
+ * 
+ *     def await_zero_threads(self, timeout_secs):
+ *         end_time = time.time() + timeout_secs             # <<<<<<<<<<<<<<
+ *         wait_time = timeout_secs
+ *         with self._condition:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_time); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 183, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_time); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 183, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 183, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_v_timeout_secs); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 183, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_end_time = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":184
+ *     def await_zero_threads(self, timeout_secs):
+ *         end_time = time.time() + timeout_secs
+ *         wait_time = timeout_secs             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             while True:
+ */
+  __Pyx_INCREF(__pyx_v_timeout_secs);
+  __pyx_v_wait_time = __pyx_v_timeout_secs;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":185
+ *         end_time = time.time() + timeout_secs
+ *         wait_time = timeout_secs
+ *         with self._condition:             # <<<<<<<<<<<<<<
+ *             while True:
+ *                 if self._num_active_threads > 0:
+ */
+  /*with:*/ {
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_condition); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 185, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = __Pyx_PyObject_LookupSpecial(__pyx_t_3, __pyx_n_s_exit); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 185, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_t_3, __pyx_n_s_enter); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 185, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_6 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 185, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_9);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":186
+ *         wait_time = timeout_secs
+ *         with self._condition:
+ *             while True:             # <<<<<<<<<<<<<<
+ *                 if self._num_active_threads > 0:
+ *                     self._condition.wait(wait_time)
+ */
+          while (1) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":187
+ *         with self._condition:
+ *             while True:
+ *                 if self._num_active_threads > 0:             # <<<<<<<<<<<<<<
+ *                     self._condition.wait(wait_time)
+ *                 if self._num_active_threads == 0:
+ */
+            __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_num_active_threads); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 187, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyObject_RichCompare(__pyx_t_3, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 187, __pyx_L7_error)
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(1, 187, __pyx_L7_error)
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            if (__pyx_t_10) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":188
+ *             while True:
+ *                 if self._num_active_threads > 0:
+ *                     self._condition.wait(wait_time)             # <<<<<<<<<<<<<<
+ *                 if self._num_active_threads == 0:
+ *                     return True
+ */
+              __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_condition); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 188, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_wait); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 188, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __pyx_t_3 = NULL;
+              __pyx_t_4 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (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);
+                  __pyx_t_4 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_wait_time};
+                __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+                __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+                if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 188, __pyx_L7_error)
+                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":187
+ *         with self._condition:
+ *             while True:
+ *                 if self._num_active_threads > 0:             # <<<<<<<<<<<<<<
+ *                     self._condition.wait(wait_time)
+ *                 if self._num_active_threads == 0:
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":189
+ *                 if self._num_active_threads > 0:
+ *                     self._condition.wait(wait_time)
+ *                 if self._num_active_threads == 0:             # <<<<<<<<<<<<<<
+ *                     return True
+ *                 # Thread count may have increased before this re-obtains the
+ */
+            __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_num_active_threads); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 189, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_10 = (__Pyx_PyInt_BoolEqObjC(__pyx_t_1, __pyx_int_0, 0, 0)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(1, 189, __pyx_L7_error)
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            if (__pyx_t_10) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":190
+ *                     self._condition.wait(wait_time)
+ *                 if self._num_active_threads == 0:
+ *                     return True             # <<<<<<<<<<<<<<
+ *                 # Thread count may have increased before this re-obtains the
+ *                 # lock after a notify(). Wait again until timeout_secs has
+ */
+              __Pyx_XDECREF(__pyx_r);
+              __Pyx_INCREF(Py_True);
+              __pyx_r = Py_True;
+              goto __pyx_L11_try_return;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":189
+ *                 if self._num_active_threads > 0:
+ *                     self._condition.wait(wait_time)
+ *                 if self._num_active_threads == 0:             # <<<<<<<<<<<<<<
+ *                     return True
+ *                 # Thread count may have increased before this re-obtains the
+ */
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":194
+ *                 # lock after a notify(). Wait again until timeout_secs has
+ *                 # elapsed.
+ *                 wait_time = end_time - time.time()             # <<<<<<<<<<<<<<
+ *                 if wait_time <= 0:
+ *                     return False
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_time); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 194, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_time); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 194, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_2 = NULL;
+            __pyx_t_4 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(PyMethod_Check(__pyx_t_3))) {
+              __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+              if (likely(__pyx_t_2)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+                __Pyx_INCREF(__pyx_t_2);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_3, function);
+                __pyx_t_4 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+              __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+              __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+              if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 194, __pyx_L7_error)
+              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            }
+            __pyx_t_3 = PyNumber_Subtract(__pyx_v_end_time, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 194, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF_SET(__pyx_v_wait_time, __pyx_t_3);
+            __pyx_t_3 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":195
+ *                 # elapsed.
+ *                 wait_time = end_time - time.time()
+ *                 if wait_time <= 0:             # <<<<<<<<<<<<<<
+ *                     return False
+ * 
+ */
+            __pyx_t_3 = PyObject_RichCompare(__pyx_v_wait_time, __pyx_int_0, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 195, __pyx_L7_error)
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(1, 195, __pyx_L7_error)
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            if (__pyx_t_10) {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":196
+ *                 wait_time = end_time - time.time()
+ *                 if wait_time <= 0:
+ *                     return False             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+              __Pyx_XDECREF(__pyx_r);
+              __Pyx_INCREF(Py_False);
+              __pyx_r = Py_False;
+              goto __pyx_L11_try_return;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":195
+ *                 # elapsed.
+ *                 wait_time = end_time - time.time()
+ *                 if wait_time <= 0:             # <<<<<<<<<<<<<<
+ *                     return False
+ * 
+ */
+            }
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":185
+ *         end_time = time.time() + timeout_secs
+ *         wait_time = timeout_secs
+ *         with self._condition:             # <<<<<<<<<<<<<<
+ *             while True:
+ *                 if self._num_active_threads > 0:
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __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;
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.await_zero_threads", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_1, &__pyx_t_2) < 0) __PYX_ERR(1, 185, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_1);
+          __Pyx_XGOTREF(__pyx_t_2);
+          __pyx_t_6 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 185, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, NULL);
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 185, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (__pyx_t_10 < 0) __PYX_ERR(1, 185, __pyx_L9_except_error)
+          __pyx_t_12 = (!__pyx_t_10);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_XGIVEREF(__pyx_t_2);
+            __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_1, __pyx_t_2);
+            __pyx_t_3 = 0; __pyx_t_1 = 0; __pyx_t_2 = 0; 
+            __PYX_ERR(1, 185, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        goto __pyx_L1_error;
+        __pyx_L11_try_return:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        goto __pyx_L4_return;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_5) {
+          __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 185, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L4_return: {
+        __pyx_t_9 = __pyx_r;
+        __pyx_r = 0;
+        if (__pyx_t_5) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 185, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        __pyx_r = __pyx_t_9;
+        __pyx_t_9 = 0;
+        goto __pyx_L0;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L21;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    goto __pyx_L1_error;
+    __pyx_L21:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":182
+ *                 self._condition.notify_all()
+ * 
+ *     def await_zero_threads(self, timeout_secs):             # <<<<<<<<<<<<<<
+ *         end_time = time.time() + timeout_secs
+ *         wait_time = timeout_secs
+ */
+
+  /* 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_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc._ActiveThreadCount.await_zero_threads", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_end_time);
+  __Pyx_XDECREF(__pyx_v_wait_time);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":200
+ * 
+ * class _ForkState(object):
+ *     def __init__(self):             # <<<<<<<<<<<<<<
+ *         self.fork_in_progress_condition = threading.Condition()
+ *         self.fork_in_progress = False
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10_ForkState_1__init__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10_ForkState_1__init__ = {"__init__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10_ForkState_1__init__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10_ForkState_1__init__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 200, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 200, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 200, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ForkState.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10_ForkState___init__(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10_ForkState___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__init__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":201
+ * class _ForkState(object):
+ *     def __init__(self):
+ *         self.fork_in_progress_condition = threading.Condition()             # <<<<<<<<<<<<<<
+ *         self.fork_in_progress = False
+ *         self.postfork_states_to_reset = []
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Condition); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 201, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_fork_in_progress_condition, __pyx_t_1) < 0) __PYX_ERR(1, 201, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":202
+ *     def __init__(self):
+ *         self.fork_in_progress_condition = threading.Condition()
+ *         self.fork_in_progress = False             # <<<<<<<<<<<<<<
+ *         self.postfork_states_to_reset = []
+ *         self.fork_handler_registered_lock = threading.Lock()
+ */
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_fork_in_progress, Py_False) < 0) __PYX_ERR(1, 202, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":203
+ *         self.fork_in_progress_condition = threading.Condition()
+ *         self.fork_in_progress = False
+ *         self.postfork_states_to_reset = []             # <<<<<<<<<<<<<<
+ *         self.fork_handler_registered_lock = threading.Lock()
+ *         self.fork_handler_registered = False
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 203, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_postfork_states_to_reset, __pyx_t_1) < 0) __PYX_ERR(1, 203, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":204
+ *         self.fork_in_progress = False
+ *         self.postfork_states_to_reset = []
+ *         self.fork_handler_registered_lock = threading.Lock()             # <<<<<<<<<<<<<<
+ *         self.fork_handler_registered = False
+ *         self.active_thread_count = _ActiveThreadCount()
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_threading); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 204, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_Lock); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 204, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 204, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_fork_handler_registered_lock, __pyx_t_1) < 0) __PYX_ERR(1, 204, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":205
+ *         self.postfork_states_to_reset = []
+ *         self.fork_handler_registered_lock = threading.Lock()
+ *         self.fork_handler_registered = False             # <<<<<<<<<<<<<<
+ *         self.active_thread_count = _ActiveThreadCount()
+ *         self.fork_epoch = 0
+ */
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_fork_handler_registered, Py_False) < 0) __PYX_ERR(1, 205, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":206
+ *         self.fork_handler_registered_lock = threading.Lock()
+ *         self.fork_handler_registered = False
+ *         self.active_thread_count = _ActiveThreadCount()             # <<<<<<<<<<<<<<
+ *         self.fork_epoch = 0
+ *         self.channels = set()
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ActiveThreadCount); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 206, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 206, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_active_thread_count, __pyx_t_1) < 0) __PYX_ERR(1, 206, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":207
+ *         self.fork_handler_registered = False
+ *         self.active_thread_count = _ActiveThreadCount()
+ *         self.fork_epoch = 0             # <<<<<<<<<<<<<<
+ *         self.channels = set()
+ * 
+ */
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_fork_epoch, __pyx_int_0) < 0) __PYX_ERR(1, 207, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":208
+ *         self.active_thread_count = _ActiveThreadCount()
+ *         self.fork_epoch = 0
+ *         self.channels = set()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 208, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_channels, __pyx_t_1) < 0) __PYX_ERR(1, 208, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":200
+ * 
+ * class _ForkState(object):
+ *     def __init__(self):             # <<<<<<<<<<<<<<
+ *         self.fork_in_progress_condition = threading.Condition()
+ *         self.fork_in_progress = False
+ */
+
+  /* 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("_cython.cygrpc._ForkState.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":22
+ * 
+ * 
+ * cdef grpc_status_code get_status_code(object code) except *:             # <<<<<<<<<<<<<<
+ *     if isinstance(code, int):
+ *         if code >= StatusCode.ok and code <= StatusCode.data_loss:
+ */
+
+static grpc_status_code __pyx_f_7_cython_6cygrpc_get_status_code(PyObject *__pyx_v_code) {
+  grpc_status_code __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  grpc_status_code __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  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("get_status_code", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":23
+ * 
+ * cdef grpc_status_code get_status_code(object code) except *:
+ *     if isinstance(code, int):             # <<<<<<<<<<<<<<
+ *         if code >= StatusCode.ok and code <= StatusCode.data_loss:
+ *             return code
+ */
+  __pyx_t_1 = PyInt_Check(__pyx_v_code); 
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":24
+ * cdef grpc_status_code get_status_code(object code) except *:
+ *     if isinstance(code, int):
+ *         if code >= StatusCode.ok and code <= StatusCode.data_loss:             # <<<<<<<<<<<<<<
+ *             return code
+ *         else:
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 24, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ok); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 24, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_code, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 24, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(6, 24, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (__pyx_t_4) {
+    } else {
+      __pyx_t_1 = __pyx_t_4;
+      goto __pyx_L5_bool_binop_done;
+    }
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 24, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_data_loss); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 24, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_code, __pyx_t_3, Py_LE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 24, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(6, 24, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_1 = __pyx_t_4;
+    __pyx_L5_bool_binop_done:;
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":25
+ *     if isinstance(code, int):
+ *         if code >= StatusCode.ok and code <= StatusCode.data_loss:
+ *             return code             # <<<<<<<<<<<<<<
+ *         else:
+ *             return StatusCode.unknown
+ */
+      __pyx_t_5 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_v_code)); if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 25, __pyx_L1_error)
+      __pyx_r = __pyx_t_5;
+      goto __pyx_L0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":24
+ * cdef grpc_status_code get_status_code(object code) except *:
+ *     if isinstance(code, int):
+ *         if code >= StatusCode.ok and code <= StatusCode.data_loss:             # <<<<<<<<<<<<<<
+ *             return code
+ *         else:
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":27
+ *             return code
+ *         else:
+ *             return StatusCode.unknown             # <<<<<<<<<<<<<<
+ *     else:
+ *         try:
+ */
+    /*else*/ {
+      __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 27, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_unknown); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 27, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_5 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_t_3)); if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 27, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      goto __pyx_L0;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":23
+ * 
+ * cdef grpc_status_code get_status_code(object code) except *:
+ *     if isinstance(code, int):             # <<<<<<<<<<<<<<
+ *         if code >= StatusCode.ok and code <= StatusCode.data_loss:
+ *             return code
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":29
+ *             return StatusCode.unknown
+ *     else:
+ *         try:             # <<<<<<<<<<<<<<
+ *             return code.value[0]
+ *         except (KeyError, AttributeError):
+ */
+  /*else*/ {
+    {
+      __Pyx_PyThreadState_declare
+      __Pyx_PyThreadState_assign
+      __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+      __Pyx_XGOTREF(__pyx_t_6);
+      __Pyx_XGOTREF(__pyx_t_7);
+      __Pyx_XGOTREF(__pyx_t_8);
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":30
+ *     else:
+ *         try:
+ *             return code.value[0]             # <<<<<<<<<<<<<<
+ *         except (KeyError, AttributeError):
+ *             return StatusCode.unknown
+ */
+        __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_code, __pyx_n_s_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 30, __pyx_L7_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 30, __pyx_L7_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_5 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_t_2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 30, __pyx_L7_error)
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __pyx_r = __pyx_t_5;
+        goto __pyx_L11_try_return;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":29
+ *             return StatusCode.unknown
+ *     else:
+ *         try:             # <<<<<<<<<<<<<<
+ *             return code.value[0]
+ *         except (KeyError, AttributeError):
+ */
+      }
+      __pyx_L7_error:;
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":31
+ *         try:
+ *             return code.value[0]
+ *         except (KeyError, AttributeError):             # <<<<<<<<<<<<<<
+ *             return StatusCode.unknown
+ * 
+ */
+      __pyx_t_9 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_KeyError, __pyx_builtin_AttributeError);
+      if (__pyx_t_9) {
+        __Pyx_AddTraceback("_cython.cygrpc.get_status_code", __pyx_clineno, __pyx_lineno, __pyx_filename);
+        if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_10) < 0) __PYX_ERR(6, 31, __pyx_L9_except_error)
+        __Pyx_XGOTREF(__pyx_t_2);
+        __Pyx_XGOTREF(__pyx_t_3);
+        __Pyx_XGOTREF(__pyx_t_10);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":32
+ *             return code.value[0]
+ *         except (KeyError, AttributeError):
+ *             return StatusCode.unknown             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 32, __pyx_L9_except_error)
+        __Pyx_GOTREF(__pyx_t_11);
+        __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_unknown); if (unlikely(!__pyx_t_12)) __PYX_ERR(6, 32, __pyx_L9_except_error)
+        __Pyx_GOTREF(__pyx_t_12);
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __pyx_t_5 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_t_12)); if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 32, __pyx_L9_except_error)
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __pyx_r = __pyx_t_5;
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        goto __pyx_L10_except_return;
+      }
+      goto __pyx_L9_except_error;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":29
+ *             return StatusCode.unknown
+ *     else:
+ *         try:             # <<<<<<<<<<<<<<
+ *             return code.value[0]
+ *         except (KeyError, AttributeError):
+ */
+      __pyx_L9_except_error:;
+      __Pyx_XGIVEREF(__pyx_t_6);
+      __Pyx_XGIVEREF(__pyx_t_7);
+      __Pyx_XGIVEREF(__pyx_t_8);
+      __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+      goto __pyx_L1_error;
+      __pyx_L11_try_return:;
+      __Pyx_XGIVEREF(__pyx_t_6);
+      __Pyx_XGIVEREF(__pyx_t_7);
+      __Pyx_XGIVEREF(__pyx_t_8);
+      __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+      goto __pyx_L0;
+      __pyx_L10_except_return:;
+      __Pyx_XGIVEREF(__pyx_t_6);
+      __Pyx_XGIVEREF(__pyx_t_7);
+      __Pyx_XGIVEREF(__pyx_t_8);
+      __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+      goto __pyx_L0;
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":22
+ * 
+ * 
+ * cdef grpc_status_code get_status_code(object code) except *:             # <<<<<<<<<<<<<<
+ *     if isinstance(code, int):
+ *         if code >= StatusCode.ok and code <= StatusCode.data_loss:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_AddTraceback("_cython.cygrpc.get_status_code", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = (grpc_status_code) 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":35
+ * 
+ * 
+ * cdef object deserialize(object deserializer, bytes raw_message):             # <<<<<<<<<<<<<<
+ *     """Perform deserialization on raw bytes.
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_deserialize(PyObject *__pyx_v_deserializer, PyObject *__pyx_v_raw_message) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("deserialize", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":40
+ *     Failure to deserialize is a fatal error.
+ *     """
+ *     if deserializer:             # <<<<<<<<<<<<<<
+ *         return deserializer(raw_message)
+ *     else:
+ */
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_deserializer); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(6, 40, __pyx_L1_error)
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":41
+ *     """
+ *     if deserializer:
+ *         return deserializer(raw_message)             # <<<<<<<<<<<<<<
+ *     else:
+ *         return raw_message
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(__pyx_v_deserializer);
+    __pyx_t_3 = __pyx_v_deserializer; __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_raw_message};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 41, __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;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":40
+ *     Failure to deserialize is a fatal error.
+ *     """
+ *     if deserializer:             # <<<<<<<<<<<<<<
+ *         return deserializer(raw_message)
+ *     else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":43
+ *         return deserializer(raw_message)
+ *     else:
+ *         return raw_message             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(__pyx_v_raw_message);
+    __pyx_r = __pyx_v_raw_message;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":35
+ * 
+ * 
+ * cdef object deserialize(object deserializer, bytes raw_message):             # <<<<<<<<<<<<<<
+ *     """Perform deserialization on raw bytes.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.deserialize", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":46
+ * 
+ * 
+ * cdef bytes serialize(object serializer, object message):             # <<<<<<<<<<<<<<
+ *     """Perform serialization on a message.
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_serialize(PyObject *__pyx_v_serializer, PyObject *__pyx_v_message) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("serialize", 0);
+  __Pyx_INCREF(__pyx_v_message);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":51
+ *     Failure to serialize is a fatal error.
+ *     """
+ *     if isinstance(message, str):             # <<<<<<<<<<<<<<
+ *         message = message.encode('utf-8')
+ *     if serializer:
+ */
+  __pyx_t_1 = PyString_Check(__pyx_v_message); 
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":52
+ *     """
+ *     if isinstance(message, str):
+ *         message = message.encode('utf-8')             # <<<<<<<<<<<<<<
+ *     if serializer:
+ *         return serializer(message)
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_message, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 52, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_s_utf_8};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 52, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF_SET(__pyx_v_message, __pyx_t_2);
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":51
+ *     Failure to serialize is a fatal error.
+ *     """
+ *     if isinstance(message, str):             # <<<<<<<<<<<<<<
+ *         message = message.encode('utf-8')
+ *     if serializer:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":53
+ *     if isinstance(message, str):
+ *         message = message.encode('utf-8')
+ *     if serializer:             # <<<<<<<<<<<<<<
+ *         return serializer(message)
+ *     else:
+ */
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_serializer); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(6, 53, __pyx_L1_error)
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":54
+ *         message = message.encode('utf-8')
+ *     if serializer:
+ *         return serializer(message)             # <<<<<<<<<<<<<<
+ *     else:
+ *         return message
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(__pyx_v_serializer);
+    __pyx_t_3 = __pyx_v_serializer; __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_message};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 54, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    if (!(likely(PyBytes_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_2))) __PYX_ERR(6, 54, __pyx_L1_error)
+    __pyx_r = ((PyObject*)__pyx_t_2);
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":53
+ *     if isinstance(message, str):
+ *         message = message.encode('utf-8')
+ *     if serializer:             # <<<<<<<<<<<<<<
+ *         return serializer(message)
+ *     else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":56
+ *         return serializer(message)
+ *     else:
+ *         return message             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    if (!(likely(PyBytes_CheckExact(__pyx_v_message))||((__pyx_v_message) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_v_message))) __PYX_ERR(6, 56, __pyx_L1_error)
+    __Pyx_INCREF(__pyx_v_message);
+    __pyx_r = ((PyObject*)__pyx_v_message);
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":46
+ * 
+ * 
+ * cdef bytes serialize(object serializer, object message):             # <<<<<<<<<<<<<<
+ *     """Perform serialization on a message.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.serialize", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_message);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":61
+ * class _EOF:
+ * 
+ *     def __bool__(self):             # <<<<<<<<<<<<<<
+ *         return False
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_1__bool__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4_EOF_1__bool__ = {"__bool__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_EOF_1__bool__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_1__bool__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__bool__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 61, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__bool__") < 0)) __PYX_ERR(6, 61, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__bool__", 1, 1, 1, __pyx_nargs); __PYX_ERR(6, 61, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._EOF.__bool__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4_EOF___bool__(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF___bool__(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__bool__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":62
+ * 
+ *     def __bool__(self):
+ *         return False             # <<<<<<<<<<<<<<
+ * 
+ *     def __len__(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(Py_False);
+  __pyx_r = Py_False;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":61
+ * class _EOF:
+ * 
+ *     def __bool__(self):             # <<<<<<<<<<<<<<
+ *         return False
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":64
+ *         return False
+ * 
+ *     def __len__(self):             # <<<<<<<<<<<<<<
+ *         return 0
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_3__len__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4_EOF_3__len__ = {"__len__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_EOF_3__len__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_3__len__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 64, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__len__") < 0)) __PYX_ERR(6, 64, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__len__", 1, 1, 1, __pyx_nargs); __PYX_ERR(6, 64, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._EOF.__len__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4_EOF_2__len__(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF_2__len__(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":65
+ * 
+ *     def __len__(self):
+ *         return 0             # <<<<<<<<<<<<<<
+ * 
+ *     def _repr(self) -> str:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_int_0);
+  __pyx_r = __pyx_int_0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":64
+ *         return False
+ * 
+ *     def __len__(self):             # <<<<<<<<<<<<<<
+ *         return 0
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":67
+ *         return 0
+ * 
+ *     def _repr(self) -> str:             # <<<<<<<<<<<<<<
+ *         return '<grpc.aio.EOF>'
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_5_repr(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4_EOF_5_repr = {"_repr", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_EOF_5_repr, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_5_repr(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_repr (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 67, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_repr") < 0)) __PYX_ERR(6, 67, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_repr", 1, 1, 1, __pyx_nargs); __PYX_ERR(6, 67, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._EOF._repr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4_EOF_4_repr(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF_4_repr(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_repr", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":68
+ * 
+ *     def _repr(self) -> str:
+ *         return '<grpc.aio.EOF>'             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self) -> str:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_kp_s_grpc_aio_EOF);
+  __pyx_r = __pyx_kp_s_grpc_aio_EOF;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":67
+ *         return 0
+ * 
+ *     def _repr(self) -> str:             # <<<<<<<<<<<<<<
+ *         return '<grpc.aio.EOF>'
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":70
+ *         return '<grpc.aio.EOF>'
+ * 
+ *     def __repr__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_7__repr__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4_EOF_7__repr__ = {"__repr__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_EOF_7__repr__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_7__repr__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 70, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__repr__") < 0)) __PYX_ERR(6, 70, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__repr__", 1, 1, 1, __pyx_nargs); __PYX_ERR(6, 70, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._EOF.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4_EOF_6__repr__(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF_6__repr__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__repr__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":71
+ * 
+ *     def __repr__(self) -> str:
+ *         return self._repr()             # <<<<<<<<<<<<<<
+ * 
+ *     def __str__(self) -> str:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_repr); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 71, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 71, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(6, 71, __pyx_L1_error)
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":70
+ *         return '<grpc.aio.EOF>'
+ * 
+ *     def __repr__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._EOF.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":73
+ *         return self._repr()
+ * 
+ *     def __str__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_9__str__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_4_EOF_9__str__ = {"__str__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_EOF_9__str__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_4_EOF_9__str__(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_self = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 73, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__str__") < 0)) __PYX_ERR(6, 73, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_self = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__str__", 1, 1, 1, __pyx_nargs); __PYX_ERR(6, 73, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._EOF.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_4_EOF_8__str__(__pyx_self, __pyx_v_self);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_4_EOF_8__str__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__str__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":74
+ * 
+ *     def __str__(self) -> str:
+ *         return self._repr()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_repr); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 74, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 74, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_1))) __PYX_ERR(6, 74, __pyx_L1_error)
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":73
+ *         return self._repr()
+ * 
+ *     def __str__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._EOF.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":110
+ * 
+ * 
+ * def schedule_coro_threadsafe(object coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         return loop.create_task(coro)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_111schedule_coro_threadsafe(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_111schedule_coro_threadsafe = {"schedule_coro_threadsafe", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_111schedule_coro_threadsafe, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_111schedule_coro_threadsafe(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_coro = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("schedule_coro_threadsafe (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_coro,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_coro)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 110, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 110, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("schedule_coro_threadsafe", 1, 2, 2, 1); __PYX_ERR(6, 110, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "schedule_coro_threadsafe") < 0)) __PYX_ERR(6, 110, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_coro = values[0];
+    __pyx_v_loop = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("schedule_coro_threadsafe", 1, 2, 2, __pyx_nargs); __PYX_ERR(6, 110, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.schedule_coro_threadsafe", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_110schedule_coro_threadsafe(__pyx_self, __pyx_v_coro, __pyx_v_loop);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_110schedule_coro_threadsafe(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_coro, PyObject *__pyx_v_loop) {
+  PyObject *__pyx_v_runtime_error = 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;
+  unsigned int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  int __pyx_t_13;
+  char const *__pyx_t_14;
+  PyObject *__pyx_t_15 = NULL;
+  PyObject *__pyx_t_16 = NULL;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *__pyx_t_18 = NULL;
+  PyObject *__pyx_t_19 = NULL;
+  PyObject *__pyx_t_20 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("schedule_coro_threadsafe", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":111
+ * 
+ * def schedule_coro_threadsafe(object coro, object loop):
+ *     try:             # <<<<<<<<<<<<<<
+ *         return loop.create_task(coro)
+ *     except RuntimeError as runtime_error:
+ */
+  {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":112
+ * def schedule_coro_threadsafe(object coro, object loop):
+ *     try:
+ *         return loop.create_task(coro)             # <<<<<<<<<<<<<<
+ *     except RuntimeError as runtime_error:
+ *         if 'Non-thread-safe operation' in str(runtime_error):
+ */
+      __Pyx_XDECREF(__pyx_r);
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_loop, __pyx_n_s_create_task); if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 112, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_6 = NULL;
+      __pyx_t_7 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_7 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_v_coro};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 112, __pyx_L3_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __pyx_r = __pyx_t_4;
+      __pyx_t_4 = 0;
+      goto __pyx_L7_try_return;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":111
+ * 
+ * def schedule_coro_threadsafe(object coro, object loop):
+ *     try:             # <<<<<<<<<<<<<<
+ *         return loop.create_task(coro)
+ *     except RuntimeError as runtime_error:
+ */
+    }
+    __pyx_L3_error:;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":113
+ *     try:
+ *         return loop.create_task(coro)
+ *     except RuntimeError as runtime_error:             # <<<<<<<<<<<<<<
+ *         if 'Non-thread-safe operation' in str(runtime_error):
+ *             return asyncio.run_coroutine_threadsafe(
+ */
+    __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_RuntimeError);
+    if (__pyx_t_8) {
+      __Pyx_AddTraceback("_cython.cygrpc.schedule_coro_threadsafe", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6) < 0) __PYX_ERR(6, 113, __pyx_L5_except_error)
+      __Pyx_XGOTREF(__pyx_t_4);
+      __Pyx_XGOTREF(__pyx_t_5);
+      __Pyx_XGOTREF(__pyx_t_6);
+      __Pyx_INCREF(__pyx_t_5);
+      __pyx_v_runtime_error = __pyx_t_5;
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":114
+ *         return loop.create_task(coro)
+ *     except RuntimeError as runtime_error:
+ *         if 'Non-thread-safe operation' in str(runtime_error):             # <<<<<<<<<<<<<<
+ *             return asyncio.run_coroutine_threadsafe(
+ *                 coro,
+ */
+        __pyx_t_9 = __Pyx_PyObject_Str(__pyx_v_runtime_error); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 114, __pyx_L14_error)
+        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_10 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_Non_thread_safe_operation, __pyx_t_9, Py_EQ)); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(6, 114, __pyx_L14_error)
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        if (likely(__pyx_t_10)) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":115
+ *     except RuntimeError as runtime_error:
+ *         if 'Non-thread-safe operation' in str(runtime_error):
+ *             return asyncio.run_coroutine_threadsafe(             # <<<<<<<<<<<<<<
+ *                 coro,
+ *                 loop,
+ */
+          __Pyx_XDECREF(__pyx_r);
+          __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 115, __pyx_L14_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_run_coroutine_threadsafe); if (unlikely(!__pyx_t_12)) __PYX_ERR(6, 115, __pyx_L14_error)
+          __Pyx_GOTREF(__pyx_t_12);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":117
+ *             return asyncio.run_coroutine_threadsafe(
+ *                 coro,
+ *                 loop,             # <<<<<<<<<<<<<<
+ *             )
+ *         else:
+ */
+          __pyx_t_11 = NULL;
+          __pyx_t_7 = 0;
+          #if CYTHON_UNPACK_METHODS
+          if (unlikely(PyMethod_Check(__pyx_t_12))) {
+            __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12);
+            if (likely(__pyx_t_11)) {
+              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+              __Pyx_INCREF(__pyx_t_11);
+              __Pyx_INCREF(function);
+              __Pyx_DECREF_SET(__pyx_t_12, function);
+              __pyx_t_7 = 1;
+            }
+          }
+          #endif
+          {
+            PyObject *__pyx_callargs[3] = {__pyx_t_11, __pyx_v_coro, __pyx_v_loop};
+            __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_7, 2+__pyx_t_7);
+            __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+            if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 115, __pyx_L14_error)
+            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          }
+          __pyx_r = __pyx_t_9;
+          __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          goto __pyx_L13_return;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":114
+ *         return loop.create_task(coro)
+ *     except RuntimeError as runtime_error:
+ *         if 'Non-thread-safe operation' in str(runtime_error):             # <<<<<<<<<<<<<<
+ *             return asyncio.run_coroutine_threadsafe(
+ *                 coro,
+ */
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":120
+ *             )
+ *         else:
+ *             raise             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+        /*else*/ {
+          __Pyx_GIVEREF(__pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_5);
+          __Pyx_XGIVEREF(__pyx_t_6);
+          __Pyx_ErrRestoreWithState(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+          __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; 
+          __PYX_ERR(6, 120, __pyx_L14_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":113
+ *     try:
+ *         return loop.create_task(coro)
+ *     except RuntimeError as runtime_error:             # <<<<<<<<<<<<<<
+ *         if 'Non-thread-safe operation' in str(runtime_error):
+ *             return asyncio.run_coroutine_threadsafe(
+ */
+      /*finally:*/ {
+        __pyx_L14_error:;
+        /*exception exit:*/{
+          __Pyx_PyThreadState_declare
+          __Pyx_PyThreadState_assign
+          __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0;
+          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+          if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20);
+          if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17) < 0)) __Pyx_ErrFetch(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17);
+          __Pyx_XGOTREF(__pyx_t_15);
+          __Pyx_XGOTREF(__pyx_t_16);
+          __Pyx_XGOTREF(__pyx_t_17);
+          __Pyx_XGOTREF(__pyx_t_18);
+          __Pyx_XGOTREF(__pyx_t_19);
+          __Pyx_XGOTREF(__pyx_t_20);
+          __pyx_t_8 = __pyx_lineno; __pyx_t_13 = __pyx_clineno; __pyx_t_14 = __pyx_filename;
+          {
+            __Pyx_DECREF(__pyx_v_runtime_error); __pyx_v_runtime_error = 0;
+          }
+          if (PY_MAJOR_VERSION >= 3) {
+            __Pyx_XGIVEREF(__pyx_t_18);
+            __Pyx_XGIVEREF(__pyx_t_19);
+            __Pyx_XGIVEREF(__pyx_t_20);
+            __Pyx_ExceptionReset(__pyx_t_18, __pyx_t_19, __pyx_t_20);
+          }
+          __Pyx_XGIVEREF(__pyx_t_15);
+          __Pyx_XGIVEREF(__pyx_t_16);
+          __Pyx_XGIVEREF(__pyx_t_17);
+          __Pyx_ErrRestore(__pyx_t_15, __pyx_t_16, __pyx_t_17);
+          __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0;
+          __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_13; __pyx_filename = __pyx_t_14;
+          goto __pyx_L5_except_error;
+        }
+        __pyx_L13_return: {
+          __pyx_t_20 = __pyx_r;
+          __pyx_r = 0;
+          __Pyx_DECREF(__pyx_v_runtime_error); __pyx_v_runtime_error = 0;
+          __pyx_r = __pyx_t_20;
+          __pyx_t_20 = 0;
+          goto __pyx_L6_except_return;
+        }
+      }
+    }
+    goto __pyx_L5_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":111
+ * 
+ * def schedule_coro_threadsafe(object coro, object loop):
+ *     try:             # <<<<<<<<<<<<<<
+ *         return loop.create_task(coro)
+ *     except RuntimeError as runtime_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_L7_try_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_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;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":110
+ * 
+ * 
+ * def schedule_coro_threadsafe(object coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         return loop.create_task(coro)
+ */
+
+  /* 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_9);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_AddTraceback("_cython.cygrpc.schedule_coro_threadsafe", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_runtime_error);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_114generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":123
+ * 
+ * 
+ * def async_generator_to_generator(object agen, object loop):             # <<<<<<<<<<<<<<
+ *     """Converts an async generator into generator."""
+ *     try:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_113async_generator_to_generator(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_112async_generator_to_generator, "Converts an async generator into generator.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_113async_generator_to_generator = {"async_generator_to_generator", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_113async_generator_to_generator, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_112async_generator_to_generator};
+static PyObject *__pyx_pw_7_cython_6cygrpc_113async_generator_to_generator(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_agen = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("async_generator_to_generator (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_agen,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_agen)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 123, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 123, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("async_generator_to_generator", 1, 2, 2, 1); __PYX_ERR(6, 123, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "async_generator_to_generator") < 0)) __PYX_ERR(6, 123, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_agen = values[0];
+    __pyx_v_loop = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("async_generator_to_generator", 1, 2, 2, __pyx_nargs); __PYX_ERR(6, 123, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.async_generator_to_generator", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_112async_generator_to_generator(__pyx_self, __pyx_v_agen, __pyx_v_loop);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_112async_generator_to_generator(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_agen, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("async_generator_to_generator", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(6, 123, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_agen = __pyx_v_agen;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_agen);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_agen);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_114generator, __pyx_codeobj__44, (PyObject *) __pyx_cur_scope, __pyx_n_s_async_generator_to_generator, __pyx_n_s_async_generator_to_generator, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(6, 123, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.async_generator_to_generator", __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_7_cython_6cygrpc_114generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  unsigned int __pyx_t_9;
+  int __pyx_t_10;
+  int __pyx_t_11;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("async_generator_to_generator", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L13_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(6, 123, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":125
+ * def async_generator_to_generator(object agen, object loop):
+ *     """Converts an async generator into generator."""
+ *     try:             # <<<<<<<<<<<<<<
+ *         while True:
+ *             future = asyncio.run_coroutine_threadsafe(
+ */
+  {
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":126
+ *     """Converts an async generator into generator."""
+ *     try:
+ *         while True:             # <<<<<<<<<<<<<<
+ *             future = asyncio.run_coroutine_threadsafe(
+ *                 agen.__anext__(),
+ */
+      while (1) {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":127
+ *     try:
+ *         while True:
+ *             future = asyncio.run_coroutine_threadsafe(             # <<<<<<<<<<<<<<
+ *                 agen.__anext__(),
+ *                 loop
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 127, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_run_coroutine_threadsafe); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 127, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":128
+ *         while True:
+ *             future = asyncio.run_coroutine_threadsafe(
+ *                 agen.__anext__(),             # <<<<<<<<<<<<<<
+ *                 loop
+ *             )
+ */
+        __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_agen, __pyx_n_s_anext); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 128, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_8 = NULL;
+        __pyx_t_9 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(PyMethod_Check(__pyx_t_7))) {
+          __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
+          if (likely(__pyx_t_8)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+            __Pyx_INCREF(__pyx_t_8);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_7, function);
+            __pyx_t_9 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_8, NULL};
+          __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 0+__pyx_t_9);
+          __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 128, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_5);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":129
+ *             future = asyncio.run_coroutine_threadsafe(
+ *                 agen.__anext__(),
+ *                 loop             # <<<<<<<<<<<<<<
+ *             )
+ *             response = future.result()
+ */
+        __pyx_t_7 = NULL;
+        __pyx_t_9 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (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);
+            __pyx_t_9 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_5, __pyx_cur_scope->__pyx_v_loop};
+          __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_9, 2+__pyx_t_9);
+          __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 127, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        }
+        __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_future);
+        __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_future, __pyx_t_4);
+        __Pyx_GIVEREF(__pyx_t_4);
+        __pyx_t_4 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":131
+ *                 loop
+ *             )
+ *             response = future.result()             # <<<<<<<<<<<<<<
+ *             if response is EOF:
+ *                 break
+ */
+        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_future, __pyx_n_s_result); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 131, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_5 = NULL;
+        __pyx_t_9 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(PyMethod_Check(__pyx_t_6))) {
+          __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6);
+          if (likely(__pyx_t_5)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+            __Pyx_INCREF(__pyx_t_5);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_6, function);
+            __pyx_t_9 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+          __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_9, 0+__pyx_t_9);
+          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 131, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        }
+        __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_response);
+        __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_response, __pyx_t_4);
+        __Pyx_GIVEREF(__pyx_t_4);
+        __pyx_t_4 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":132
+ *             )
+ *             response = future.result()
+ *             if response is EOF:             # <<<<<<<<<<<<<<
+ *                 break
+ *             else:
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_EOF); if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 132, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_10 = (__pyx_cur_scope->__pyx_v_response == __pyx_t_4);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        if (__pyx_t_10) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":133
+ *             response = future.result()
+ *             if response is EOF:
+ *                 break             # <<<<<<<<<<<<<<
+ *             else:
+ *                 yield response
+ */
+          goto __pyx_L11_break;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":132
+ *             )
+ *             response = future.result()
+ *             if response is EOF:             # <<<<<<<<<<<<<<
+ *                 break
+ *             else:
+ */
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":135
+ *                 break
+ *             else:
+ *                 yield response             # <<<<<<<<<<<<<<
+ *     except StopAsyncIteration:
+ *         # If StopAsyncIteration is raised, end this generator.
+ */
+        /*else*/ {
+          __Pyx_INCREF(__pyx_cur_scope->__pyx_v_response);
+          __pyx_r = __pyx_cur_scope->__pyx_v_response;
+          __Pyx_XGIVEREF(__pyx_t_1);
+          __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+          __Pyx_XGIVEREF(__pyx_t_2);
+          __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+          __Pyx_XGIVEREF(__pyx_t_3);
+          __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+          __Pyx_XGIVEREF(__pyx_r);
+          __Pyx_RefNannyFinishContext();
+          __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+          /* return from generator, yielding value */
+          __pyx_generator->resume_label = 1;
+          return __pyx_r;
+          __pyx_L13_resume_from_yield:;
+          __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+          __pyx_cur_scope->__pyx_t_0 = 0;
+          __Pyx_XGOTREF(__pyx_t_1);
+          __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+          __pyx_cur_scope->__pyx_t_1 = 0;
+          __Pyx_XGOTREF(__pyx_t_2);
+          __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+          __pyx_cur_scope->__pyx_t_2 = 0;
+          __Pyx_XGOTREF(__pyx_t_3);
+          if (unlikely(!__pyx_sent_value)) __PYX_ERR(6, 135, __pyx_L4_error)
+        }
+      }
+      __pyx_L11_break:;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":125
+ * def async_generator_to_generator(object agen, object loop):
+ *     """Converts an async generator into generator."""
+ *     try:             # <<<<<<<<<<<<<<
+ *         while True:
+ *             future = asyncio.run_coroutine_threadsafe(
+ */
+    }
+    __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_L9_try_end;
+    __pyx_L4_error:;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":136
+ *             else:
+ *                 yield response
+ *     except StopAsyncIteration:             # <<<<<<<<<<<<<<
+ *         # If StopAsyncIteration is raised, end this generator.
+ *         pass
+ */
+    __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)__Pyx_PyExc_StopAsyncIteration)[0])));
+    if (__pyx_t_11) {
+      __Pyx_ErrRestore(0,0,0);
+      goto __pyx_L5_exception_handled;
+    }
+    goto __pyx_L6_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":125
+ * def async_generator_to_generator(object agen, object loop):
+ *     """Converts an async generator into generator."""
+ *     try:             # <<<<<<<<<<<<<<
+ *         while True:
+ *             future = asyncio.run_coroutine_threadsafe(
+ */
+    __pyx_L6_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_L5_exception_handled:;
+    __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);
+    __pyx_L9_try_end:;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":123
+ * 
+ * 
+ * def async_generator_to_generator(object agen, object loop):             # <<<<<<<<<<<<<<
+ *     """Converts an async generator into generator."""
+ *     try:
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __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_AddTraceback("async_generator_to_generator", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_117generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":141
+ * 
+ * 
+ * async def generator_to_async_generator(object gen, object loop, object thread_pool):             # <<<<<<<<<<<<<<
+ *     """Converts a generator into async generator.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_116generator_to_async_generator(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_115generator_to_async_generator, "Converts a generator into async generator.\n\n    The generator might block, so we need to delegate the iteration to thread\n    pool. Also, we can't simply delegate __next__ to the thread pool, otherwise\n    we will see following error:\n\n        TypeError: StopIteration interacts badly with generators and cannot be\n            raised into a Future\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_116generator_to_async_generator = {"generator_to_async_generator", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_116generator_to_async_generator, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_115generator_to_async_generator};
+static PyObject *__pyx_pw_7_cython_6cygrpc_116generator_to_async_generator(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_gen = 0;
+  PyObject *__pyx_v_loop = 0;
+  PyObject *__pyx_v_thread_pool = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("generator_to_async_generator (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_gen,&__pyx_n_s_loop,&__pyx_n_s_thread_pool,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_gen)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 141, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 141, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("generator_to_async_generator", 1, 3, 3, 1); __PYX_ERR(6, 141, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_thread_pool)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 141, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("generator_to_async_generator", 1, 3, 3, 2); __PYX_ERR(6, 141, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "generator_to_async_generator") < 0)) __PYX_ERR(6, 141, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_gen = values[0];
+    __pyx_v_loop = values[1];
+    __pyx_v_thread_pool = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("generator_to_async_generator", 1, 3, 3, __pyx_nargs); __PYX_ERR(6, 141, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.generator_to_async_generator", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_115generator_to_async_generator(__pyx_self, __pyx_v_gen, __pyx_v_loop, __pyx_v_thread_pool);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_115generator_to_async_generator(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_gen, PyObject *__pyx_v_loop, PyObject *__pyx_v_thread_pool) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("generator_to_async_generator", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(6, 141, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_gen = __pyx_v_gen;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_gen);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_gen);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  __pyx_cur_scope->__pyx_v_thread_pool = __pyx_v_thread_pool;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_thread_pool);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_thread_pool);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_AsyncGen_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_117generator1, __pyx_codeobj__45, (PyObject *) __pyx_cur_scope, __pyx_n_s_generator_to_async_generator, __pyx_n_s_generator_to_async_generator, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(6, 141, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.generator_to_async_generator", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":153
+ *     queue = asyncio.Queue(maxsize=1)
+ * 
+ *     def yield_to_queue():             # <<<<<<<<<<<<<<
+ *         try:
+ *             for item in gen:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_28generator_to_async_generator_1yield_to_queue(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_28generator_to_async_generator_1yield_to_queue = {"yield_to_queue", (PyCFunction)__pyx_pw_7_cython_6cygrpc_28generator_to_async_generator_1yield_to_queue, METH_NOARGS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_28generator_to_async_generator_1yield_to_queue(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("yield_to_queue (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_28generator_to_async_generator_yield_to_queue(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_28generator_to_async_generator_yield_to_queue(PyObject *__pyx_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *__pyx_outer_scope;
+  PyObject *__pyx_v_item = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  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;
+  unsigned int __pyx_t_10;
+  int __pyx_t_11;
+  int __pyx_t_12;
+  char const *__pyx_t_13;
+  PyObject *__pyx_t_14 = NULL;
+  PyObject *__pyx_t_15 = NULL;
+  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("yield_to_queue", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":154
+ * 
+ *     def yield_to_queue():
+ *         try:             # <<<<<<<<<<<<<<
+ *             for item in gen:
+ *                 asyncio.run_coroutine_threadsafe(queue.put(item), loop).result()
+ */
+  /*try:*/ {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":155
+ *     def yield_to_queue():
+ *         try:
+ *             for item in gen:             # <<<<<<<<<<<<<<
+ *                 asyncio.run_coroutine_threadsafe(queue.put(item), loop).result()
+ *         finally:
+ */
+    if (unlikely(!__pyx_cur_scope->__pyx_v_gen)) { __Pyx_RaiseClosureNameError("gen"); __PYX_ERR(6, 155, __pyx_L4_error) }
+    if (likely(PyList_CheckExact(__pyx_cur_scope->__pyx_v_gen)) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_gen)) {
+      __pyx_t_1 = __pyx_cur_scope->__pyx_v_gen; __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_2 = 0;
+      __pyx_t_3 = NULL;
+    } else {
+      __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_gen); if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 155, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_3 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 155, __pyx_L4_error)
+    }
+    for (;;) {
+      if (likely(!__pyx_t_3)) {
+        if (likely(PyList_CheckExact(__pyx_t_1))) {
+          {
+            Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+            #if !CYTHON_ASSUME_SAFE_MACROS
+            if (unlikely((__pyx_temp < 0))) __PYX_ERR(6, 155, __pyx_L4_error)
+            #endif
+            if (__pyx_t_2 >= __pyx_temp) break;
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(6, 155, __pyx_L4_error)
+          #else
+          __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 155, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          #endif
+        } else {
+          {
+            Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1);
+            #if !CYTHON_ASSUME_SAFE_MACROS
+            if (unlikely((__pyx_temp < 0))) __PYX_ERR(6, 155, __pyx_L4_error)
+            #endif
+            if (__pyx_t_2 >= __pyx_temp) break;
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(6, 155, __pyx_L4_error)
+          #else
+          __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 155, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          #endif
+        }
+      } else {
+        __pyx_t_4 = __pyx_t_3(__pyx_t_1);
+        if (unlikely(!__pyx_t_4)) {
+          PyObject* exc_type = PyErr_Occurred();
+          if (exc_type) {
+            if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+            else __PYX_ERR(6, 155, __pyx_L4_error)
+          }
+          break;
+        }
+        __Pyx_GOTREF(__pyx_t_4);
+      }
+      __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_4);
+      __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":156
+ *         try:
+ *             for item in gen:
+ *                 asyncio.run_coroutine_threadsafe(queue.put(item), loop).result()             # <<<<<<<<<<<<<<
+ *         finally:
+ *             asyncio.run_coroutine_threadsafe(queue.put(EOF), loop).result()
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 156, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_run_coroutine_threadsafe); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 156, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_cur_scope->__pyx_v_queue)) { __Pyx_RaiseClosureNameError("queue"); __PYX_ERR(6, 156, __pyx_L4_error) }
+      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_queue, __pyx_n_s_put); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 156, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_9 = NULL;
+      __pyx_t_10 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (likely(PyMethod_Check(__pyx_t_8))) {
+        __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8);
+        if (likely(__pyx_t_9)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
+          __Pyx_INCREF(__pyx_t_9);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_8, function);
+          __pyx_t_10 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_v_item};
+        __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10);
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 156, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      }
+      if (unlikely(!__pyx_cur_scope->__pyx_v_loop)) { __Pyx_RaiseClosureNameError("loop"); __PYX_ERR(6, 156, __pyx_L4_error) }
+      __pyx_t_8 = NULL;
+      __pyx_t_10 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_7))) {
+        __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
+        if (likely(__pyx_t_8)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+          __Pyx_INCREF(__pyx_t_8);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_7, function);
+          __pyx_t_10 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_8, __pyx_t_6, __pyx_cur_scope->__pyx_v_loop};
+        __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10);
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 156, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_5);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      }
+      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_result); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 156, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = NULL;
+      __pyx_t_10 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (likely(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);
+          __pyx_t_10 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_10, 0+__pyx_t_10);
+        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 156, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":155
+ *     def yield_to_queue():
+ *         try:
+ *             for item in gen:             # <<<<<<<<<<<<<<
+ *                 asyncio.run_coroutine_threadsafe(queue.put(item), loop).result()
+ *         finally:
+ */
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":158
+ *                 asyncio.run_coroutine_threadsafe(queue.put(item), loop).result()
+ *         finally:
+ *             asyncio.run_coroutine_threadsafe(queue.put(EOF), loop).result()             # <<<<<<<<<<<<<<
+ * 
+ *     future = loop.run_in_executor(
+ */
+  /*finally:*/ {
+    /*normal exit:*/{
+      __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 158, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_run_coroutine_threadsafe); if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 158, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (unlikely(!__pyx_cur_scope->__pyx_v_queue)) { __Pyx_RaiseClosureNameError("queue"); __PYX_ERR(6, 158, __pyx_L1_error) }
+      __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_queue, __pyx_n_s_put); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 158, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_EOF); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 158, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_9 = NULL;
+      __pyx_t_10 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (likely(PyMethod_Check(__pyx_t_6))) {
+        __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6);
+        if (likely(__pyx_t_9)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+          __Pyx_INCREF(__pyx_t_9);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_6, function);
+          __pyx_t_10 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_8};
+        __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10);
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 158, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      }
+      if (unlikely(!__pyx_cur_scope->__pyx_v_loop)) { __Pyx_RaiseClosureNameError("loop"); __PYX_ERR(6, 158, __pyx_L1_error) }
+      __pyx_t_6 = NULL;
+      __pyx_t_10 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(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);
+          __pyx_t_10 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_t_7, __pyx_cur_scope->__pyx_v_loop};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 158, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_result); if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 158, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_4 = NULL;
+      __pyx_t_10 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (likely(PyMethod_Check(__pyx_t_5))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_5, function);
+          __pyx_t_10 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_10, 0+__pyx_t_10);
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 158, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L5;
+    }
+    __pyx_L4_error:;
+    /*exception exit:*/{
+      __Pyx_PyThreadState_declare
+      __Pyx_PyThreadState_assign
+      __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19);
+      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16) < 0)) __Pyx_ErrFetch(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16);
+      __Pyx_XGOTREF(__pyx_t_14);
+      __Pyx_XGOTREF(__pyx_t_15);
+      __Pyx_XGOTREF(__pyx_t_16);
+      __Pyx_XGOTREF(__pyx_t_17);
+      __Pyx_XGOTREF(__pyx_t_18);
+      __Pyx_XGOTREF(__pyx_t_19);
+      __pyx_t_11 = __pyx_lineno; __pyx_t_12 = __pyx_clineno; __pyx_t_13 = __pyx_filename;
+      {
+        __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 158, __pyx_L10_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_run_coroutine_threadsafe); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 158, __pyx_L10_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        if (unlikely(!__pyx_cur_scope->__pyx_v_queue)) { __Pyx_RaiseClosureNameError("queue"); __PYX_ERR(6, 158, __pyx_L10_error) }
+        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_queue, __pyx_n_s_put); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 158, __pyx_L10_error)
+        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_EOF); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 158, __pyx_L10_error)
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_9 = NULL;
+        __pyx_t_10 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(PyMethod_Check(__pyx_t_6))) {
+          __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6);
+          if (likely(__pyx_t_9)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+            __Pyx_INCREF(__pyx_t_9);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_6, function);
+            __pyx_t_10 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_8};
+          __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10);
+          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 158, __pyx_L10_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        }
+        if (unlikely(!__pyx_cur_scope->__pyx_v_loop)) { __Pyx_RaiseClosureNameError("loop"); __PYX_ERR(6, 158, __pyx_L10_error) }
+        __pyx_t_6 = NULL;
+        __pyx_t_10 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_7))) {
+          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7);
+          if (likely(__pyx_t_6)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+            __Pyx_INCREF(__pyx_t_6);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_7, function);
+            __pyx_t_10 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[3] = {__pyx_t_6, __pyx_t_4, __pyx_cur_scope->__pyx_v_loop};
+          __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10);
+          __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 158, __pyx_L10_error)
+          __Pyx_GOTREF(__pyx_t_5);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+        __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_result); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 158, __pyx_L10_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __pyx_t_5 = NULL;
+        __pyx_t_10 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(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);
+            __pyx_t_10 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_10, 0+__pyx_t_10);
+          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 158, __pyx_L10_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      }
+      if (PY_MAJOR_VERSION >= 3) {
+        __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_XGIVEREF(__pyx_t_14);
+      __Pyx_XGIVEREF(__pyx_t_15);
+      __Pyx_XGIVEREF(__pyx_t_16);
+      __Pyx_ErrRestore(__pyx_t_14, __pyx_t_15, __pyx_t_16);
+      __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+      __pyx_lineno = __pyx_t_11; __pyx_clineno = __pyx_t_12; __pyx_filename = __pyx_t_13;
+      goto __pyx_L1_error;
+      __pyx_L10_error:;
+      if (PY_MAJOR_VERSION >= 3) {
+        __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_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
+      __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
+      __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
+      __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+      goto __pyx_L1_error;
+    }
+    __pyx_L5:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":153
+ *     queue = asyncio.Queue(maxsize=1)
+ * 
+ *     def yield_to_queue():             # <<<<<<<<<<<<<<
+ *         try:
+ *             for item in gen:
+ */
+
+  /* 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_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_AddTraceback("_cython.cygrpc.generator_to_async_generator.yield_to_queue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_item);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":141
+ * 
+ * 
+ * async def generator_to_async_generator(object gen, object loop, object thread_pool):             # <<<<<<<<<<<<<<
+ *     """Converts a generator into async generator.
+ * 
+ */
+
+static PyObject *__pyx_gb_7_cython_6cygrpc_117generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("generator_to_async_generator", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_await;
+    case 2: goto __pyx_L8_resume_from_yield;
+    case 3: goto __pyx_L9_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(6, 141, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":151
+ *             raised into a Future
+ *     """
+ *     queue = asyncio.Queue(maxsize=1)             # <<<<<<<<<<<<<<
+ * 
+ *     def yield_to_queue():
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 151, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Queue); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 151, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 151, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_maxsize, __pyx_int_1) < 0) __PYX_ERR(6, 151, __pyx_L1_error)
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 151, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_cur_scope->__pyx_v_queue = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":153
+ *     queue = asyncio.Queue(maxsize=1)
+ * 
+ *     def yield_to_queue():             # <<<<<<<<<<<<<<
+ *         try:
+ *             for item in gen:
+ */
+  __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_28generator_to_async_generator_1yield_to_queue, 0, __pyx_n_s_generator_to_async_generator_loc, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__47)); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 153, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_cur_scope->__pyx_v_yield_to_queue = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":160
+ *             asyncio.run_coroutine_threadsafe(queue.put(EOF), loop).result()
+ * 
+ *     future = loop.run_in_executor(             # <<<<<<<<<<<<<<
+ *         thread_pool,
+ *         yield_to_queue,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_loop, __pyx_n_s_run_in_executor); if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 160, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":162
+ *     future = loop.run_in_executor(
+ *         thread_pool,
+ *         yield_to_queue,             # <<<<<<<<<<<<<<
+ *     )
+ * 
+ */
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_cur_scope->__pyx_v_thread_pool, __pyx_cur_scope->__pyx_v_yield_to_queue};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 160, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_cur_scope->__pyx_v_future = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":165
+ *     )
+ * 
+ *     while True:             # <<<<<<<<<<<<<<
+ *         response = await queue.get()
+ *         if response is EOF:
+ */
+  while (1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":166
+ * 
+ *     while True:
+ *         response = await queue.get()             # <<<<<<<<<<<<<<
+ *         if response is EOF:
+ *             break
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_queue, __pyx_n_s_get); if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 166, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_1))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_1, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 166, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_3);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from async generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L6_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(6, 166, __pyx_L1_error)
+      __pyx_t_3 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_3);
+    } else {
+      __pyx_t_3 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_3) < 0) __PYX_ERR(6, 166, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_response);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_response, __pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":167
+ *     while True:
+ *         response = await queue.get()
+ *         if response is EOF:             # <<<<<<<<<<<<<<
+ *             break
+ *         else:
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_EOF); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 167, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = (__pyx_cur_scope->__pyx_v_response == __pyx_t_3);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":168
+ *         response = await queue.get()
+ *         if response is EOF:
+ *             break             # <<<<<<<<<<<<<<
+ *         else:
+ *             yield response
+ */
+      goto __pyx_L5_break;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":167
+ *     while True:
+ *         response = await queue.get()
+ *         if response is EOF:             # <<<<<<<<<<<<<<
+ *             break
+ *         else:
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":170
+ *             break
+ *         else:
+ *             yield response             # <<<<<<<<<<<<<<
+ * 
+ *     # Port the exception if there is any
+ */
+    /*else*/ {
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_response);
+      __pyx_r = __pyx_cur_scope->__pyx_v_response;
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from async generator, yielding value */
+      __pyx_generator->resume_label = 2;
+      return __Pyx__PyAsyncGenValueWrapperNew(__pyx_r);
+      __pyx_L8_resume_from_yield:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(6, 170, __pyx_L1_error)
+    }
+  }
+  __pyx_L5_break:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":173
+ * 
+ *     # Port the exception if there is any
+ *     await future             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_future);
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from async generator, awaiting value */
+    __pyx_generator->resume_label = 3;
+    return __pyx_r;
+    __pyx_L9_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(6, 173, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(6, 173, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":141
+ * 
+ * 
+ * async def generator_to_async_generator(object gen, object loop, object thread_pool):             # <<<<<<<<<<<<<<
+ *     """Converts a generator into async generator.
+ * 
+ */
+
+  /* function exit code */
+  PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(1);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("generator_to_async_generator", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":177
+ * 
+ * if PY_MAJOR_VERSION >= 3 and PY_MINOR_VERSION >= 7:
+ *     def get_working_loop():             # <<<<<<<<<<<<<<
+ *         """Returns a running event loop.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_119get_working_loop(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_118get_working_loop, "Returns a running event loop.\n\n        Due to a defect of asyncio.get_event_loop, its returned event loop might\n        not be set as the default event loop for the main thread.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_119get_working_loop = {"get_working_loop", (PyCFunction)__pyx_pw_7_cython_6cygrpc_119get_working_loop, METH_NOARGS, __pyx_doc_7_cython_6cygrpc_118get_working_loop};
+static PyObject *__pyx_pw_7_cython_6cygrpc_119get_working_loop(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_working_loop (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_118get_working_loop(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_118get_working_loop(CYTHON_UNUSED PyObject *__pyx_self) {
+  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;
+  unsigned int __pyx_t_7;
+  int __pyx_t_8;
+  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 = NULL;
+  PyObject *__pyx_t_15 = NULL;
+  PyObject *__pyx_t_16 = NULL;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *__pyx_t_18 = NULL;
+  PyObject *__pyx_t_19 = NULL;
+  PyObject *__pyx_t_20 = NULL;
+  PyObject *__pyx_t_21 = NULL;
+  PyObject *__pyx_t_22 = NULL;
+  int __pyx_t_23;
+  int __pyx_t_24;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_working_loop", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":183
+ *         not be set as the default event loop for the main thread.
+ *         """
+ *         try:             # <<<<<<<<<<<<<<
+ *             return asyncio.get_running_loop()
+ *         except RuntimeError:
+ */
+  {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":184
+ *         """
+ *         try:
+ *             return asyncio.get_running_loop()             # <<<<<<<<<<<<<<
+ *         except RuntimeError:
+ *             with warnings.catch_warnings():
+ */
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 184, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_get_running_loop); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 184, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = NULL;
+      __pyx_t_7 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_6))) {
+        __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6);
+        if (likely(__pyx_t_5)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
+          __Pyx_INCREF(__pyx_t_5);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_6, function);
+          __pyx_t_7 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 184, __pyx_L3_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_L7_try_return;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":183
+ *         not be set as the default event loop for the main thread.
+ *         """
+ *         try:             # <<<<<<<<<<<<<<
+ *             return asyncio.get_running_loop()
+ *         except RuntimeError:
+ */
+    }
+    __pyx_L3_error:;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":185
+ *         try:
+ *             return asyncio.get_running_loop()
+ *         except RuntimeError:             # <<<<<<<<<<<<<<
+ *             with warnings.catch_warnings():
+ *                 # Convert DeprecationWarning to errors so we can capture them with except
+ */
+    __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_RuntimeError);
+    if (__pyx_t_8) {
+      __Pyx_AddTraceback("_cython.cygrpc.get_working_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_6, &__pyx_t_5) < 0) __PYX_ERR(6, 185, __pyx_L5_except_error)
+      __Pyx_XGOTREF(__pyx_t_4);
+      __Pyx_XGOTREF(__pyx_t_6);
+      __Pyx_XGOTREF(__pyx_t_5);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":186
+ *             return asyncio.get_running_loop()
+ *         except RuntimeError:
+ *             with warnings.catch_warnings():             # <<<<<<<<<<<<<<
+ *                 # Convert DeprecationWarning to errors so we can capture them with except
+ *                 warnings.simplefilter("error", DeprecationWarning)
+ */
+      /*with:*/ {
+        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_warnings); if (unlikely(!__pyx_t_10)) __PYX_ERR(6, 186, __pyx_L5_except_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_catch_warnings); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 186, __pyx_L5_except_error)
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __pyx_t_10 = NULL;
+        __pyx_t_7 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_11))) {
+          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11);
+          if (likely(__pyx_t_10)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
+            __Pyx_INCREF(__pyx_t_10);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_11, function);
+            __pyx_t_7 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL};
+          __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 186, __pyx_L5_except_error)
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        }
+        __pyx_t_12 = __Pyx_PyObject_LookupSpecial(__pyx_t_9, __pyx_n_s_exit); if (unlikely(!__pyx_t_12)) __PYX_ERR(6, 186, __pyx_L5_except_error)
+        __Pyx_GOTREF(__pyx_t_12);
+        __pyx_t_10 = __Pyx_PyObject_LookupSpecial(__pyx_t_9, __pyx_n_s_enter); if (unlikely(!__pyx_t_10)) __PYX_ERR(6, 186, __pyx_L11_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        __pyx_t_13 = NULL;
+        __pyx_t_7 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(PyMethod_Check(__pyx_t_10))) {
+          __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_10);
+          if (likely(__pyx_t_13)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
+            __Pyx_INCREF(__pyx_t_13);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_10, function);
+            __pyx_t_7 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_13, NULL};
+          __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+          __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 186, __pyx_L11_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        /*try:*/ {
+          {
+            __Pyx_PyThreadState_declare
+            __Pyx_PyThreadState_assign
+            __Pyx_ExceptionSave(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16);
+            __Pyx_XGOTREF(__pyx_t_14);
+            __Pyx_XGOTREF(__pyx_t_15);
+            __Pyx_XGOTREF(__pyx_t_16);
+            /*try:*/ {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":188
+ *             with warnings.catch_warnings():
+ *                 # Convert DeprecationWarning to errors so we can capture them with except
+ *                 warnings.simplefilter("error", DeprecationWarning)             # <<<<<<<<<<<<<<
+ *                 try:
+ *                     return asyncio.get_event_loop_policy().get_event_loop()
+ */
+              __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_warnings); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 188, __pyx_L17_error)
+              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_simplefilter); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 188, __pyx_L17_error)
+              __Pyx_GOTREF(__pyx_t_11);
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_tuple__48, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 188, __pyx_L17_error)
+              __Pyx_GOTREF(__pyx_t_9);
+              __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":189
+ *                 # Convert DeprecationWarning to errors so we can capture them with except
+ *                 warnings.simplefilter("error", DeprecationWarning)
+ *                 try:             # <<<<<<<<<<<<<<
+ *                     return asyncio.get_event_loop_policy().get_event_loop()
+ *                 # Since version 3.12, DeprecationWarning is emitted if there is no
+ */
+              {
+                __Pyx_PyThreadState_declare
+                __Pyx_PyThreadState_assign
+                __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:*/ {
+
+                  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":190
+ *                 warnings.simplefilter("error", DeprecationWarning)
+ *                 try:
+ *                     return asyncio.get_event_loop_policy().get_event_loop()             # <<<<<<<<<<<<<<
+ *                 # Since version 3.12, DeprecationWarning is emitted if there is no
+ *                 # current event loop.
+ */
+                  __Pyx_XDECREF(__pyx_r);
+                  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_10)) __PYX_ERR(6, 190, __pyx_L25_error)
+                  __Pyx_GOTREF(__pyx_t_10);
+                  __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_get_event_loop_policy); if (unlikely(!__pyx_t_13)) __PYX_ERR(6, 190, __pyx_L25_error)
+                  __Pyx_GOTREF(__pyx_t_13);
+                  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+                  __pyx_t_10 = NULL;
+                  __pyx_t_7 = 0;
+                  #if CYTHON_UNPACK_METHODS
+                  if (unlikely(PyMethod_Check(__pyx_t_13))) {
+                    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_13);
+                    if (likely(__pyx_t_10)) {
+                      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
+                      __Pyx_INCREF(__pyx_t_10);
+                      __Pyx_INCREF(function);
+                      __Pyx_DECREF_SET(__pyx_t_13, function);
+                      __pyx_t_7 = 1;
+                    }
+                  }
+                  #endif
+                  {
+                    PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL};
+                    __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_13, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+                    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+                    if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 190, __pyx_L25_error)
+                    __Pyx_GOTREF(__pyx_t_11);
+                    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                  }
+                  __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_get_event_loop); if (unlikely(!__pyx_t_13)) __PYX_ERR(6, 190, __pyx_L25_error)
+                  __Pyx_GOTREF(__pyx_t_13);
+                  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+                  __pyx_t_11 = NULL;
+                  __pyx_t_7 = 0;
+                  #if CYTHON_UNPACK_METHODS
+                  if (likely(PyMethod_Check(__pyx_t_13))) {
+                    __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_13);
+                    if (likely(__pyx_t_11)) {
+                      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
+                      __Pyx_INCREF(__pyx_t_11);
+                      __Pyx_INCREF(function);
+                      __Pyx_DECREF_SET(__pyx_t_13, function);
+                      __pyx_t_7 = 1;
+                    }
+                  }
+                  #endif
+                  {
+                    PyObject *__pyx_callargs[2] = {__pyx_t_11, NULL};
+                    __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_13, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+                    __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+                    if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 190, __pyx_L25_error)
+                    __Pyx_GOTREF(__pyx_t_9);
+                    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                  }
+                  __pyx_r = __pyx_t_9;
+                  __pyx_t_9 = 0;
+                  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+                  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+                  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+                  goto __pyx_L29_try_return;
+
+                  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":189
+ *                 # Convert DeprecationWarning to errors so we can capture them with except
+ *                 warnings.simplefilter("error", DeprecationWarning)
+ *                 try:             # <<<<<<<<<<<<<<
+ *                     return asyncio.get_event_loop_policy().get_event_loop()
+ *                 # Since version 3.12, DeprecationWarning is emitted if there is no
+ */
+                }
+                __pyx_L25_error:;
+                __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+                __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+                __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":193
+ *                 # Since version 3.12, DeprecationWarning is emitted if there is no
+ *                 # current event loop.
+ *                 except DeprecationWarning:             # <<<<<<<<<<<<<<
+ *                     return asyncio.get_event_loop_policy().new_event_loop()
+ * else:
+ */
+                __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_DeprecationWarning);
+                if (__pyx_t_8) {
+                  __Pyx_AddTraceback("_cython.cygrpc.get_working_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+                  if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_13, &__pyx_t_11) < 0) __PYX_ERR(6, 193, __pyx_L27_except_error)
+                  __Pyx_XGOTREF(__pyx_t_9);
+                  __Pyx_XGOTREF(__pyx_t_13);
+                  __Pyx_XGOTREF(__pyx_t_11);
+
+                  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":194
+ *                 # current event loop.
+ *                 except DeprecationWarning:
+ *                     return asyncio.get_event_loop_policy().new_event_loop()             # <<<<<<<<<<<<<<
+ * else:
+ *     def get_working_loop():
+ */
+                  __Pyx_XDECREF(__pyx_r);
+                  __Pyx_GetModuleGlobalName(__pyx_t_21, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_21)) __PYX_ERR(6, 194, __pyx_L27_except_error)
+                  __Pyx_GOTREF(__pyx_t_21);
+                  __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_21, __pyx_n_s_get_event_loop_policy); if (unlikely(!__pyx_t_22)) __PYX_ERR(6, 194, __pyx_L27_except_error)
+                  __Pyx_GOTREF(__pyx_t_22);
+                  __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
+                  __pyx_t_21 = NULL;
+                  __pyx_t_7 = 0;
+                  #if CYTHON_UNPACK_METHODS
+                  if (unlikely(PyMethod_Check(__pyx_t_22))) {
+                    __pyx_t_21 = PyMethod_GET_SELF(__pyx_t_22);
+                    if (likely(__pyx_t_21)) {
+                      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_22);
+                      __Pyx_INCREF(__pyx_t_21);
+                      __Pyx_INCREF(function);
+                      __Pyx_DECREF_SET(__pyx_t_22, function);
+                      __pyx_t_7 = 1;
+                    }
+                  }
+                  #endif
+                  {
+                    PyObject *__pyx_callargs[2] = {__pyx_t_21, NULL};
+                    __pyx_t_20 = __Pyx_PyObject_FastCall(__pyx_t_22, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+                    __Pyx_XDECREF(__pyx_t_21); __pyx_t_21 = 0;
+                    if (unlikely(!__pyx_t_20)) __PYX_ERR(6, 194, __pyx_L27_except_error)
+                    __Pyx_GOTREF(__pyx_t_20);
+                    __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
+                  }
+                  __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_20, __pyx_n_s_new_event_loop); if (unlikely(!__pyx_t_22)) __PYX_ERR(6, 194, __pyx_L27_except_error)
+                  __Pyx_GOTREF(__pyx_t_22);
+                  __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+                  __pyx_t_20 = NULL;
+                  __pyx_t_7 = 0;
+                  #if CYTHON_UNPACK_METHODS
+                  if (likely(PyMethod_Check(__pyx_t_22))) {
+                    __pyx_t_20 = PyMethod_GET_SELF(__pyx_t_22);
+                    if (likely(__pyx_t_20)) {
+                      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_22);
+                      __Pyx_INCREF(__pyx_t_20);
+                      __Pyx_INCREF(function);
+                      __Pyx_DECREF_SET(__pyx_t_22, function);
+                      __pyx_t_7 = 1;
+                    }
+                  }
+                  #endif
+                  {
+                    PyObject *__pyx_callargs[2] = {__pyx_t_20, NULL};
+                    __pyx_t_10 = __Pyx_PyObject_FastCall(__pyx_t_22, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+                    __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0;
+                    if (unlikely(!__pyx_t_10)) __PYX_ERR(6, 194, __pyx_L27_except_error)
+                    __Pyx_GOTREF(__pyx_t_10);
+                    __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
+                  }
+                  __pyx_r = __pyx_t_10;
+                  __pyx_t_10 = 0;
+                  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+                  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+                  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+                  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+                  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                  goto __pyx_L28_except_return;
+                }
+                goto __pyx_L27_except_error;
+
+                /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":189
+ *                 # Convert DeprecationWarning to errors so we can capture them with except
+ *                 warnings.simplefilter("error", DeprecationWarning)
+ *                 try:             # <<<<<<<<<<<<<<
+ *                     return asyncio.get_event_loop_policy().get_event_loop()
+ *                 # Since version 3.12, DeprecationWarning is emitted if there is no
+ */
+                __pyx_L27_except_error:;
+                __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);
+                goto __pyx_L17_error;
+                __pyx_L29_try_return:;
+                __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);
+                goto __pyx_L21_try_return;
+                __pyx_L28_except_return:;
+                __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);
+                goto __pyx_L21_try_return;
+              }
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":186
+ *             return asyncio.get_running_loop()
+ *         except RuntimeError:
+ *             with warnings.catch_warnings():             # <<<<<<<<<<<<<<
+ *                 # Convert DeprecationWarning to errors so we can capture them with except
+ *                 warnings.simplefilter("error", DeprecationWarning)
+ */
+            }
+            __pyx_L17_error:;
+            __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+            __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+            __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0;
+            __Pyx_XDECREF(__pyx_t_21); __pyx_t_21 = 0;
+            __Pyx_XDECREF(__pyx_t_22); __pyx_t_22 = 0;
+            __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+            /*except:*/ {
+              __Pyx_AddTraceback("_cython.cygrpc.get_working_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+              if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_13, &__pyx_t_9) < 0) __PYX_ERR(6, 186, __pyx_L19_except_error)
+              __Pyx_XGOTREF(__pyx_t_11);
+              __Pyx_XGOTREF(__pyx_t_13);
+              __Pyx_XGOTREF(__pyx_t_9);
+              __pyx_t_10 = PyTuple_Pack(3, __pyx_t_11, __pyx_t_13, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(6, 186, __pyx_L19_except_error)
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_19 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_10, NULL);
+              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+              if (unlikely(!__pyx_t_19)) __PYX_ERR(6, 186, __pyx_L19_except_error)
+              __Pyx_GOTREF(__pyx_t_19);
+              __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_19);
+              __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+              if (__pyx_t_23 < 0) __PYX_ERR(6, 186, __pyx_L19_except_error)
+              __pyx_t_24 = (!__pyx_t_23);
+              if (unlikely(__pyx_t_24)) {
+                __Pyx_GIVEREF(__pyx_t_11);
+                __Pyx_GIVEREF(__pyx_t_13);
+                __Pyx_XGIVEREF(__pyx_t_9);
+                __Pyx_ErrRestoreWithState(__pyx_t_11, __pyx_t_13, __pyx_t_9);
+                __pyx_t_11 = 0; __pyx_t_13 = 0; __pyx_t_9 = 0; 
+                __PYX_ERR(6, 186, __pyx_L19_except_error)
+              }
+              __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+              __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+              __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+              goto __pyx_L18_exception_handled;
+            }
+            __pyx_L19_except_error:;
+            __Pyx_XGIVEREF(__pyx_t_14);
+            __Pyx_XGIVEREF(__pyx_t_15);
+            __Pyx_XGIVEREF(__pyx_t_16);
+            __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16);
+            goto __pyx_L5_except_error;
+            __pyx_L21_try_return:;
+            __Pyx_XGIVEREF(__pyx_t_14);
+            __Pyx_XGIVEREF(__pyx_t_15);
+            __Pyx_XGIVEREF(__pyx_t_16);
+            __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16);
+            goto __pyx_L14_return;
+            __pyx_L18_exception_handled:;
+            __Pyx_XGIVEREF(__pyx_t_14);
+            __Pyx_XGIVEREF(__pyx_t_15);
+            __Pyx_XGIVEREF(__pyx_t_16);
+            __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16);
+          }
+        }
+        /*finally:*/ {
+          /*normal exit:*/{
+            if (__pyx_t_12) {
+              __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_tuple__11, NULL);
+              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+              if (unlikely(!__pyx_t_16)) __PYX_ERR(6, 186, __pyx_L5_except_error)
+              __Pyx_GOTREF(__pyx_t_16);
+              __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+            }
+            goto __pyx_L16;
+          }
+          __pyx_L14_return: {
+            __pyx_t_16 = __pyx_r;
+            __pyx_r = 0;
+            if (__pyx_t_12) {
+              __pyx_t_15 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_tuple__11, NULL);
+              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+              if (unlikely(!__pyx_t_15)) __PYX_ERR(6, 186, __pyx_L5_except_error)
+              __Pyx_GOTREF(__pyx_t_15);
+              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+            }
+            __pyx_r = __pyx_t_16;
+            __pyx_t_16 = 0;
+            goto __pyx_L6_except_return;
+          }
+          __pyx_L16:;
+        }
+        goto __pyx_L38;
+        __pyx_L11_error:;
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        goto __pyx_L5_except_error;
+        __pyx_L38:;
+      }
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      goto __pyx_L4_exception_handled;
+    }
+    goto __pyx_L5_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":183
+ *         not be set as the default event loop for the main thread.
+ *         """
+ *         try:             # <<<<<<<<<<<<<<
+ *             return asyncio.get_running_loop()
+ *         except RuntimeError:
+ */
+    __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_L7_try_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_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_L4_exception_handled:;
+    __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);
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":177
+ * 
+ * if PY_MAJOR_VERSION >= 3 and PY_MINOR_VERSION >= 7:
+ *     def get_working_loop():             # <<<<<<<<<<<<<<
+ *         """Returns a running event loop.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_13);
+  __Pyx_XDECREF(__pyx_t_20);
+  __Pyx_XDECREF(__pyx_t_21);
+  __Pyx_XDECREF(__pyx_t_22);
+  __Pyx_AddTraceback("_cython.cygrpc.get_working_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":196
+ *                     return asyncio.get_event_loop_policy().new_event_loop()
+ * else:
+ *     def get_working_loop():             # <<<<<<<<<<<<<<
+ *         """Returns a running event loop."""
+ *         return asyncio.get_event_loop()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_121get_working_loop(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_120get_working_loop, "Returns a running event loop.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_121get_working_loop = {"get_working_loop", (PyCFunction)__pyx_pw_7_cython_6cygrpc_121get_working_loop, METH_NOARGS, __pyx_doc_7_cython_6cygrpc_120get_working_loop};
+static PyObject *__pyx_pw_7_cython_6cygrpc_121get_working_loop(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_working_loop (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_120get_working_loop(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_120get_working_loop(CYTHON_UNUSED PyObject *__pyx_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("get_working_loop", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":198
+ *     def get_working_loop():
+ *         """Returns a running event loop."""
+ *         return asyncio.get_event_loop()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get_event_loop); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 198, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":196
+ *                     return asyncio.get_event_loop_policy().new_event_loop()
+ * else:
+ *     def get_working_loop():             # <<<<<<<<<<<<<<
+ *         """Returns a running event loop."""
+ *         return asyncio.get_event_loop()
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.get_working_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":201
+ * 
+ * 
+ * def raise_if_not_valid_trailing_metadata(object metadata):             # <<<<<<<<<<<<<<
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_123raise_if_not_valid_trailing_metadata(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_123raise_if_not_valid_trailing_metadata = {"raise_if_not_valid_trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_123raise_if_not_valid_trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_123raise_if_not_valid_trailing_metadata(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_metadata = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("raise_if_not_valid_trailing_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_metadata,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(6, 201, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "raise_if_not_valid_trailing_metadata") < 0)) __PYX_ERR(6, 201, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_metadata = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("raise_if_not_valid_trailing_metadata", 1, 1, 1, __pyx_nargs); __PYX_ERR(6, 201, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.raise_if_not_valid_trailing_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_122raise_if_not_valid_trailing_metadata(__pyx_self, __pyx_v_metadata);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_122raise_if_not_valid_trailing_metadata(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_metadata) {
+  PyObject *__pyx_v_item = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  Py_ssize_t __pyx_t_5;
+  Py_UCS4 __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("raise_if_not_valid_trailing_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":202
+ * 
+ * def raise_if_not_valid_trailing_metadata(object metadata):
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):             # <<<<<<<<<<<<<<
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *     for item in metadata:
+ */
+  __pyx_t_2 = __Pyx_HasAttr(__pyx_v_metadata, __pyx_n_s_iter); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(6, 202, __pyx_L1_error)
+  __pyx_t_3 = (!__pyx_t_2);
+  if (!__pyx_t_3) {
+  } else {
+    __pyx_t_1 = __pyx_t_3;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_3 = PyDict_Check(__pyx_v_metadata); 
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_L4_bool_binop_done:;
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":203
+ * def raise_if_not_valid_trailing_metadata(object metadata):
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')             # <<<<<<<<<<<<<<
+ *     for item in metadata:
+ *         if not isinstance(item, tuple):
+ */
+    __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 203, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = 0;
+    __pyx_t_6 = 127;
+    __Pyx_INCREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+    __pyx_t_5 += 41;
+    __Pyx_GIVEREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_u_Invalid_trailing_metadata_type_e);
+    __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_TYPE_METADATA_STRING); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 203, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_8 = __Pyx_PyObject_FormatSimple(__pyx_t_7, __pyx_empty_unicode); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 203, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_8) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_8) : __pyx_t_6;
+    __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_8);
+    __Pyx_GIVEREF(__pyx_t_8);
+    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_8);
+    __pyx_t_8 = 0;
+    __Pyx_INCREF(__pyx_kp_u__49);
+    __pyx_t_5 += 2;
+    __Pyx_GIVEREF(__pyx_kp_u__49);
+    PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_kp_u__49);
+    __pyx_t_8 = __Pyx_PyObject_FormatSimple(__pyx_v_metadata, __pyx_empty_unicode); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 203, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_8) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_8) : __pyx_t_6;
+    __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_8);
+    __Pyx_GIVEREF(__pyx_t_8);
+    PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_8);
+    __pyx_t_8 = 0;
+    __pyx_t_8 = __Pyx_PyUnicode_Join(__pyx_t_4, 4, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 203, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_8); if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 203, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __PYX_ERR(6, 203, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":202
+ * 
+ * def raise_if_not_valid_trailing_metadata(object metadata):
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):             # <<<<<<<<<<<<<<
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *     for item in metadata:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":204
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *     for item in metadata:             # <<<<<<<<<<<<<<
+ *         if not isinstance(item, tuple):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+  if (likely(PyList_CheckExact(__pyx_v_metadata)) || PyTuple_CheckExact(__pyx_v_metadata)) {
+    __pyx_t_4 = __pyx_v_metadata; __Pyx_INCREF(__pyx_t_4);
+    __pyx_t_5 = 0;
+    __pyx_t_9 = NULL;
+  } else {
+    __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_metadata); if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 204, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_9 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 204, __pyx_L1_error)
+  }
+  for (;;) {
+    if (likely(!__pyx_t_9)) {
+      if (likely(PyList_CheckExact(__pyx_t_4))) {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_4);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(6, 204, __pyx_L1_error)
+          #endif
+          if (__pyx_t_5 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_8 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_8); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(6, 204, __pyx_L1_error)
+        #else
+        __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 204, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_8);
+        #endif
+      } else {
+        {
+          Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4);
+          #if !CYTHON_ASSUME_SAFE_MACROS
+          if (unlikely((__pyx_temp < 0))) __PYX_ERR(6, 204, __pyx_L1_error)
+          #endif
+          if (__pyx_t_5 >= __pyx_temp) break;
+        }
+        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_8); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(6, 204, __pyx_L1_error)
+        #else
+        __pyx_t_8 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 204, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_8);
+        #endif
+      }
+    } else {
+      __pyx_t_8 = __pyx_t_9(__pyx_t_4);
+      if (unlikely(!__pyx_t_8)) {
+        PyObject* exc_type = PyErr_Occurred();
+        if (exc_type) {
+          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+          else __PYX_ERR(6, 204, __pyx_L1_error)
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_8);
+    }
+    __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_8);
+    __pyx_t_8 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":205
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *     for item in metadata:
+ *         if not isinstance(item, tuple):             # <<<<<<<<<<<<<<
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if len(item) != 2:
+ */
+    __pyx_t_1 = PyTuple_Check(__pyx_v_item); 
+    __pyx_t_3 = (!__pyx_t_1);
+    if (unlikely(__pyx_t_3)) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":206
+ *     for item in metadata:
+ *         if not isinstance(item, tuple):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')             # <<<<<<<<<<<<<<
+ *         if len(item) != 2:
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+      __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 206, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_10 = 0;
+      __pyx_t_6 = 127;
+      __Pyx_INCREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+      __pyx_t_10 += 41;
+      __Pyx_GIVEREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_kp_u_Invalid_trailing_metadata_type_e);
+      __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_TYPE_METADATA_STRING); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 206, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_11 = __Pyx_PyObject_FormatSimple(__pyx_t_7, __pyx_empty_unicode); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 206, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) : __pyx_t_6;
+      __pyx_t_10 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_11);
+      __Pyx_GIVEREF(__pyx_t_11);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_11);
+      __pyx_t_11 = 0;
+      __Pyx_INCREF(__pyx_kp_u__49);
+      __pyx_t_10 += 2;
+      __Pyx_GIVEREF(__pyx_kp_u__49);
+      PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_kp_u__49);
+      __pyx_t_11 = __Pyx_PyObject_FormatSimple(__pyx_v_metadata, __pyx_empty_unicode); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 206, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) : __pyx_t_6;
+      __pyx_t_10 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_11);
+      __Pyx_GIVEREF(__pyx_t_11);
+      PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_11);
+      __pyx_t_11 = 0;
+      __pyx_t_11 = __Pyx_PyUnicode_Join(__pyx_t_8, 4, __pyx_t_10, __pyx_t_6); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 206, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_11); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 206, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __Pyx_Raise(__pyx_t_8, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __PYX_ERR(6, 206, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":205
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *     for item in metadata:
+ *         if not isinstance(item, tuple):             # <<<<<<<<<<<<<<
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if len(item) != 2:
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":207
+ *         if not isinstance(item, tuple):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if len(item) != 2:             # <<<<<<<<<<<<<<
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[0], str):
+ */
+    __pyx_t_10 = PyObject_Length(__pyx_v_item); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(6, 207, __pyx_L1_error)
+    __pyx_t_3 = (__pyx_t_10 != 2);
+    if (unlikely(__pyx_t_3)) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":208
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if len(item) != 2:
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')             # <<<<<<<<<<<<<<
+ *         if not isinstance(item[0], str):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+      __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 208, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_10 = 0;
+      __pyx_t_6 = 127;
+      __Pyx_INCREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+      __pyx_t_10 += 41;
+      __Pyx_GIVEREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_kp_u_Invalid_trailing_metadata_type_e);
+      __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_TYPE_METADATA_STRING); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 208, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __pyx_t_7 = __Pyx_PyObject_FormatSimple(__pyx_t_11, __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 208, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6;
+      __pyx_t_10 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_7);
+      __pyx_t_7 = 0;
+      __Pyx_INCREF(__pyx_kp_u__49);
+      __pyx_t_10 += 2;
+      __Pyx_GIVEREF(__pyx_kp_u__49);
+      PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_kp_u__49);
+      __pyx_t_7 = __Pyx_PyObject_FormatSimple(__pyx_v_metadata, __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 208, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6;
+      __pyx_t_10 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_7);
+      __pyx_t_7 = 0;
+      __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_8, 4, __pyx_t_10, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 208, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 208, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_Raise(__pyx_t_8, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __PYX_ERR(6, 208, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":207
+ *         if not isinstance(item, tuple):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if len(item) != 2:             # <<<<<<<<<<<<<<
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[0], str):
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":209
+ *         if len(item) != 2:
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[0], str):             # <<<<<<<<<<<<<<
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[1], str) and not isinstance(item[1], bytes):
+ */
+    __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_item, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 209, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_3 = PyString_Check(__pyx_t_8); 
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __pyx_t_1 = (!__pyx_t_3);
+    if (unlikely(__pyx_t_1)) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":210
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[0], str):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')             # <<<<<<<<<<<<<<
+ *         if not isinstance(item[1], str) and not isinstance(item[1], bytes):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+      __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 210, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_10 = 0;
+      __pyx_t_6 = 127;
+      __Pyx_INCREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+      __pyx_t_10 += 41;
+      __Pyx_GIVEREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_kp_u_Invalid_trailing_metadata_type_e);
+      __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_TYPE_METADATA_STRING); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 210, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_11 = __Pyx_PyObject_FormatSimple(__pyx_t_7, __pyx_empty_unicode); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 210, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) : __pyx_t_6;
+      __pyx_t_10 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_11);
+      __Pyx_GIVEREF(__pyx_t_11);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_11);
+      __pyx_t_11 = 0;
+      __Pyx_INCREF(__pyx_kp_u__49);
+      __pyx_t_10 += 2;
+      __Pyx_GIVEREF(__pyx_kp_u__49);
+      PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_kp_u__49);
+      __pyx_t_11 = __Pyx_PyObject_FormatSimple(__pyx_v_metadata, __pyx_empty_unicode); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 210, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_11) : __pyx_t_6;
+      __pyx_t_10 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_11);
+      __Pyx_GIVEREF(__pyx_t_11);
+      PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_11);
+      __pyx_t_11 = 0;
+      __pyx_t_11 = __Pyx_PyUnicode_Join(__pyx_t_8, 4, __pyx_t_10, __pyx_t_6); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 210, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_11); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 210, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __Pyx_Raise(__pyx_t_8, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __PYX_ERR(6, 210, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":209
+ *         if len(item) != 2:
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[0], str):             # <<<<<<<<<<<<<<
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[1], str) and not isinstance(item[1], bytes):
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":211
+ *         if not isinstance(item[0], str):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[1], str) and not isinstance(item[1], bytes):             # <<<<<<<<<<<<<<
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+    __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_item, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 211, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_3 = PyString_Check(__pyx_t_8); 
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __pyx_t_2 = (!__pyx_t_3);
+    if (__pyx_t_2) {
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+      goto __pyx_L12_bool_binop_done;
+    }
+    __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_item, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 211, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_2 = PyBytes_Check(__pyx_t_8); 
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __pyx_t_3 = (!__pyx_t_2);
+    __pyx_t_1 = __pyx_t_3;
+    __pyx_L12_bool_binop_done:;
+    if (unlikely(__pyx_t_1)) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":212
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[1], str) and not isinstance(item[1], bytes):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')             # <<<<<<<<<<<<<<
+ */
+      __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 212, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_10 = 0;
+      __pyx_t_6 = 127;
+      __Pyx_INCREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+      __pyx_t_10 += 41;
+      __Pyx_GIVEREF(__pyx_kp_u_Invalid_trailing_metadata_type_e);
+      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_kp_u_Invalid_trailing_metadata_type_e);
+      __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_TYPE_METADATA_STRING); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 212, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __pyx_t_7 = __Pyx_PyObject_FormatSimple(__pyx_t_11, __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 212, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6;
+      __pyx_t_10 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_7);
+      __pyx_t_7 = 0;
+      __Pyx_INCREF(__pyx_kp_u__49);
+      __pyx_t_10 += 2;
+      __Pyx_GIVEREF(__pyx_kp_u__49);
+      PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_kp_u__49);
+      __pyx_t_7 = __Pyx_PyObject_FormatSimple(__pyx_v_metadata, __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 212, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6;
+      __pyx_t_10 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_7);
+      __pyx_t_7 = 0;
+      __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_8, 4, __pyx_t_10, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 212, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 212, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_Raise(__pyx_t_8, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __PYX_ERR(6, 212, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":211
+ *         if not isinstance(item[0], str):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *         if not isinstance(item[1], str) and not isinstance(item[1], bytes):             # <<<<<<<<<<<<<<
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":204
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ *     for item in metadata:             # <<<<<<<<<<<<<<
+ *         if not isinstance(item, tuple):
+ *             raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+  }
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":201
+ * 
+ * 
+ * def raise_if_not_valid_trailing_metadata(object metadata):             # <<<<<<<<<<<<<<
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("_cython.cygrpc.raise_if_not_valid_trailing_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_item);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":21
+ *     # The final status of gRPC is represented by three trailing metadata:
+ *     # `grpc-status`, `grpc-status-message`, abd `grpc-status-details`.
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *                   grpc_status_code code,
+ *                   str details,
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  grpc_status_code __pyx_v_code;
+  PyObject *__pyx_v_details = 0;
+  PyObject *__pyx_v_trailing_metadata = 0;
+  PyObject *__pyx_v_debug_error_string = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[4] = {0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,&__pyx_n_s_details,&__pyx_n_s_trailing_metadata,&__pyx_n_s_debug_error_string,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(30, 21, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(30, 21, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 1); __PYX_ERR(30, 21, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_trailing_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(30, 21, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 2); __PYX_ERR(30, 21, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_debug_error_string)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(30, 21, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 3); __PYX_ERR(30, 21, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(30, 21, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 4)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+      values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+    }
+    __pyx_v_code = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(30, 22, __pyx_L3_error)
+    __pyx_v_details = ((PyObject*)values[1]);
+    __pyx_v_trailing_metadata = ((PyObject*)values[2]);
+    __pyx_v_debug_error_string = ((PyObject*)values[3]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, __pyx_nargs); __PYX_ERR(30, 21, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_details), (&PyString_Type), 1, "details", 1))) __PYX_ERR(30, 23, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_trailing_metadata), (&PyTuple_Type), 1, "trailing_metadata", 1))) __PYX_ERR(30, 24, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_debug_error_string), (&PyString_Type), 1, "debug_error_string", 1))) __PYX_ERR(30, 25, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus___cinit__(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self), __pyx_v_code, __pyx_v_details, __pyx_v_trailing_metadata, __pyx_v_debug_error_string);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_12AioRpcStatus___cinit__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, grpc_status_code __pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_trailing_metadata, PyObject *__pyx_v_debug_error_string) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":26
+ *                   tuple trailing_metadata,
+ *                   str debug_error_string):
+ *         self._code = code             # <<<<<<<<<<<<<<
+ *         self._details = details
+ *         self._trailing_metadata = trailing_metadata
+ */
+  __pyx_v_self->_code = __pyx_v_code;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":27
+ *                   str debug_error_string):
+ *         self._code = code
+ *         self._details = details             # <<<<<<<<<<<<<<
+ *         self._trailing_metadata = trailing_metadata
+ *         self._debug_error_string = debug_error_string
+ */
+  __Pyx_INCREF(__pyx_v_details);
+  __Pyx_GIVEREF(__pyx_v_details);
+  __Pyx_GOTREF(__pyx_v_self->_details);
+  __Pyx_DECREF(__pyx_v_self->_details);
+  __pyx_v_self->_details = __pyx_v_details;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":28
+ *         self._code = code
+ *         self._details = details
+ *         self._trailing_metadata = trailing_metadata             # <<<<<<<<<<<<<<
+ *         self._debug_error_string = debug_error_string
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_trailing_metadata);
+  __Pyx_GIVEREF(__pyx_v_trailing_metadata);
+  __Pyx_GOTREF(__pyx_v_self->_trailing_metadata);
+  __Pyx_DECREF(__pyx_v_self->_trailing_metadata);
+  __pyx_v_self->_trailing_metadata = __pyx_v_trailing_metadata;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":29
+ *         self._details = details
+ *         self._trailing_metadata = trailing_metadata
+ *         self._debug_error_string = debug_error_string             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef grpc_status_code code(self):
+ */
+  __Pyx_INCREF(__pyx_v_debug_error_string);
+  __Pyx_GIVEREF(__pyx_v_debug_error_string);
+  __Pyx_GOTREF(__pyx_v_self->_debug_error_string);
+  __Pyx_DECREF(__pyx_v_self->_debug_error_string);
+  __pyx_v_self->_debug_error_string = __pyx_v_debug_error_string;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":21
+ *     # The final status of gRPC is represented by three trailing metadata:
+ *     # `grpc-status`, `grpc-status-message`, abd `grpc-status-details`.
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *                   grpc_status_code code,
+ *                   str details,
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":31
+ *         self._debug_error_string = debug_error_string
+ * 
+ *     cpdef grpc_status_code code(self):             # <<<<<<<<<<<<<<
+ *         return self._code
+ * 
+ */
+
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_3code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static grpc_status_code __pyx_f_7_cython_6cygrpc_12AioRpcStatus_code(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, int __pyx_skip_dispatch) {
+  grpc_status_code __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  grpc_status_code __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("code", 1);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {
+    #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+    static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
+    if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) {
+      PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
+      #endif
+      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(30, 31, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_3code)) {
+        __Pyx_INCREF(__pyx_t_1);
+        __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+        __pyx_t_5 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_3))) {
+          __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+          if (likely(__pyx_t_4)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+            __Pyx_INCREF(__pyx_t_4);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_3, function);
+            __pyx_t_5 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+          __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 31, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        }
+        __pyx_t_6 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_t_2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(30, 31, __pyx_L1_error)
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __pyx_r = __pyx_t_6;
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        goto __pyx_L0;
+      }
+      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+      __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
+      __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self));
+      if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) {
+        __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
+      }
+      #endif
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+    }
+    #endif
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":32
+ * 
+ *     cpdef grpc_status_code code(self):
+ *         return self._code             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef str details(self):
+ */
+  __pyx_r = __pyx_v_self->_code;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":31
+ *         self._debug_error_string = debug_error_string
+ * 
+ *     cpdef grpc_status_code code(self):             # <<<<<<<<<<<<<<
+ *         return self._code
+ * 
+ */
+
+  /* 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("_cython.cygrpc.AioRpcStatus.code", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = (grpc_status_code) 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_3code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_3code = {"code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_3code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_3code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("code (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("code", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "code", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_2code(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_2code(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  grpc_status_code __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("code", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_12AioRpcStatus_code(__pyx_v_self, 1); if (unlikely(PyErr_Occurred())) __PYX_ERR(30, 31, __pyx_L1_error)
+  __pyx_t_2 = __Pyx_PyInt_From_grpc_status_code(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 31, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus.code", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":34
+ *         return self._code
+ * 
+ *     cpdef str details(self):             # <<<<<<<<<<<<<<
+ *         return self._details
+ * 
+ */
+
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_5details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_12AioRpcStatus_details(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, int __pyx_skip_dispatch) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("details", 1);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {
+    #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+    static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
+    if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) {
+      PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
+      #endif
+      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_details); if (unlikely(!__pyx_t_1)) __PYX_ERR(30, 34, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_5details)) {
+        __Pyx_XDECREF(__pyx_r);
+        __Pyx_INCREF(__pyx_t_1);
+        __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+        __pyx_t_5 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_3))) {
+          __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+          if (likely(__pyx_t_4)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+            __Pyx_INCREF(__pyx_t_4);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_3, function);
+            __pyx_t_5 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+          __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 34, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        }
+        if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_2))) __PYX_ERR(30, 34, __pyx_L1_error)
+        __pyx_r = ((PyObject*)__pyx_t_2);
+        __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        goto __pyx_L0;
+      }
+      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+      __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
+      __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self));
+      if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) {
+        __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
+      }
+      #endif
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+    }
+    #endif
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":35
+ * 
+ *     cpdef str details(self):
+ *         return self._details             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef tuple trailing_metadata(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_details);
+  __pyx_r = __pyx_v_self->_details;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":34
+ *         return self._code
+ * 
+ *     cpdef str details(self):             # <<<<<<<<<<<<<<
+ *         return self._details
+ * 
+ */
+
+  /* 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("_cython.cygrpc.AioRpcStatus.details", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_5details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_5details = {"details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_5details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_5details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("details (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("details", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "details", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_4details(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_4details(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__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("details", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_12AioRpcStatus_details(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(30, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus.details", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":37
+ *         return self._details
+ * 
+ *     cpdef tuple trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._trailing_metadata
+ * 
+ */
+
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_7trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_12AioRpcStatus_trailing_metadata(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, int __pyx_skip_dispatch) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("trailing_metadata", 1);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {
+    #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+    static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
+    if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) {
+      PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
+      #endif
+      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trailing_metadata); if (unlikely(!__pyx_t_1)) __PYX_ERR(30, 37, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_7trailing_metadata)) {
+        __Pyx_XDECREF(__pyx_r);
+        __Pyx_INCREF(__pyx_t_1);
+        __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+        __pyx_t_5 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_3))) {
+          __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+          if (likely(__pyx_t_4)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+            __Pyx_INCREF(__pyx_t_4);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_3, function);
+            __pyx_t_5 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+          __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 37, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        }
+        if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(30, 37, __pyx_L1_error)
+        __pyx_r = ((PyObject*)__pyx_t_2);
+        __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        goto __pyx_L0;
+      }
+      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+      __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
+      __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self));
+      if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) {
+        __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
+      }
+      #endif
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+    }
+    #endif
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":38
+ * 
+ *     cpdef tuple trailing_metadata(self):
+ *         return self._trailing_metadata             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef str debug_error_string(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_trailing_metadata);
+  __pyx_r = __pyx_v_self->_trailing_metadata;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":37
+ *         return self._details
+ * 
+ *     cpdef tuple trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._trailing_metadata
+ * 
+ */
+
+  /* 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("_cython.cygrpc.AioRpcStatus.trailing_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_7trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_7trailing_metadata = {"trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_7trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_7trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("trailing_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("trailing_metadata", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "trailing_metadata", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_6trailing_metadata(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_6trailing_metadata(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__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("trailing_metadata", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_12AioRpcStatus_trailing_metadata(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(30, 37, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus.trailing_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":40
+ *         return self._trailing_metadata
+ * 
+ *     cpdef str debug_error_string(self):             # <<<<<<<<<<<<<<
+ *         return self._debug_error_string
+ * 
+ */
+
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_9debug_error_string(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_12AioRpcStatus_debug_error_string(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, int __pyx_skip_dispatch) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("debug_error_string", 1);
+  /* Check if called by wrapper */
+  if (unlikely(__pyx_skip_dispatch)) ;
+  /* Check if overridden in Python */
+  else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) {
+    #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+    static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
+    if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) {
+      PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
+      #endif
+      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_debug_error_string); if (unlikely(!__pyx_t_1)) __PYX_ERR(30, 40, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_9debug_error_string)) {
+        __Pyx_XDECREF(__pyx_r);
+        __Pyx_INCREF(__pyx_t_1);
+        __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
+        __pyx_t_5 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_3))) {
+          __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+          if (likely(__pyx_t_4)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+            __Pyx_INCREF(__pyx_t_4);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_3, function);
+            __pyx_t_5 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+          __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 40, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        }
+        if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_2))) __PYX_ERR(30, 40, __pyx_L1_error)
+        __pyx_r = ((PyObject*)__pyx_t_2);
+        __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        goto __pyx_L0;
+      }
+      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+      __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
+      __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self));
+      if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) {
+        __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
+      }
+      #endif
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+    }
+    #endif
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":41
+ * 
+ *     cpdef str debug_error_string(self):
+ *         return self._debug_error_string             # <<<<<<<<<<<<<<
+ * 
+ *     cdef grpc_status_code c_code(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_debug_error_string);
+  __pyx_r = __pyx_v_self->_debug_error_string;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":40
+ *         return self._trailing_metadata
+ * 
+ *     cpdef str debug_error_string(self):             # <<<<<<<<<<<<<<
+ *         return self._debug_error_string
+ * 
+ */
+
+  /* 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("_cython.cygrpc.AioRpcStatus.debug_error_string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_9debug_error_string(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_9debug_error_string = {"debug_error_string", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_9debug_error_string, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_9debug_error_string(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("debug_error_string (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("debug_error_string", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "debug_error_string", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_8debug_error_string(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_8debug_error_string(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__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("debug_error_string", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_12AioRpcStatus_debug_error_string(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(30, 40, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus.debug_error_string", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":43
+ *         return self._debug_error_string
+ * 
+ *     cdef grpc_status_code c_code(self):             # <<<<<<<<<<<<<<
+ *         return <grpc_status_code>self._code
+ */
+
+static grpc_status_code __pyx_f_7_cython_6cygrpc_12AioRpcStatus_c_code(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self) {
+  grpc_status_code __pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":44
+ * 
+ *     cdef grpc_status_code c_code(self):
+ *         return <grpc_status_code>self._code             # <<<<<<<<<<<<<<
+ */
+  __pyx_r = ((grpc_status_code)__pyx_v_self->_code);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":43
+ *         return self._debug_error_string
+ * 
+ *     cdef grpc_status_code c_code(self):             # <<<<<<<<<<<<<<
+ *         return <grpc_status_code>self._code
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pxd.pxi":19
+ * cdef class AioRpcStatus(Exception):
+ *     cdef readonly:
+ *         grpc_status_code _code             # <<<<<<<<<<<<<<
+ *         str _details
+ *         # Per the spec, only client-side status has trailing metadata.
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_5_code_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_5_code_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_5_code___get__(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_5_code___get__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__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("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_status_code(__pyx_v_self->_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(31, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus._code.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pxd.pxi":20
+ *     cdef readonly:
+ *         grpc_status_code _code
+ *         str _details             # <<<<<<<<<<<<<<
+ *         # Per the spec, only client-side status has trailing metadata.
+ *         tuple _trailing_metadata
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_8_details_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_8_details_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_8_details___get__(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_8_details___get__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_details);
+  __pyx_r = __pyx_v_self->_details;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pxd.pxi":22
+ *         str _details
+ *         # Per the spec, only client-side status has trailing metadata.
+ *         tuple _trailing_metadata             # <<<<<<<<<<<<<<
+ *         str _debug_error_string
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_18_trailing_metadata_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_18_trailing_metadata_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_18_trailing_metadata___get__(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_18_trailing_metadata___get__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_trailing_metadata);
+  __pyx_r = __pyx_v_self->_trailing_metadata;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pxd.pxi":23
+ *         # Per the spec, only client-side status has trailing metadata.
+ *         tuple _trailing_metadata
+ *         str _debug_error_string             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef grpc_status_code code(self)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_19_debug_error_string_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_19_debug_error_string_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_19_debug_error_string___get__(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_19_debug_error_string___get__(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_debug_error_string);
+  __pyx_r = __pyx_v_self->_debug_error_string;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_11__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_11__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_11__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_11__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_10__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_13__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_13__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_13__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_13__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_12AioRpcStatus_12__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_12AioRpcStatus_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioRpcStatus.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":30
+ *     from posix cimport unistd
+ * 
+ *     cdef void _unified_socket_write(int fd) nogil:             # <<<<<<<<<<<<<<
+ *         unistd.write(fd, b"1", 1)
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc__unified_socket_write(int __pyx_v_fd) {
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":31
+ * 
+ *     cdef void _unified_socket_write(int fd) nogil:
+ *         unistd.write(fd, b"1", 1)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  (void)(write(__pyx_v_fd, ((char *)"1"), 1));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":30
+ *     from posix cimport unistd
+ * 
+ *     cdef void _unified_socket_write(int fd) nogil:             # <<<<<<<<<<<<<<
+ *         unistd.write(fd, b"1", 1)
+ * 
+ */
+
+  /* function exit code */
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":34
+ * 
+ * 
+ * def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success):             # <<<<<<<<<<<<<<
+ *     CallbackWrapper.functor_run(callback_wrapper.c_functor(), success)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_125_handle_callback_wrapper(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_125_handle_callback_wrapper = {"_handle_callback_wrapper", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_125_handle_callback_wrapper, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_125_handle_callback_wrapper(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_callback_wrapper = 0;
+  int __pyx_v_success;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_callback_wrapper (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_callback_wrapper,&__pyx_n_s_success,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_callback_wrapper)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(7, 34, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_success)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(7, 34, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_callback_wrapper", 1, 2, 2, 1); __PYX_ERR(7, 34, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_callback_wrapper") < 0)) __PYX_ERR(7, 34, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_callback_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)values[0]);
+    __pyx_v_success = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_success == (int)-1) && PyErr_Occurred())) __PYX_ERR(7, 34, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_callback_wrapper", 1, 2, 2, __pyx_nargs); __PYX_ERR(7, 34, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._handle_callback_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_callback_wrapper), __pyx_ptype_7_cython_6cygrpc_CallbackWrapper, 1, "callback_wrapper", 0))) __PYX_ERR(7, 34, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_124_handle_callback_wrapper(__pyx_self, __pyx_v_callback_wrapper, __pyx_v_success);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_124_handle_callback_wrapper(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_callback_wrapper, int __pyx_v_success) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  grpc_completion_queue_functor *__pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_callback_wrapper", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":35
+ * 
+ * def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success):
+ *     CallbackWrapper.functor_run(callback_wrapper.c_functor(), success)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper *)__pyx_v_callback_wrapper->__pyx_vtab)->c_functor(__pyx_v_callback_wrapper); if (unlikely(PyErr_Occurred())) __PYX_ERR(7, 35, __pyx_L1_error)
+  __pyx_f_7_cython_6cygrpc_15CallbackWrapper_functor_run(__pyx_t_1, __pyx_v_success);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":34
+ * 
+ * 
+ * def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success):             # <<<<<<<<<<<<<<
+ *     CallbackWrapper.functor_run(callback_wrapper.c_functor(), success)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._handle_callback_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":40
+ * cdef class BaseCompletionQueue:
+ * 
+ *     cdef grpc_completion_queue* c_ptr(self):             # <<<<<<<<<<<<<<
+ *         return self._cq
+ * 
+ */
+
+static grpc_completion_queue *__pyx_f_7_cython_6cygrpc_19BaseCompletionQueue_c_ptr(struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *__pyx_v_self) {
+  grpc_completion_queue *__pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":41
+ * 
+ *     cdef grpc_completion_queue* c_ptr(self):
+ *         return self._cq             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_self->_cq;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":40
+ * cdef class BaseCompletionQueue:
+ * 
+ *     cdef grpc_completion_queue* c_ptr(self):             # <<<<<<<<<<<<<<
+ *         return self._cq
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BaseCompletionQueue_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19BaseCompletionQueue_1__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19BaseCompletionQueue_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BaseCompletionQueue_1__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BaseCompletionQueue___reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BaseCompletionQueue___reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self__cq_cannot_be_converted_to, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.BaseCompletionQueue.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BaseCompletionQueue_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19BaseCompletionQueue_3__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19BaseCompletionQueue_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19BaseCompletionQueue_3__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.BaseCompletionQueue.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19BaseCompletionQueue_2__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19BaseCompletionQueue_2__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_self__cq_cannot_be_converted_to, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.BaseCompletionQueue.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":46
+ * cdef class _BoundEventLoop:
+ * 
+ *     def __cinit__(self, object loop, object read_socket, object handler):             # <<<<<<<<<<<<<<
+ *         global _has_fd_monitoring
+ *         self.loop = loop
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_loop = 0;
+  PyObject *__pyx_v_read_socket = 0;
+  PyObject *__pyx_v_handler = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_loop,&__pyx_n_s_read_socket,&__pyx_n_s_handler,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(7, 46, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_read_socket)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(7, 46, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(7, 46, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(7, 46, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(7, 46, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(7, 46, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+    }
+    __pyx_v_loop = values[0];
+    __pyx_v_read_socket = values[1];
+    __pyx_v_handler = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(7, 46, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._BoundEventLoop.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_BoundEventLoop___cinit__(((struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)__pyx_v_self), __pyx_v_loop, __pyx_v_read_socket, __pyx_v_handler);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_15_BoundEventLoop___cinit__(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self, PyObject *__pyx_v_loop, PyObject *__pyx_v_read_socket, PyObject *__pyx_v_handler) {
+  PyObject *__pyx_v_reader_function = NULL;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":48
+ *     def __cinit__(self, object loop, object read_socket, object handler):
+ *         global _has_fd_monitoring
+ *         self.loop = loop             # <<<<<<<<<<<<<<
+ *         self.read_socket = read_socket
+ *         reader_function = functools.partial(
+ */
+  __Pyx_INCREF(__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_v_loop);
+  __Pyx_GOTREF(__pyx_v_self->loop);
+  __Pyx_DECREF(__pyx_v_self->loop);
+  __pyx_v_self->loop = __pyx_v_loop;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":49
+ *         global _has_fd_monitoring
+ *         self.loop = loop
+ *         self.read_socket = read_socket             # <<<<<<<<<<<<<<
+ *         reader_function = functools.partial(
+ *             handler,
+ */
+  __Pyx_INCREF(__pyx_v_read_socket);
+  __Pyx_GIVEREF(__pyx_v_read_socket);
+  __Pyx_GOTREF(__pyx_v_self->read_socket);
+  __Pyx_DECREF(__pyx_v_self->read_socket);
+  __pyx_v_self->read_socket = __pyx_v_read_socket;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":50
+ *         self.loop = loop
+ *         self.read_socket = read_socket
+ *         reader_function = functools.partial(             # <<<<<<<<<<<<<<
+ *             handler,
+ *             loop
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_functools); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_partial); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":52
+ *         reader_function = functools.partial(
+ *             handler,
+ *             loop             # <<<<<<<<<<<<<<
+ *         )
+ *         # NOTE(lidiz) There isn't a way to cleanly pre-check if fd monitoring
+ */
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_handler, __pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 50, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v_reader_function = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":58
+ *         # good enough. The application can has its own loop implementation, or
+ *         # uses different types of event loops (e.g., 1 Proactor, 3 Selectors).
+ *         if _has_fd_monitoring:             # <<<<<<<<<<<<<<
+ *             try:
+ *                 self.loop.add_reader(self.read_socket, reader_function)
+ */
+  if (__pyx_v_7_cython_6cygrpc__has_fd_monitoring) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":59
+ *         # uses different types of event loops (e.g., 1 Proactor, 3 Selectors).
+ *         if _has_fd_monitoring:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 self.loop.add_reader(self.read_socket, reader_function)
+ *                 self._has_reader = True
+ */
+    {
+      __Pyx_PyThreadState_declare
+      __Pyx_PyThreadState_assign
+      __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:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":60
+ *         if _has_fd_monitoring:
+ *             try:
+ *                 self.loop.add_reader(self.read_socket, reader_function)             # <<<<<<<<<<<<<<
+ *                 self._has_reader = True
+ *             except NotImplementedError:
+ */
+        __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->loop, __pyx_n_s_add_reader); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 60, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_2 = NULL;
+        __pyx_t_4 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (likely(PyMethod_Check(__pyx_t_3))) {
+          __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+          if (likely(__pyx_t_2)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+            __Pyx_INCREF(__pyx_t_2);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_3, function);
+            __pyx_t_4 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_self->read_socket, __pyx_v_reader_function};
+          __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 60, __pyx_L4_error)
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":61
+ *             try:
+ *                 self.loop.add_reader(self.read_socket, reader_function)
+ *                 self._has_reader = True             # <<<<<<<<<<<<<<
+ *             except NotImplementedError:
+ *                 _has_fd_monitoring = False
+ */
+        __pyx_v_self->_has_reader = 1;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":59
+ *         # uses different types of event loops (e.g., 1 Proactor, 3 Selectors).
+ *         if _has_fd_monitoring:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 self.loop.add_reader(self.read_socket, reader_function)
+ *                 self._has_reader = True
+ */
+      }
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L9_try_end;
+      __pyx_L4_error:;
+      __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;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":62
+ *                 self.loop.add_reader(self.read_socket, reader_function)
+ *                 self._has_reader = True
+ *             except NotImplementedError:             # <<<<<<<<<<<<<<
+ *                 _has_fd_monitoring = False
+ *                 self._has_reader = False
+ */
+      __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_NotImplementedError);
+      if (__pyx_t_8) {
+        __Pyx_AddTraceback("_cython.cygrpc._BoundEventLoop.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+        if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) __PYX_ERR(7, 62, __pyx_L6_except_error)
+        __Pyx_XGOTREF(__pyx_t_1);
+        __Pyx_XGOTREF(__pyx_t_3);
+        __Pyx_XGOTREF(__pyx_t_2);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":63
+ *                 self._has_reader = True
+ *             except NotImplementedError:
+ *                 _has_fd_monitoring = False             # <<<<<<<<<<<<<<
+ *                 self._has_reader = False
+ * 
+ */
+        __pyx_v_7_cython_6cygrpc__has_fd_monitoring = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":64
+ *             except NotImplementedError:
+ *                 _has_fd_monitoring = False
+ *                 self._has_reader = False             # <<<<<<<<<<<<<<
+ * 
+ *     def close(self):
+ */
+        __pyx_v_self->_has_reader = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        goto __pyx_L5_exception_handled;
+      }
+      goto __pyx_L6_except_error;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":59
+ *         # uses different types of event loops (e.g., 1 Proactor, 3 Selectors).
+ *         if _has_fd_monitoring:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 self.loop.add_reader(self.read_socket, reader_function)
+ *                 self._has_reader = True
+ */
+      __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_L5_exception_handled:;
+      __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);
+      __pyx_L9_try_end:;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":58
+ *         # good enough. The application can has its own loop implementation, or
+ *         # uses different types of event loops (e.g., 1 Proactor, 3 Selectors).
+ *         if _has_fd_monitoring:             # <<<<<<<<<<<<<<
+ *             try:
+ *                 self.loop.add_reader(self.read_socket, reader_function)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":46
+ * cdef class _BoundEventLoop:
+ * 
+ *     def __cinit__(self, object loop, object read_socket, object handler):             # <<<<<<<<<<<<<<
+ *         global _has_fd_monitoring
+ *         self.loop = loop
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._BoundEventLoop.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_reader_function);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":66
+ *                 self._has_reader = False
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         if self.loop:
+ *             if self._has_reader:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_3close(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15_BoundEventLoop_3close = {"close", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_3close, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_3close(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("close (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("close", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "close", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_2close(((struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_2close(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("close", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":67
+ * 
+ *     def close(self):
+ *         if self.loop:             # <<<<<<<<<<<<<<
+ *             if self._has_reader:
+ *                 self.loop.remove_reader(self.read_socket)
+ */
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->loop); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(7, 67, __pyx_L1_error)
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":68
+ *     def close(self):
+ *         if self.loop:
+ *             if self._has_reader:             # <<<<<<<<<<<<<<
+ *                 self.loop.remove_reader(self.read_socket)
+ * 
+ */
+    if (__pyx_v_self->_has_reader) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":69
+ *         if self.loop:
+ *             if self._has_reader:
+ *                 self.loop.remove_reader(self.read_socket)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->loop, __pyx_n_s_remove_reader); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 69, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = NULL;
+      __pyx_t_5 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (likely(PyMethod_Check(__pyx_t_3))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_3, function);
+          __pyx_t_5 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_self->read_socket};
+        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 69, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":68
+ *     def close(self):
+ *         if self.loop:
+ *             if self._has_reader:             # <<<<<<<<<<<<<<
+ *                 self.loop.remove_reader(self.read_socket)
+ * 
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":67
+ * 
+ *     def close(self):
+ *         if self.loop:             # <<<<<<<<<<<<<<
+ *             if self._has_reader:
+ *                 self.loop.remove_reader(self.read_socket)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":66
+ *                 self._has_reader = False
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         if self.loop:
+ *             if self._has_reader:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._BoundEventLoop.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi":36
+ * 
+ * cdef class _BoundEventLoop:
+ *     cdef readonly object loop             # <<<<<<<<<<<<<<
+ *     cdef readonly object read_socket  # socket.socket
+ *     cdef bint _has_reader
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_4loop_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_4loop_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_4loop___get__(((struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_4loop___get__(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->loop);
+  __pyx_r = __pyx_v_self->loop;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi":37
+ * cdef class _BoundEventLoop:
+ *     cdef readonly object loop
+ *     cdef readonly object read_socket  # socket.socket             # <<<<<<<<<<<<<<
+ *     cdef bint _has_reader
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_11read_socket_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_11read_socket_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_11read_socket___get__(((struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_11read_socket___get__(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->read_socket);
+  __pyx_r = __pyx_v_self->read_socket;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15_BoundEventLoop_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._BoundEventLoop.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15_BoundEventLoop_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._BoundEventLoop.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15_BoundEventLoop_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._BoundEventLoop.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":74
+ * cdef class PollerCompletionQueue(BaseCompletionQueue):
+ * 
+ *     def __cinit__(self):             # <<<<<<<<<<<<<<
+ *         self._cq = grpc_completion_queue_create_for_next(NULL)
+ *         self._shutdown = False
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue___cinit__(((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue___cinit__(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":75
+ * 
+ *     def __cinit__(self):
+ *         self._cq = grpc_completion_queue_create_for_next(NULL)             # <<<<<<<<<<<<<<
+ *         self._shutdown = False
+ *         self._poller_thread = threading.Thread(target=self._poll_wrapper, daemon=True)
+ */
+  __pyx_v_self->__pyx_base._cq = grpc_completion_queue_create_for_next(NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":76
+ *     def __cinit__(self):
+ *         self._cq = grpc_completion_queue_create_for_next(NULL)
+ *         self._shutdown = False             # <<<<<<<<<<<<<<
+ *         self._poller_thread = threading.Thread(target=self._poll_wrapper, daemon=True)
+ *         self._poller_thread.start()
+ */
+  __pyx_v_self->_shutdown = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":77
+ *         self._cq = grpc_completion_queue_create_for_next(NULL)
+ *         self._shutdown = False
+ *         self._poller_thread = threading.Thread(target=self._poll_wrapper, daemon=True)             # <<<<<<<<<<<<<<
+ *         self._poller_thread.start()
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_threading); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Thread); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_poll_wrapper); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_target, __pyx_t_3) < 0) __PYX_ERR(7, 77, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_daemon, Py_True) < 0) __PYX_ERR(7, 77, __pyx_L1_error)
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->_poller_thread);
+  __Pyx_DECREF(__pyx_v_self->_poller_thread);
+  __pyx_v_self->_poller_thread = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":78
+ *         self._shutdown = False
+ *         self._poller_thread = threading.Thread(target=self._poll_wrapper, daemon=True)
+ *         self._poller_thread.start()             # <<<<<<<<<<<<<<
+ * 
+ *         self._read_socket, self._write_socket = socket.socketpair()
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_poller_thread, __pyx_n_s_start); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 78, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":80
+ *         self._poller_thread.start()
+ * 
+ *         self._read_socket, self._write_socket = socket.socketpair()             # <<<<<<<<<<<<<<
+ *         self._write_fd = self._write_socket.fileno()
+ *         self._loops = {}
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_socket); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_socketpair); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+    PyObject* sequence = __pyx_t_3;
+    Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+    if (unlikely(size != 2)) {
+      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+      __PYX_ERR(7, 80, __pyx_L1_error)
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    if (likely(PyTuple_CheckExact(sequence))) {
+      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
+      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
+    } else {
+      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
+      __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
+    }
+    __Pyx_INCREF(__pyx_t_2);
+    __Pyx_INCREF(__pyx_t_1);
+    #else
+    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    #endif
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  } else {
+    Py_ssize_t index = -1;
+    __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(7, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_5);
+    index = 0; __pyx_t_2 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
+    __Pyx_GOTREF(__pyx_t_2);
+    index = 1; __pyx_t_1 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed;
+    __Pyx_GOTREF(__pyx_t_1);
+    if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 2) < 0) __PYX_ERR(7, 80, __pyx_L1_error)
+    __pyx_t_6 = NULL;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    goto __pyx_L4_unpacking_done;
+    __pyx_L3_unpacking_failed:;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_6 = NULL;
+    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+    __PYX_ERR(7, 80, __pyx_L1_error)
+    __pyx_L4_unpacking_done:;
+  }
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->_read_socket);
+  __Pyx_DECREF(__pyx_v_self->_read_socket);
+  __pyx_v_self->_read_socket = __pyx_t_2;
+  __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_write_socket);
+  __Pyx_DECREF(__pyx_v_self->_write_socket);
+  __pyx_v_self->_write_socket = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":81
+ * 
+ *         self._read_socket, self._write_socket = socket.socketpair()
+ *         self._write_fd = self._write_socket.fileno()             # <<<<<<<<<<<<<<
+ *         self._loops = {}
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_write_socket, __pyx_n_s_fileno); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 81, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 81, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(7, 81, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_self->_write_fd = __pyx_t_7;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":82
+ *         self._read_socket, self._write_socket = socket.socketpair()
+ *         self._write_fd = self._write_socket.fileno()
+ *         self._loops = {}             # <<<<<<<<<<<<<<
+ * 
+ *         # The read socket might be read by multiple threads. But only one of them will
+ */
+  __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 82, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->_loops);
+  __Pyx_DECREF(__pyx_v_self->_loops);
+  __pyx_v_self->_loops = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":87
+ *         # read the 1 byte sent by the poller thread. This setting is essential to allow
+ *         # multiple loops in multiple threads bound to the same poller.
+ *         self._read_socket.setblocking(False)             # <<<<<<<<<<<<<<
+ * 
+ *         self._queue = cpp_event_queue()
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_read_socket, __pyx_n_s_setblocking); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 87, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, Py_False};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 87, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":89
+ *         self._read_socket.setblocking(False)
+ * 
+ *         self._queue = cpp_event_queue()             # <<<<<<<<<<<<<<
+ * 
+ *     def bind_loop(self, object loop):
+ */
+  __pyx_v_self->_queue = __pyx_t_7_cython_6cygrpc_cpp_event_queue();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":74
+ * cdef class PollerCompletionQueue(BaseCompletionQueue):
+ * 
+ *     def __cinit__(self):             # <<<<<<<<<<<<<<
+ *         self._cq = grpc_completion_queue_create_for_next(NULL)
+ *         self._shutdown = False
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  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_5);
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":91
+ *         self._queue = cpp_event_queue()
+ * 
+ *     def bind_loop(self, object loop):             # <<<<<<<<<<<<<<
+ *         if loop in self._loops:
+ *             return
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_3bind_loop(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_3bind_loop = {"bind_loop", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_3bind_loop, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_3bind_loop(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("bind_loop (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(7, 91, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "bind_loop") < 0)) __PYX_ERR(7, 91, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_loop = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("bind_loop", 1, 1, 1, __pyx_nargs); __PYX_ERR(7, 91, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue.bind_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_2bind_loop(((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_self), __pyx_v_loop);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_2bind_loop(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self, PyObject *__pyx_v_loop) {
+  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("bind_loop", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":92
+ * 
+ *     def bind_loop(self, object loop):
+ *         if loop in self._loops:             # <<<<<<<<<<<<<<
+ *             return
+ *         else:
+ */
+  if (unlikely(__pyx_v_self->_loops == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    __PYX_ERR(7, 92, __pyx_L1_error)
+  }
+  __pyx_t_1 = (__Pyx_PyDict_ContainsTF(__pyx_v_loop, __pyx_v_self->_loops, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(7, 92, __pyx_L1_error)
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":93
+ *     def bind_loop(self, object loop):
+ *         if loop in self._loops:
+ *             return             # <<<<<<<<<<<<<<
+ *         else:
+ *             self._loops[loop] = _BoundEventLoop(loop, self._read_socket, self._handle_events)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":92
+ * 
+ *     def bind_loop(self, object loop):
+ *         if loop in self._loops:             # <<<<<<<<<<<<<<
+ *             return
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":95
+ *             return
+ *         else:
+ *             self._loops[loop] = _BoundEventLoop(loop, self._read_socket, self._handle_events)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef void _poll(self) nogil:
+ */
+  /*else*/ {
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_handle_events); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 95, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 95, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF(__pyx_v_loop);
+    __Pyx_GIVEREF(__pyx_v_loop);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_loop)) __PYX_ERR(7, 95, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_self->_read_socket);
+    __Pyx_GIVEREF(__pyx_v_self->_read_socket);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->_read_socket)) __PYX_ERR(7, 95, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_2);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(7, 95, __pyx_L1_error);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__BoundEventLoop), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 95, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(__pyx_v_self->_loops == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      __PYX_ERR(7, 95, __pyx_L1_error)
+    }
+    if (unlikely((PyDict_SetItem(__pyx_v_self->_loops, __pyx_v_loop, __pyx_t_2) < 0))) __PYX_ERR(7, 95, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":91
+ *         self._queue = cpp_event_queue()
+ * 
+ *     def bind_loop(self, object loop):             # <<<<<<<<<<<<<<
+ *         if loop in self._loops:
+ *             return
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue.bind_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":97
+ *             self._loops[loop] = _BoundEventLoop(loop, self._read_socket, self._handle_events)
+ * 
+ *     cdef void _poll(self) nogil:             # <<<<<<<<<<<<<<
+ *         cdef grpc_event event
+ *         cdef CallbackContext *context
+ */
+
+static void __pyx_f_7_cython_6cygrpc_21PollerCompletionQueue__poll(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self) {
+  grpc_event __pyx_v_event;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  #ifdef WITH_THREAD
+  PyGILState_STATE __pyx_gilstate_save;
+  #endif
+  __Pyx_RefNannySetupContext("_poll", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":101
+ *         cdef CallbackContext *context
+ * 
+ *         while not self._shutdown:             # <<<<<<<<<<<<<<
+ *             event = grpc_completion_queue_next(self._cq,
+ *                                                _GPR_INF_FUTURE,
+ */
+  while (1) {
+    __pyx_t_1 = (!__pyx_v_self->_shutdown);
+    if (!__pyx_t_1) break;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":102
+ * 
+ *         while not self._shutdown:
+ *             event = grpc_completion_queue_next(self._cq,             # <<<<<<<<<<<<<<
+ *                                                _GPR_INF_FUTURE,
+ *                                                NULL)
+ */
+    __pyx_v_event = grpc_completion_queue_next(__pyx_v_self->__pyx_base._cq, __pyx_v_7_cython_6cygrpc__GPR_INF_FUTURE, NULL);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":106
+ *                                                NULL)
+ * 
+ *             if event.type == GRPC_QUEUE_TIMEOUT:             # <<<<<<<<<<<<<<
+ *                 with gil:
+ *                     raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!")
+ */
+    switch (__pyx_v_event.type) {
+      case GRPC_QUEUE_TIMEOUT:
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":107
+ * 
+ *             if event.type == GRPC_QUEUE_TIMEOUT:
+ *                 with gil:             # <<<<<<<<<<<<<<
+ *                     raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!")
+ *             elif event.type == GRPC_QUEUE_SHUTDOWN:
+ */
+      {
+          #ifdef WITH_THREAD
+          PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+          #endif
+          /*try:*/ {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":108
+ *             if event.type == GRPC_QUEUE_TIMEOUT:
+ *                 with gil:
+ *                     raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!")             # <<<<<<<<<<<<<<
+ *             elif event.type == GRPC_QUEUE_SHUTDOWN:
+ *                 self._shutdown = True
+ */
+            __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_AssertionError, __pyx_tuple__50, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 108, __pyx_L8_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __PYX_ERR(7, 108, __pyx_L8_error)
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":107
+ * 
+ *             if event.type == GRPC_QUEUE_TIMEOUT:
+ *                 with gil:             # <<<<<<<<<<<<<<
+ *                     raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!")
+ *             elif event.type == GRPC_QUEUE_SHUTDOWN:
+ */
+          /*finally:*/ {
+            __pyx_L8_error: {
+              #ifdef WITH_THREAD
+              __Pyx_PyGILState_Release(__pyx_gilstate_save);
+              #endif
+              goto __pyx_L1_error;
+            }
+          }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":106
+ *                                                NULL)
+ * 
+ *             if event.type == GRPC_QUEUE_TIMEOUT:             # <<<<<<<<<<<<<<
+ *                 with gil:
+ *                     raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!")
+ */
+      break;
+      case GRPC_QUEUE_SHUTDOWN:
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":110
+ *                     raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!")
+ *             elif event.type == GRPC_QUEUE_SHUTDOWN:
+ *                 self._shutdown = True             # <<<<<<<<<<<<<<
+ *             else:
+ *                 self._queue_mutex.lock()
+ */
+      __pyx_v_self->_shutdown = 1;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":109
+ *                 with gil:
+ *                     raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!")
+ *             elif event.type == GRPC_QUEUE_SHUTDOWN:             # <<<<<<<<<<<<<<
+ *                 self._shutdown = True
+ *             else:
+ */
+      break;
+      default:
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":112
+ *                 self._shutdown = True
+ *             else:
+ *                 self._queue_mutex.lock()             # <<<<<<<<<<<<<<
+ *                 self._queue.push(event)
+ *                 self._queue_mutex.unlock()
+ */
+      __pyx_v_self->_queue_mutex.lock();
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":113
+ *             else:
+ *                 self._queue_mutex.lock()
+ *                 self._queue.push(event)             # <<<<<<<<<<<<<<
+ *                 self._queue_mutex.unlock()
+ *                 if _has_fd_monitoring:
+ */
+      __pyx_v_self->_queue.push(__pyx_v_event);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":114
+ *                 self._queue_mutex.lock()
+ *                 self._queue.push(event)
+ *                 self._queue_mutex.unlock()             # <<<<<<<<<<<<<<
+ *                 if _has_fd_monitoring:
+ *                     _unified_socket_write(self._write_fd)
+ */
+      __pyx_v_self->_queue_mutex.unlock();
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":115
+ *                 self._queue.push(event)
+ *                 self._queue_mutex.unlock()
+ *                 if _has_fd_monitoring:             # <<<<<<<<<<<<<<
+ *                     _unified_socket_write(self._write_fd)
+ *                 else:
+ */
+      if (__pyx_v_7_cython_6cygrpc__has_fd_monitoring) {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":116
+ *                 self._queue_mutex.unlock()
+ *                 if _has_fd_monitoring:
+ *                     _unified_socket_write(self._write_fd)             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     with gil:
+ */
+        __pyx_f_7_cython_6cygrpc__unified_socket_write(__pyx_v_self->_write_fd); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(7, 116, __pyx_L1_error)
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":115
+ *                 self._queue.push(event)
+ *                 self._queue_mutex.unlock()
+ *                 if _has_fd_monitoring:             # <<<<<<<<<<<<<<
+ *                     _unified_socket_write(self._write_fd)
+ *                 else:
+ */
+        goto __pyx_L10;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":118
+ *                     _unified_socket_write(self._write_fd)
+ *                 else:
+ *                     with gil:             # <<<<<<<<<<<<<<
+ *                         # Event loops can be paused or killed at any time. So,
+ *                         # instead of deligate to any thread, the polling thread
+ */
+      /*else*/ {
+        {
+            #ifdef WITH_THREAD
+            PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+            #endif
+            /*try:*/ {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":122
+ *                         # instead of deligate to any thread, the polling thread
+ *                         # should handle the distribution of the event.
+ *                         self._handle_events(None)             # <<<<<<<<<<<<<<
+ * 
+ *     def _poll_wrapper(self):
+ */
+              __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_handle_events); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 122, __pyx_L14_error)
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_4 = NULL;
+              __pyx_t_5 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (likely(PyMethod_Check(__pyx_t_3))) {
+                __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+                if (likely(__pyx_t_4)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+                  __Pyx_INCREF(__pyx_t_4);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_3, function);
+                  __pyx_t_5 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_4, Py_None};
+                __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+                __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+                if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 122, __pyx_L14_error)
+                __Pyx_GOTREF(__pyx_t_2);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":118
+ *                     _unified_socket_write(self._write_fd)
+ *                 else:
+ *                     with gil:             # <<<<<<<<<<<<<<
+ *                         # Event loops can be paused or killed at any time. So,
+ *                         # instead of deligate to any thread, the polling thread
+ */
+            /*finally:*/ {
+              /*normal exit:*/{
+                #ifdef WITH_THREAD
+                __Pyx_PyGILState_Release(__pyx_gilstate_save);
+                #endif
+                goto __pyx_L15;
+              }
+              __pyx_L14_error: {
+                #ifdef WITH_THREAD
+                __Pyx_PyGILState_Release(__pyx_gilstate_save);
+                #endif
+                goto __pyx_L1_error;
+              }
+              __pyx_L15:;
+            }
+        }
+      }
+      __pyx_L10:;
+      break;
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":97
+ *             self._loops[loop] = _BoundEventLoop(loop, self._read_socket, self._handle_events)
+ * 
+ *     cdef void _poll(self) nogil:             # <<<<<<<<<<<<<<
+ *         cdef grpc_event event
+ *         cdef CallbackContext *context
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  #ifdef WITH_THREAD
+  __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
+  #endif
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue._poll", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  #ifdef WITH_THREAD
+  __Pyx_PyGILState_Release(__pyx_gilstate_save);
+  #endif
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContextNogil()
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":124
+ *                         self._handle_events(None)
+ * 
+ *     def _poll_wrapper(self):             # <<<<<<<<<<<<<<
+ *         with nogil:
+ *             self._poll()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_5_poll_wrapper(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_5_poll_wrapper = {"_poll_wrapper", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_5_poll_wrapper, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_5_poll_wrapper(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_poll_wrapper (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("_poll_wrapper", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_poll_wrapper", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_4_poll_wrapper(((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_4_poll_wrapper(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_poll_wrapper", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":125
+ * 
+ *     def _poll_wrapper(self):
+ *         with nogil:             # <<<<<<<<<<<<<<
+ *             self._poll()
+ * 
+ */
+  {
+      #ifdef WITH_THREAD
+      PyThreadState *_save;
+      _save = NULL;
+      Py_UNBLOCK_THREADS
+      __Pyx_FastGIL_Remember();
+      #endif
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":126
+ *     def _poll_wrapper(self):
+ *         with nogil:
+ *             self._poll()             # <<<<<<<<<<<<<<
+ * 
+ *     cdef shutdown(self):
+ */
+        ((struct __pyx_vtabstruct_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_self->__pyx_base.__pyx_vtab)->_poll(__pyx_v_self); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(7, 126, __pyx_L4_error)
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":125
+ * 
+ *     def _poll_wrapper(self):
+ *         with nogil:             # <<<<<<<<<<<<<<
+ *             self._poll()
+ * 
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L5;
+        }
+        __pyx_L4_error: {
+          #ifdef WITH_THREAD
+          __Pyx_FastGIL_Forget();
+          Py_BLOCK_THREADS
+          #endif
+          goto __pyx_L1_error;
+        }
+        __pyx_L5:;
+      }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":124
+ *                         self._handle_events(None)
+ * 
+ *     def _poll_wrapper(self):             # <<<<<<<<<<<<<<
+ *         with nogil:
+ *             self._poll()
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue._poll_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":128
+ *             self._poll()
+ * 
+ *     cdef shutdown(self):             # <<<<<<<<<<<<<<
+ *         # Removes the socket hook from loops
+ *         for loop in self._loops:
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_21PollerCompletionQueue_shutdown(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self) {
+  PyObject *__pyx_v_loop = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  unsigned int __pyx_t_9;
+  int __pyx_t_10;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("shutdown", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":130
+ *     cdef shutdown(self):
+ *         # Removes the socket hook from loops
+ *         for loop in self._loops:             # <<<<<<<<<<<<<<
+ *             self._loops.get(loop).close()
+ * 
+ */
+  __pyx_t_2 = 0;
+  if (unlikely(__pyx_v_self->_loops == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    __PYX_ERR(7, 130, __pyx_L1_error)
+  }
+  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_self->_loops, 1, ((PyObject *)NULL), (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(7, 130, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_1);
+  __pyx_t_1 = __pyx_t_5;
+  __pyx_t_5 = 0;
+  while (1) {
+    __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, NULL, NULL, __pyx_t_4);
+    if (unlikely(__pyx_t_6 == 0)) break;
+    if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(7, 130, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_XDECREF_SET(__pyx_v_loop, __pyx_t_5);
+    __pyx_t_5 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":131
+ *         # Removes the socket hook from loops
+ *         for loop in self._loops:
+ *             self._loops.get(loop).close()             # <<<<<<<<<<<<<<
+ * 
+ *         # TODO(https://github.com/grpc/grpc/issues/22365) perform graceful shutdown
+ */
+    if (unlikely(__pyx_v_self->_loops == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get");
+      __PYX_ERR(7, 131, __pyx_L1_error)
+    }
+    __pyx_t_7 = __Pyx_PyDict_GetItemDefault(__pyx_v_self->_loops, __pyx_v_loop, Py_None); if (unlikely(!__pyx_t_7)) __PYX_ERR(7, 131, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_close); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 131, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __pyx_t_7 = NULL;
+    __pyx_t_9 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_9 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
+      __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_9, 0+__pyx_t_9);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (unlikely(!__pyx_t_5)) __PYX_ERR(7, 131, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":134
+ * 
+ *         # TODO(https://github.com/grpc/grpc/issues/22365) perform graceful shutdown
+ *         grpc_completion_queue_shutdown(self._cq)             # <<<<<<<<<<<<<<
+ *         while not self._shutdown:
+ *             self._poller_thread.join(timeout=_POLL_AWAKE_INTERVAL_S)
+ */
+  grpc_completion_queue_shutdown(__pyx_v_self->__pyx_base._cq);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":135
+ *         # TODO(https://github.com/grpc/grpc/issues/22365) perform graceful shutdown
+ *         grpc_completion_queue_shutdown(self._cq)
+ *         while not self._shutdown:             # <<<<<<<<<<<<<<
+ *             self._poller_thread.join(timeout=_POLL_AWAKE_INTERVAL_S)
+ *         grpc_completion_queue_destroy(self._cq)
+ */
+  while (1) {
+    __pyx_t_10 = (!__pyx_v_self->_shutdown);
+    if (!__pyx_t_10) break;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":136
+ *         grpc_completion_queue_shutdown(self._cq)
+ *         while not self._shutdown:
+ *             self._poller_thread.join(timeout=_POLL_AWAKE_INTERVAL_S)             # <<<<<<<<<<<<<<
+ *         grpc_completion_queue_destroy(self._cq)
+ * 
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_poller_thread, __pyx_n_s_join); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 136, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(7, 136, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_8 = PyFloat_FromDouble(__pyx_v_7_cython_6cygrpc__POLL_AWAKE_INTERVAL_S); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 136, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_timeout, __pyx_t_8) < 0) __PYX_ERR(7, 136, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_5); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 136, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":137
+ *         while not self._shutdown:
+ *             self._poller_thread.join(timeout=_POLL_AWAKE_INTERVAL_S)
+ *         grpc_completion_queue_destroy(self._cq)             # <<<<<<<<<<<<<<
+ * 
+ *         # Clean up socket resources
+ */
+  grpc_completion_queue_destroy(__pyx_v_self->__pyx_base._cq);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":140
+ * 
+ *         # Clean up socket resources
+ *         self._read_socket.close()             # <<<<<<<<<<<<<<
+ *         self._write_socket.close()
+ * 
+ */
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_read_socket, __pyx_n_s_close); if (unlikely(!__pyx_t_5)) __PYX_ERR(7, 140, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_1 = NULL;
+  __pyx_t_9 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_5))) {
+    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
+    if (likely(__pyx_t_1)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_5, function);
+      __pyx_t_9 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+    __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_9, 0+__pyx_t_9);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 140, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":141
+ *         # Clean up socket resources
+ *         self._read_socket.close()
+ *         self._write_socket.close()             # <<<<<<<<<<<<<<
+ * 
+ *     def _handle_events(self, object context_loop):
+ */
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_write_socket, __pyx_n_s_close); if (unlikely(!__pyx_t_5)) __PYX_ERR(7, 141, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_1 = NULL;
+  __pyx_t_9 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_5))) {
+    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
+    if (likely(__pyx_t_1)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_5, function);
+      __pyx_t_9 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+    __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_9, 0+__pyx_t_9);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 141, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":128
+ *             self._poll()
+ * 
+ *     cdef shutdown(self):             # <<<<<<<<<<<<<<
+ *         # Removes the socket hook from loops
+ *         for loop in self._loops:
+ */
+
+  /* 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_5);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue.shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_loop);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":143
+ *         self._write_socket.close()
+ * 
+ *     def _handle_events(self, object context_loop):             # <<<<<<<<<<<<<<
+ *         cdef bytes data
+ *         if _has_fd_monitoring:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_7_handle_events(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_7_handle_events = {"_handle_events", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_7_handle_events, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_7_handle_events(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_context_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_events (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_context_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(7, 143, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_events") < 0)) __PYX_ERR(7, 143, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_context_loop = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_events", 1, 1, 1, __pyx_nargs); __PYX_ERR(7, 143, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue._handle_events", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_6_handle_events(((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_self), __pyx_v_context_loop);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_6_handle_events(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self, PyObject *__pyx_v_context_loop) {
+  CYTHON_UNUSED PyObject *__pyx_v_data = 0;
+  grpc_event __pyx_v_event;
+  struct __pyx_t_7_cython_6cygrpc_CallbackContext *__pyx_v_context;
+  PyObject *__pyx_v_loop = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_events", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":145
+ *     def _handle_events(self, object context_loop):
+ *         cdef bytes data
+ *         if _has_fd_monitoring:             # <<<<<<<<<<<<<<
+ *             # If fd monitoring is working, clean the socket without blocking.
+ *             data = self._read_socket.recv(1)
+ */
+  if (__pyx_v_7_cython_6cygrpc__has_fd_monitoring) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":147
+ *         if _has_fd_monitoring:
+ *             # If fd monitoring is working, clean the socket without blocking.
+ *             data = self._read_socket.recv(1)             # <<<<<<<<<<<<<<
+ *         cdef grpc_event event
+ *         cdef CallbackContext *context
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_read_socket, __pyx_n_s_recv); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 147, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_int_1};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 147, __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) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_1))) __PYX_ERR(7, 147, __pyx_L1_error)
+    __pyx_v_data = ((PyObject*)__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":145
+ *     def _handle_events(self, object context_loop):
+ *         cdef bytes data
+ *         if _has_fd_monitoring:             # <<<<<<<<<<<<<<
+ *             # If fd monitoring is working, clean the socket without blocking.
+ *             data = self._read_socket.recv(1)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":151
+ *         cdef CallbackContext *context
+ * 
+ *         while True:             # <<<<<<<<<<<<<<
+ *             self._queue_mutex.lock()
+ *             if self._queue.empty():
+ */
+  while (1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":152
+ * 
+ *         while True:
+ *             self._queue_mutex.lock()             # <<<<<<<<<<<<<<
+ *             if self._queue.empty():
+ *                 self._queue_mutex.unlock()
+ */
+    __pyx_v_self->_queue_mutex.lock();
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":153
+ *         while True:
+ *             self._queue_mutex.lock()
+ *             if self._queue.empty():             # <<<<<<<<<<<<<<
+ *                 self._queue_mutex.unlock()
+ *                 break
+ */
+    __pyx_t_5 = __pyx_v_self->_queue.empty();
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":154
+ *             self._queue_mutex.lock()
+ *             if self._queue.empty():
+ *                 self._queue_mutex.unlock()             # <<<<<<<<<<<<<<
+ *                 break
+ *             else:
+ */
+      __pyx_v_self->_queue_mutex.unlock();
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":155
+ *             if self._queue.empty():
+ *                 self._queue_mutex.unlock()
+ *                 break             # <<<<<<<<<<<<<<
+ *             else:
+ *                 event = self._queue.front()
+ */
+      goto __pyx_L5_break;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":153
+ *         while True:
+ *             self._queue_mutex.lock()
+ *             if self._queue.empty():             # <<<<<<<<<<<<<<
+ *                 self._queue_mutex.unlock()
+ *                 break
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":157
+ *                 break
+ *             else:
+ *                 event = self._queue.front()             # <<<<<<<<<<<<<<
+ *                 self._queue.pop()
+ *                 self._queue_mutex.unlock()
+ */
+    /*else*/ {
+      __pyx_v_event = __pyx_v_self->_queue.front();
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":158
+ *             else:
+ *                 event = self._queue.front()
+ *                 self._queue.pop()             # <<<<<<<<<<<<<<
+ *                 self._queue_mutex.unlock()
+ * 
+ */
+      __pyx_v_self->_queue.pop();
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":159
+ *                 event = self._queue.front()
+ *                 self._queue.pop()
+ *                 self._queue_mutex.unlock()             # <<<<<<<<<<<<<<
+ * 
+ *             context = <CallbackContext *>event.tag
+ */
+      __pyx_v_self->_queue_mutex.unlock();
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":161
+ *                 self._queue_mutex.unlock()
+ * 
+ *             context = <CallbackContext *>event.tag             # <<<<<<<<<<<<<<
+ *             loop = <object>context.loop
+ *             if loop is context_loop:
+ */
+    __pyx_v_context = ((struct __pyx_t_7_cython_6cygrpc_CallbackContext *)__pyx_v_event.tag);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":162
+ * 
+ *             context = <CallbackContext *>event.tag
+ *             loop = <object>context.loop             # <<<<<<<<<<<<<<
+ *             if loop is context_loop:
+ *                 # Executes callbacks: complete the future
+ */
+    __pyx_t_1 = ((PyObject *)__pyx_v_context->loop);
+    __Pyx_INCREF(__pyx_t_1);
+    __Pyx_XDECREF_SET(__pyx_v_loop, __pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":163
+ *             context = <CallbackContext *>event.tag
+ *             loop = <object>context.loop
+ *             if loop is context_loop:             # <<<<<<<<<<<<<<
+ *                 # Executes callbacks: complete the future
+ *                 CallbackWrapper.functor_run(
+ */
+    __pyx_t_5 = (__pyx_v_loop == __pyx_v_context_loop);
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":165
+ *             if loop is context_loop:
+ *                 # Executes callbacks: complete the future
+ *                 CallbackWrapper.functor_run(             # <<<<<<<<<<<<<<
+ *                     <grpc_completion_queue_functor *>event.tag,
+ *                     event.success
+ */
+      __pyx_f_7_cython_6cygrpc_15CallbackWrapper_functor_run(((grpc_completion_queue_functor *)__pyx_v_event.tag), __pyx_v_event.success);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":163
+ *             context = <CallbackContext *>event.tag
+ *             loop = <object>context.loop
+ *             if loop is context_loop:             # <<<<<<<<<<<<<<
+ *                 # Executes callbacks: complete the future
+ *                 CallbackWrapper.functor_run(
+ */
+      goto __pyx_L7;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":170
+ *                 )
+ *             else:
+ *                 loop.call_soon_threadsafe(             # <<<<<<<<<<<<<<
+ *                     _handle_callback_wrapper,
+ *                     <CallbackWrapper>context.callback_wrapper,
+ */
+    /*else*/ {
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_loop, __pyx_n_s_call_soon_threadsafe); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 170, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":171
+ *             else:
+ *                 loop.call_soon_threadsafe(
+ *                     _handle_callback_wrapper,             # <<<<<<<<<<<<<<
+ *                     <CallbackWrapper>context.callback_wrapper,
+ *                     event.success
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_handle_callback_wrapper); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 171, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":173
+ *                     _handle_callback_wrapper,
+ *                     <CallbackWrapper>context.callback_wrapper,
+ *                     event.success             # <<<<<<<<<<<<<<
+ *                 )
+ */
+      __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_event.success); if (unlikely(!__pyx_t_6)) __PYX_ERR(7, 173, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_7 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (likely(PyMethod_Check(__pyx_t_2))) {
+        __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
+        if (likely(__pyx_t_7)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_7);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_2, function);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_t_3, ((PyObject *)__pyx_v_context->callback_wrapper), __pyx_t_6};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 170, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __pyx_L7:;
+  }
+  __pyx_L5_break:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":143
+ *         self._write_socket.close()
+ * 
+ *     def _handle_events(self, object context_loop):             # <<<<<<<<<<<<<<
+ *         cdef bytes data
+ *         if _has_fd_monitoring:
+ */
+
+  /* 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_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue._handle_events", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_data);
+  __Pyx_XDECREF(__pyx_v_loop);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_9__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_9__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_9__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_9__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_8__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_8__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_11__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_11__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_11__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_11__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_10__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21PollerCompletionQueue_10__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.PollerCompletionQueue.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":18
+ * cdef class CallbackFailureHandler:
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *                   str core_function_name,
+ *                   object error_details,
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_core_function_name = 0;
+  PyObject *__pyx_v_error_details = 0;
+  PyObject *__pyx_v_exception_type = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_core_function_name,&__pyx_n_s_error_details,&__pyx_n_s_exception_type,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_core_function_name)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 18, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_error_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 18, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(32, 18, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_exception_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 18, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(32, 18, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(32, 18, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+    }
+    __pyx_v_core_function_name = ((PyObject*)values[0]);
+    __pyx_v_error_details = values[1];
+    __pyx_v_exception_type = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(32, 18, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackFailureHandler.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_core_function_name), (&PyString_Type), 1, "core_function_name", 1))) __PYX_ERR(32, 19, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler___cinit__(((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_v_self), __pyx_v_core_function_name, __pyx_v_error_details, __pyx_v_exception_type);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler___cinit__(struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_self, PyObject *__pyx_v_core_function_name, PyObject *__pyx_v_error_details, PyObject *__pyx_v_exception_type) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":23
+ *                   object exception_type):
+ *         """Handles failure by raising exception."""
+ *         self._core_function_name = core_function_name             # <<<<<<<<<<<<<<
+ *         self._error_details = error_details
+ *         self._exception_type = exception_type
+ */
+  __Pyx_INCREF(__pyx_v_core_function_name);
+  __Pyx_GIVEREF(__pyx_v_core_function_name);
+  __Pyx_GOTREF(__pyx_v_self->_core_function_name);
+  __Pyx_DECREF(__pyx_v_self->_core_function_name);
+  __pyx_v_self->_core_function_name = __pyx_v_core_function_name;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":24
+ *         """Handles failure by raising exception."""
+ *         self._core_function_name = core_function_name
+ *         self._error_details = error_details             # <<<<<<<<<<<<<<
+ *         self._exception_type = exception_type
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_error_details);
+  __Pyx_GIVEREF(__pyx_v_error_details);
+  __Pyx_GOTREF(__pyx_v_self->_error_details);
+  __Pyx_DECREF(__pyx_v_self->_error_details);
+  __pyx_v_self->_error_details = __pyx_v_error_details;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":25
+ *         self._core_function_name = core_function_name
+ *         self._error_details = error_details
+ *         self._exception_type = exception_type             # <<<<<<<<<<<<<<
+ * 
+ *     cdef handle(self, object future):
+ */
+  __Pyx_INCREF(__pyx_v_exception_type);
+  __Pyx_GIVEREF(__pyx_v_exception_type);
+  __Pyx_GOTREF(__pyx_v_self->_exception_type);
+  __Pyx_DECREF(__pyx_v_self->_exception_type);
+  __pyx_v_self->_exception_type = __pyx_v_exception_type;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":18
+ * cdef class CallbackFailureHandler:
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *                   str core_function_name,
+ *                   object error_details,
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":27
+ *         self._exception_type = exception_type
+ * 
+ *     cdef handle(self, object future):             # <<<<<<<<<<<<<<
+ *         future.set_exception(self._exception_type(
+ *             'Failed "%s": %s' % (self._core_function_name, self._error_details)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_22CallbackFailureHandler_handle(struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_self, PyObject *__pyx_v_future) {
+  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;
+  unsigned int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("handle", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":28
+ * 
+ *     cdef handle(self, object future):
+ *         future.set_exception(self._exception_type(             # <<<<<<<<<<<<<<
+ *             'Failed "%s": %s' % (self._core_function_name, self._error_details)
+ *         ))
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_future, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":29
+ *     cdef handle(self, object future):
+ *         future.set_exception(self._exception_type(
+ *             'Failed "%s": %s' % (self._core_function_name, self._error_details)             # <<<<<<<<<<<<<<
+ *         ))
+ * 
+ */
+  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(32, 29, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_INCREF(__pyx_v_self->_core_function_name);
+  __Pyx_GIVEREF(__pyx_v_self->_core_function_name);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->_core_function_name)) __PYX_ERR(32, 29, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_error_details);
+  __Pyx_GIVEREF(__pyx_v_self->_error_details);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_self->_error_details)) __PYX_ERR(32, 29, __pyx_L1_error);
+  __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_Failed_s_s, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(32, 29, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_INCREF(__pyx_v_self->_exception_type);
+  __pyx_t_4 = __pyx_v_self->_exception_type; __pyx_t_6 = NULL;
+  __pyx_t_7 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_5};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(32, 28, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __pyx_t_4 = NULL;
+  __pyx_t_7 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_7 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 28, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":27
+ *         self._exception_type = exception_type
+ * 
+ *     cdef handle(self, object future):             # <<<<<<<<<<<<<<
+ *         future.set_exception(self._exception_type(
+ *             'Failed "%s": %s' % (self._core_function_name, self._error_details)
+ */
+
+  /* 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_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackFailureHandler.handle", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_22CallbackFailureHandler_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackFailureHandler.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_22CallbackFailureHandler_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackFailureHandler.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_22CallbackFailureHandler_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackFailureHandler.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":35
+ * cdef class CallbackWrapper:
+ * 
+ *     def __cinit__(self, object future, object loop, CallbackFailureHandler failure_handler):             # <<<<<<<<<<<<<<
+ *         self.context.functor.functor_run = self.functor_run
+ *         self.context.waiter = <cpython.PyObject*>future
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_15CallbackWrapper_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_15CallbackWrapper_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_future = 0;
+  PyObject *__pyx_v_loop = 0;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_failure_handler = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_future,&__pyx_n_s_loop,&__pyx_n_s_failure_handler,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_future)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 35, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 35, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 1); __PYX_ERR(32, 35, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_failure_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 35, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, 2); __PYX_ERR(32, 35, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(32, 35, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+    }
+    __pyx_v_future = values[0];
+    __pyx_v_loop = values[1];
+    __pyx_v_failure_handler = ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)values[2]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 3, 3, __pyx_nargs); __PYX_ERR(32, 35, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackWrapper.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_failure_handler), __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler, 1, "failure_handler", 0))) __PYX_ERR(32, 35, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CallbackWrapper___cinit__(((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)__pyx_v_self), __pyx_v_future, __pyx_v_loop, __pyx_v_failure_handler);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_15CallbackWrapper___cinit__(struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_self, PyObject *__pyx_v_future, PyObject *__pyx_v_loop, struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *__pyx_v_failure_handler) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  void (*__pyx_t_1)(grpc_completion_queue_functor *, int);
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":36
+ * 
+ *     def __cinit__(self, object future, object loop, CallbackFailureHandler failure_handler):
+ *         self.context.functor.functor_run = self.functor_run             # <<<<<<<<<<<<<<
+ *         self.context.waiter = <cpython.PyObject*>future
+ *         self.context.loop = <cpython.PyObject*>loop
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper *)__pyx_v_self->__pyx_vtab)->functor_run;
+  __pyx_v_self->context.functor.functor_run = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":37
+ *     def __cinit__(self, object future, object loop, CallbackFailureHandler failure_handler):
+ *         self.context.functor.functor_run = self.functor_run
+ *         self.context.waiter = <cpython.PyObject*>future             # <<<<<<<<<<<<<<
+ *         self.context.loop = <cpython.PyObject*>loop
+ *         self.context.failure_handler = <cpython.PyObject*>failure_handler
+ */
+  __pyx_v_self->context.waiter = ((PyObject *)__pyx_v_future);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":38
+ *         self.context.functor.functor_run = self.functor_run
+ *         self.context.waiter = <cpython.PyObject*>future
+ *         self.context.loop = <cpython.PyObject*>loop             # <<<<<<<<<<<<<<
+ *         self.context.failure_handler = <cpython.PyObject*>failure_handler
+ *         self.context.callback_wrapper = <cpython.PyObject*>self
+ */
+  __pyx_v_self->context.loop = ((PyObject *)__pyx_v_loop);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":39
+ *         self.context.waiter = <cpython.PyObject*>future
+ *         self.context.loop = <cpython.PyObject*>loop
+ *         self.context.failure_handler = <cpython.PyObject*>failure_handler             # <<<<<<<<<<<<<<
+ *         self.context.callback_wrapper = <cpython.PyObject*>self
+ *         # NOTE(lidiz) Not using a list here, because this class is critical in
+ */
+  __pyx_v_self->context.failure_handler = ((PyObject *)__pyx_v_failure_handler);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":40
+ *         self.context.loop = <cpython.PyObject*>loop
+ *         self.context.failure_handler = <cpython.PyObject*>failure_handler
+ *         self.context.callback_wrapper = <cpython.PyObject*>self             # <<<<<<<<<<<<<<
+ *         # NOTE(lidiz) Not using a list here, because this class is critical in
+ *         # data path. We should make it as efficient as possible.
+ */
+  __pyx_v_self->context.callback_wrapper = ((PyObject *)__pyx_v_self);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":43
+ *         # NOTE(lidiz) Not using a list here, because this class is critical in
+ *         # data path. We should make it as efficient as possible.
+ *         self._reference_of_future = future             # <<<<<<<<<<<<<<
+ *         self._reference_of_failure_handler = failure_handler
+ *         # NOTE(lidiz) We need to ensure when Core invokes our callback, the
+ */
+  __Pyx_INCREF(__pyx_v_future);
+  __Pyx_GIVEREF(__pyx_v_future);
+  __Pyx_GOTREF(__pyx_v_self->_reference_of_future);
+  __Pyx_DECREF(__pyx_v_self->_reference_of_future);
+  __pyx_v_self->_reference_of_future = __pyx_v_future;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":44
+ *         # data path. We should make it as efficient as possible.
+ *         self._reference_of_future = future
+ *         self._reference_of_failure_handler = failure_handler             # <<<<<<<<<<<<<<
+ *         # NOTE(lidiz) We need to ensure when Core invokes our callback, the
+ *         # callback function itself is not deallocated. Othersise, we will get
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_failure_handler);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_failure_handler);
+  __Pyx_GOTREF(__pyx_v_self->_reference_of_failure_handler);
+  __Pyx_DECREF(__pyx_v_self->_reference_of_failure_handler);
+  __pyx_v_self->_reference_of_failure_handler = ((PyObject *)__pyx_v_failure_handler);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":48
+ *         # callback function itself is not deallocated. Othersise, we will get
+ *         # a segfault. We can view this as Core holding a ref.
+ *         cpython.Py_INCREF(self)             # <<<<<<<<<<<<<<
+ * 
+ *     @staticmethod
+ */
+  Py_INCREF(((PyObject *)__pyx_v_self));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":35
+ * cdef class CallbackWrapper:
+ * 
+ *     def __cinit__(self, object future, object loop, CallbackFailureHandler failure_handler):             # <<<<<<<<<<<<<<
+ *         self.context.functor.functor_run = self.functor_run
+ *         self.context.waiter = <cpython.PyObject*>future
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":51
+ * 
+ *     @staticmethod
+ *     cdef void functor_run(             # <<<<<<<<<<<<<<
+ *             grpc_completion_queue_functor* functor,
+ *             int success) noexcept:
+ */
+
+static void __pyx_f_7_cython_6cygrpc_15CallbackWrapper_functor_run(grpc_completion_queue_functor *__pyx_v_functor, int __pyx_v_success) {
+  struct __pyx_t_7_cython_6cygrpc_CallbackContext *__pyx_v_context;
+  PyObject *__pyx_v_waiter = 0;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("functor_run", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":54
+ *             grpc_completion_queue_functor* functor,
+ *             int success) noexcept:
+ *         cdef CallbackContext *context = <CallbackContext *>functor             # <<<<<<<<<<<<<<
+ *         cdef object waiter = <object>context.waiter
+ *         if not waiter.cancelled():
+ */
+  __pyx_v_context = ((struct __pyx_t_7_cython_6cygrpc_CallbackContext *)__pyx_v_functor);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":55
+ *             int success) noexcept:
+ *         cdef CallbackContext *context = <CallbackContext *>functor
+ *         cdef object waiter = <object>context.waiter             # <<<<<<<<<<<<<<
+ *         if not waiter.cancelled():
+ *             if success == 0:
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_context->waiter);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_v_waiter = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":56
+ *         cdef CallbackContext *context = <CallbackContext *>functor
+ *         cdef object waiter = <object>context.waiter
+ *         if not waiter.cancelled():             # <<<<<<<<<<<<<<
+ *             if success == 0:
+ *                 (<CallbackFailureHandler>context.failure_handler).handle(waiter)
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_waiter, __pyx_n_s_cancelled); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 56, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 56, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(32, 56, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_6 = (!__pyx_t_5);
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":57
+ *         cdef object waiter = <object>context.waiter
+ *         if not waiter.cancelled():
+ *             if success == 0:             # <<<<<<<<<<<<<<
+ *                 (<CallbackFailureHandler>context.failure_handler).handle(waiter)
+ *             else:
+ */
+    __pyx_t_6 = (__pyx_v_success == 0);
+    if (__pyx_t_6) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":58
+ *         if not waiter.cancelled():
+ *             if success == 0:
+ *                 (<CallbackFailureHandler>context.failure_handler).handle(waiter)             # <<<<<<<<<<<<<<
+ *             else:
+ *                 waiter.set_result(None)
+ */
+      __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackFailureHandler *)((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_v_context->failure_handler)->__pyx_vtab)->handle(((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_v_context->failure_handler), __pyx_v_waiter); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 58, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":57
+ *         cdef object waiter = <object>context.waiter
+ *         if not waiter.cancelled():
+ *             if success == 0:             # <<<<<<<<<<<<<<
+ *                 (<CallbackFailureHandler>context.failure_handler).handle(waiter)
+ *             else:
+ */
+      goto __pyx_L4;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":60
+ *                 (<CallbackFailureHandler>context.failure_handler).handle(waiter)
+ *             else:
+ *                 waiter.set_result(None)             # <<<<<<<<<<<<<<
+ *         cpython.Py_DECREF(<object>context.callback_wrapper)
+ * 
+ */
+    /*else*/ {
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_waiter, __pyx_n_s_set_result); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 60, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_3, Py_None};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 60, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __pyx_L4:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":56
+ *         cdef CallbackContext *context = <CallbackContext *>functor
+ *         cdef object waiter = <object>context.waiter
+ *         if not waiter.cancelled():             # <<<<<<<<<<<<<<
+ *             if success == 0:
+ *                 (<CallbackFailureHandler>context.failure_handler).handle(waiter)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":61
+ *             else:
+ *                 waiter.set_result(None)
+ *         cpython.Py_DECREF(<object>context.callback_wrapper)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef grpc_completion_queue_functor *c_functor(self):
+ */
+  __pyx_t_1 = ((PyObject *)__pyx_v_context->callback_wrapper);
+  __Pyx_INCREF(__pyx_t_1);
+  Py_DECREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":51
+ * 
+ *     @staticmethod
+ *     cdef void functor_run(             # <<<<<<<<<<<<<<
+ *             grpc_completion_queue_functor* functor,
+ *             int success) noexcept:
+ */
+
+  /* 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_WriteUnraisable("_cython.cygrpc.CallbackWrapper.functor_run", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_waiter);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":63
+ *         cpython.Py_DECREF(<object>context.callback_wrapper)
+ * 
+ *     cdef grpc_completion_queue_functor *c_functor(self):             # <<<<<<<<<<<<<<
+ *         return &self.context.functor
+ * 
+ */
+
+static grpc_completion_queue_functor *__pyx_f_7_cython_6cygrpc_15CallbackWrapper_c_functor(struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_self) {
+  grpc_completion_queue_functor *__pyx_r;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":64
+ * 
+ *     cdef grpc_completion_queue_functor *c_functor(self):
+ *         return &self.context.functor             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = (&__pyx_v_self->context.functor);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":63
+ *         cpython.Py_DECREF(<object>context.callback_wrapper)
+ * 
+ *     cdef grpc_completion_queue_functor *c_functor(self):             # <<<<<<<<<<<<<<
+ *         return &self.context.functor
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CallbackWrapper_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CallbackWrapper_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CallbackWrapper_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackWrapper.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_15CallbackWrapper_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackWrapper.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_15CallbackWrapper_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_15CallbackWrapper_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.CallbackWrapper.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_128generator2(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":77
+ * 
+ * 
+ * async def execute_batch(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                tuple operations,
+ *                                object loop):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_127execute_batch(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_126execute_batch, "The callback version of start batch operations.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_127execute_batch = {"execute_batch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_127execute_batch, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_126execute_batch};
+static PyObject *__pyx_pw_7_cython_6cygrpc_127execute_batch(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper = 0;
+  PyObject *__pyx_v_operations = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("execute_batch (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grpc_call_wrapper,&__pyx_n_s_operations,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_grpc_call_wrapper)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 77, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_operations)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 77, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("execute_batch", 1, 3, 3, 1); __PYX_ERR(32, 77, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 77, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("execute_batch", 1, 3, 3, 2); __PYX_ERR(32, 77, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "execute_batch") < 0)) __PYX_ERR(32, 77, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_grpc_call_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *)values[0]);
+    __pyx_v_operations = ((PyObject*)values[1]);
+    __pyx_v_loop = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("execute_batch", 1, 3, 3, __pyx_nargs); __PYX_ERR(32, 77, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.execute_batch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grpc_call_wrapper), __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper, 1, "grpc_call_wrapper", 0))) __PYX_ERR(32, 77, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_operations), (&PyTuple_Type), 1, "operations", 1))) __PYX_ERR(32, 78, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_126execute_batch(__pyx_self, __pyx_v_grpc_call_wrapper, __pyx_v_operations, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_126execute_batch(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_operations, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("execute_batch", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(32, 77, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_grpc_call_wrapper = __pyx_v_grpc_call_wrapper;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __pyx_cur_scope->__pyx_v_operations = __pyx_v_operations;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_operations);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_operations);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_128generator2, __pyx_codeobj__51, (PyObject *) __pyx_cur_scope, __pyx_n_s_execute_batch, __pyx_n_s_execute_batch, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(32, 77, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.execute_batch", __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_7_cython_6cygrpc_128generator2(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  grpc_completion_queue_functor *__pyx_t_5;
+  int __pyx_t_6;
+  char const *__pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("execute_batch", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 77, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":81
+ *                                object loop):
+ *     """The callback version of start batch operations."""
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(None, operations, None)             # <<<<<<<<<<<<<<
+ *     batch_operation_tag.prepare()
+ * 
+ */
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 81, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, Py_None)) __PYX_ERR(32, 81, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_operations);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_operations);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_v_operations)) __PYX_ERR(32, 81, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(32, 81, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__BatchOperationTag), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 81, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_batch_operation_tag = ((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":82
+ *     """The callback version of start batch operations."""
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(None, operations, None)
+ *     batch_operation_tag.prepare()             # <<<<<<<<<<<<<<
+ * 
+ *     cdef object future = loop.create_future()
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__BatchOperationTag *)__pyx_cur_scope->__pyx_v_batch_operation_tag->__pyx_base.__pyx_vtab)->prepare(__pyx_cur_scope->__pyx_v_batch_operation_tag); if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 82, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":84
+ *     batch_operation_tag.prepare()
+ * 
+ *     cdef object future = loop.create_future()             # <<<<<<<<<<<<<<
+ *     cdef CallbackWrapper wrapper = CallbackWrapper(
+ *         future,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_loop, __pyx_n_s_create_future); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 84, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 84, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_future = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":88
+ *         future,
+ *         loop,
+ *         CallbackFailureHandler('execute_batch', operations, ExecuteBatchError))             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_error error = grpc_call_start_batch(
+ *         grpc_call_wrapper.call,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ExecuteBatchError); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_n_s_execute_batch);
+  __Pyx_GIVEREF(__pyx_n_s_execute_batch);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_execute_batch)) __PYX_ERR(32, 88, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_operations);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_operations);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_v_operations)) __PYX_ERR(32, 88, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2)) __PYX_ERR(32, 88, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":85
+ * 
+ *     cdef object future = loop.create_future()
+ *     cdef CallbackWrapper wrapper = CallbackWrapper(             # <<<<<<<<<<<<<<
+ *         future,
+ *         loop,
+ */
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_future);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_future);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_v_future)) __PYX_ERR(32, 85, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_v_loop)) __PYX_ERR(32, 85, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2)) __PYX_ERR(32, 85, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackWrapper), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":93
+ *         batch_operation_tag.c_ops,
+ *         batch_operation_tag.c_nops,
+ *         wrapper.c_functor(), NULL)             # <<<<<<<<<<<<<<
+ * 
+ *     if error != GRPC_CALL_OK:
+ */
+  __pyx_t_5 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper *)__pyx_cur_scope->__pyx_v_wrapper->__pyx_vtab)->c_functor(__pyx_cur_scope->__pyx_v_wrapper); if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 93, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":89
+ *         loop,
+ *         CallbackFailureHandler('execute_batch', operations, ExecuteBatchError))
+ *     cdef grpc_call_error error = grpc_call_start_batch(             # <<<<<<<<<<<<<<
+ *         grpc_call_wrapper.call,
+ *         batch_operation_tag.c_ops,
+ */
+  __pyx_cur_scope->__pyx_v_error = grpc_call_start_batch(__pyx_cur_scope->__pyx_v_grpc_call_wrapper->call, __pyx_cur_scope->__pyx_v_batch_operation_tag->c_ops, __pyx_cur_scope->__pyx_v_batch_operation_tag->c_nops, __pyx_t_5, NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":95
+ *         wrapper.c_functor(), NULL)
+ * 
+ *     if error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *         grpc_call_error_string = grpc_call_error_to_string(error).decode()
+ *         raise ExecuteBatchError("Failed grpc_call_start_batch: {} with grpc_call_error value: '{}'".format(error, grpc_call_error_string))
+ */
+  __pyx_t_6 = (__pyx_cur_scope->__pyx_v_error != GRPC_CALL_OK);
+  if (unlikely(__pyx_t_6)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":96
+ * 
+ *     if error != GRPC_CALL_OK:
+ *         grpc_call_error_string = grpc_call_error_to_string(error).decode()             # <<<<<<<<<<<<<<
+ *         raise ExecuteBatchError("Failed grpc_call_start_batch: {} with grpc_call_error value: '{}'".format(error, grpc_call_error_string))
+ * 
+ */
+    __pyx_t_7 = grpc_call_error_to_string(__pyx_cur_scope->__pyx_v_error);
+    __pyx_t_8 = __Pyx_ssize_strlen(__pyx_t_7); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(32, 96, __pyx_L1_error)
+    __pyx_t_2 = __Pyx_decode_c_string(__pyx_t_7, 0, __pyx_t_8, NULL, NULL, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 96, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF(__pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_cur_scope->__pyx_v_grpc_call_error_string = __pyx_t_2;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":97
+ *     if error != GRPC_CALL_OK:
+ *         grpc_call_error_string = grpc_call_error_to_string(error).decode()
+ *         raise ExecuteBatchError("Failed grpc_call_start_batch: {} with grpc_call_error value: '{}'".format(error, grpc_call_error_string))             # <<<<<<<<<<<<<<
+ * 
+ *     await future
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_ExecuteBatchError); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 97, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Failed_grpc_call_start_batch_wit, __pyx_n_s_format); if (unlikely(!__pyx_t_9)) __PYX_ERR(32, 97, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_10 = __Pyx_PyInt_From_grpc_call_error(__pyx_cur_scope->__pyx_v_error); if (unlikely(!__pyx_t_10)) __PYX_ERR(32, 97, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_10);
+    __pyx_t_11 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_9))) {
+      __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_9);
+      if (likely(__pyx_t_11)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+        __Pyx_INCREF(__pyx_t_11);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_9, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_11, __pyx_t_10, __pyx_cur_scope->__pyx_v_grpc_call_error_string};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(32, 97, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    }
+    __pyx_t_9 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_1))) {
+      __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_9)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+        __Pyx_INCREF(__pyx_t_9);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_1, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_3};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 97, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(32, 97, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":95
+ *         wrapper.c_functor(), NULL)
+ * 
+ *     if error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *         grpc_call_error_string = grpc_call_error_to_string(error).decode()
+ *         raise ExecuteBatchError("Failed grpc_call_start_batch: {} with grpc_call_error value: '{}'".format(error, grpc_call_error_string))
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":99
+ *         raise ExecuteBatchError("Failed grpc_call_start_batch: {} with grpc_call_error value: '{}'".format(error, grpc_call_error_string))
+ * 
+ *     await future             # <<<<<<<<<<<<<<
+ * 
+ *     cdef grpc_event c_event
+ */
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_future);
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 99, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(32, 99, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":103
+ *     cdef grpc_event c_event
+ *     # Tag.event must be called, otherwise messages won't be parsed from C
+ *     batch_operation_tag.event(c_event)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_7_cython_6cygrpc__BatchOperationTag *)__pyx_cur_scope->__pyx_v_batch_operation_tag->__pyx_base.__pyx_vtab)->event(__pyx_cur_scope->__pyx_v_batch_operation_tag, __pyx_cur_scope->__pyx_v_c_event)); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":77
+ * 
+ * 
+ * async def execute_batch(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                tuple operations,
+ *                                object loop):
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("execute_batch", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":106
+ * 
+ * 
+ * cdef prepend_send_initial_metadata_op(tuple ops, tuple metadata):             # <<<<<<<<<<<<<<
+ *     # Eventually, this function should be the only function that produces
+ *     # SendInitialMetadataOperation. So we have more control over the flag.
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_prepend_send_initial_metadata_op(PyObject *__pyx_v_ops, PyObject *__pyx_v_metadata) {
+  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("prepend_send_initial_metadata_op", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":109
+ *     # Eventually, this function should be the only function that produces
+ *     # SendInitialMetadataOperation. So we have more control over the flag.
+ *     return (SendInitialMetadataOperation(             # <<<<<<<<<<<<<<
+ *         metadata,
+ *         _EMPTY_FLAG
+ */
+  __Pyx_XDECREF(__pyx_r);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":111
+ *     return (SendInitialMetadataOperation(
+ *         metadata,
+ *         _EMPTY_FLAG             # <<<<<<<<<<<<<<
+ *     ),) + ops
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_7_cython_6cygrpc__EMPTY_FLAG); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 111, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":109
+ *     # Eventually, this function should be the only function that produces
+ *     # SendInitialMetadataOperation. So we have more control over the flag.
+ *     return (SendInitialMetadataOperation(             # <<<<<<<<<<<<<<
+ *         metadata,
+ *         _EMPTY_FLAG
+ */
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 109, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_metadata);
+  __Pyx_GIVEREF(__pyx_v_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_metadata)) __PYX_ERR(32, 109, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(32, 109, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 109, __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_ERR(32, 109, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1)) __PYX_ERR(32, 109, __pyx_L1_error);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":112
+ *         metadata,
+ *         _EMPTY_FLAG
+ *     ),) + ops             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_v_ops); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 112, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":106
+ * 
+ * 
+ * cdef prepend_send_initial_metadata_op(tuple ops, tuple metadata):             # <<<<<<<<<<<<<<
+ *     # Eventually, this function should be the only function that produces
+ *     # SendInitialMetadataOperation. So we have more control over the flag.
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.prepend_send_initial_metadata_op", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_131generator3(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":115
+ * 
+ * 
+ * async def _receive_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                            object loop):
+ *     """Retrives parsed messages from Core.
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_130_receive_message(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_129_receive_message, "Retrives parsed messages from Core.\n\n    The messages maybe already in Core's buffer, so there isn't a 1-to-1\n    mapping between this and the underlying \"socket.read()\". Also, eventually,\n    this function will end with an EOF, which reads empty message.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_130_receive_message = {"_receive_message", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_130_receive_message, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_129_receive_message};
+static PyObject *__pyx_pw_7_cython_6cygrpc_130_receive_message(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_receive_message (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grpc_call_wrapper,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_grpc_call_wrapper)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 115, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 115, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_receive_message", 1, 2, 2, 1); __PYX_ERR(32, 115, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_receive_message") < 0)) __PYX_ERR(32, 115, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_grpc_call_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *)values[0]);
+    __pyx_v_loop = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_receive_message", 1, 2, 2, __pyx_nargs); __PYX_ERR(32, 115, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._receive_message", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grpc_call_wrapper), __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper, 1, "grpc_call_wrapper", 0))) __PYX_ERR(32, 115, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_129_receive_message(__pyx_self, __pyx_v_grpc_call_wrapper, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_129_receive_message(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_receive_message", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_13__receive_message(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(32, 115, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_grpc_call_wrapper = __pyx_v_grpc_call_wrapper;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_131generator3, __pyx_codeobj__52, (PyObject *) __pyx_cur_scope, __pyx_n_s_receive_message, __pyx_n_s_receive_message, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(32, 115, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._receive_message", __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_7_cython_6cygrpc_131generator3(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  unsigned int __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  char const *__pyx_t_13;
+  PyObject *__pyx_t_14 = NULL;
+  PyObject *__pyx_t_15 = NULL;
+  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_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_receive_message", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L10_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 115, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":123
+ *     this function will end with an EOF, which reads empty message.
+ *     """
+ *     cdef ReceiveMessageOperation receive_op = ReceiveMessageOperation(_EMPTY_FLAG)             # <<<<<<<<<<<<<<
+ *     cdef tuple ops = (receive_op,)
+ *     try:
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_7_cython_6cygrpc__EMPTY_FLAG); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_receive_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":124
+ *     """
+ *     cdef ReceiveMessageOperation receive_op = ReceiveMessageOperation(_EMPTY_FLAG)
+ *     cdef tuple ops = (receive_op,)             # <<<<<<<<<<<<<<
+ *     try:
+ *         await execute_batch(grpc_call_wrapper, ops, loop)
+ */
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 124, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_receive_op))) __PYX_ERR(32, 124, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":125
+ *     cdef ReceiveMessageOperation receive_op = ReceiveMessageOperation(_EMPTY_FLAG)
+ *     cdef tuple ops = (receive_op,)
+ *     try:             # <<<<<<<<<<<<<<
+ *         await execute_batch(grpc_call_wrapper, ops, loop)
+ *     except ExecuteBatchError as e:
+ */
+  {
+    __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5);
+    __Pyx_XGOTREF(__pyx_t_3);
+    __Pyx_XGOTREF(__pyx_t_4);
+    __Pyx_XGOTREF(__pyx_t_5);
+    /*try:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":126
+ *     cdef tuple ops = (receive_op,)
+ *     try:
+ *         await execute_batch(grpc_call_wrapper, ops, loop)             # <<<<<<<<<<<<<<
+ *     except ExecuteBatchError as e:
+ *         # NOTE(lidiz) The receive message operation has two ways to indicate
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 126, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_6 = NULL;
+      __pyx_t_7 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[4] = {__pyx_t_6, ((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_loop};
+        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_7, 3+__pyx_t_7);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 126, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_3);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_3;
+        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_4;
+        __Pyx_XGIVEREF(__pyx_t_5);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 1;
+        return __pyx_r;
+        __pyx_L10_resume_from_await:;
+        __pyx_t_3 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_3);
+        __pyx_t_4 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_4);
+        __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_5);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 126, __pyx_L4_error)
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+          else __PYX_ERR(32, 126, __pyx_L4_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":125
+ *     cdef ReceiveMessageOperation receive_op = ReceiveMessageOperation(_EMPTY_FLAG)
+ *     cdef tuple ops = (receive_op,)
+ *     try:             # <<<<<<<<<<<<<<
+ *         await execute_batch(grpc_call_wrapper, ops, loop)
+ *     except ExecuteBatchError as e:
+ */
+    }
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    goto __pyx_L9_try_end;
+    __pyx_L4_error:;
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":127
+ *     try:
+ *         await execute_batch(grpc_call_wrapper, ops, loop)
+ *     except ExecuteBatchError as e:             # <<<<<<<<<<<<<<
+ *         # NOTE(lidiz) The receive message operation has two ways to indicate
+ *         # finish state : 1) returns empty message due to EOF; 2) fails inside
+ */
+    __Pyx_ErrFetch(&__pyx_t_2, &__pyx_t_1, &__pyx_t_6);
+    __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_ExecuteBatchError); if (unlikely(!__pyx_t_8)) __PYX_ERR(32, 127, __pyx_L6_except_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_9 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_2, __pyx_t_8);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_6);
+    __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_6 = 0;
+    if (__pyx_t_9) {
+      __Pyx_AddTraceback("_cython.cygrpc._receive_message", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_2) < 0) __PYX_ERR(32, 127, __pyx_L6_except_error)
+      __Pyx_XGOTREF(__pyx_t_6);
+      __Pyx_XGOTREF(__pyx_t_1);
+      __Pyx_XGOTREF(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_cur_scope->__pyx_v_e = __pyx_t_1;
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":133
+ *         #
+ *         # Since they all indicates finish, they are better be merged.
+ *         _LOGGER.debug('Failed to receive any message from Core')             # <<<<<<<<<<<<<<
+ *     # NOTE(lidiz) The returned message might be an empty bytes (aka. b'').
+ *     # Please explicitly check if it is None or falsey string object!
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_10)) __PYX_ERR(32, 133, __pyx_L16_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_debug); if (unlikely(!__pyx_t_11)) __PYX_ERR(32, 133, __pyx_L16_error)
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __pyx_t_10 = NULL;
+        __pyx_t_7 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_11))) {
+          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11);
+          if (likely(__pyx_t_10)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
+            __Pyx_INCREF(__pyx_t_10);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_11, function);
+            __pyx_t_7 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_10, __pyx_kp_s_Failed_to_receive_any_message_fr};
+          __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(32, 133, __pyx_L16_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":127
+ *     try:
+ *         await execute_batch(grpc_call_wrapper, ops, loop)
+ *     except ExecuteBatchError as e:             # <<<<<<<<<<<<<<
+ *         # NOTE(lidiz) The receive message operation has two ways to indicate
+ *         # finish state : 1) returns empty message due to EOF; 2) fails inside
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_e);
+          __Pyx_DECREF(__pyx_cur_scope->__pyx_v_e); __pyx_cur_scope->__pyx_v_e = 0;
+          goto __pyx_L17;
+        }
+        __pyx_L16_error:;
+        /*exception exit:*/{
+          __Pyx_PyThreadState_assign
+          __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19);
+          if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16) < 0)) __Pyx_ErrFetch(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16);
+          __Pyx_XGOTREF(__pyx_t_14);
+          __Pyx_XGOTREF(__pyx_t_15);
+          __Pyx_XGOTREF(__pyx_t_16);
+          __Pyx_XGOTREF(__pyx_t_17);
+          __Pyx_XGOTREF(__pyx_t_18);
+          __Pyx_XGOTREF(__pyx_t_19);
+          __pyx_t_9 = __pyx_lineno; __pyx_t_12 = __pyx_clineno; __pyx_t_13 = __pyx_filename;
+          {
+            __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_e);
+            __Pyx_DECREF(__pyx_cur_scope->__pyx_v_e); __pyx_cur_scope->__pyx_v_e = 0;
+          }
+          if (PY_MAJOR_VERSION >= 3) {
+            __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_XGIVEREF(__pyx_t_14);
+          __Pyx_XGIVEREF(__pyx_t_15);
+          __Pyx_XGIVEREF(__pyx_t_16);
+          __Pyx_ErrRestore(__pyx_t_14, __pyx_t_15, __pyx_t_16);
+          __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+          __pyx_lineno = __pyx_t_9; __pyx_clineno = __pyx_t_12; __pyx_filename = __pyx_t_13;
+          goto __pyx_L6_except_error;
+        }
+        __pyx_L17:;
+      }
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      goto __pyx_L5_exception_handled;
+    }
+    goto __pyx_L6_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":125
+ *     cdef ReceiveMessageOperation receive_op = ReceiveMessageOperation(_EMPTY_FLAG)
+ *     cdef tuple ops = (receive_op,)
+ *     try:             # <<<<<<<<<<<<<<
+ *         await execute_batch(grpc_call_wrapper, ops, loop)
+ *     except ExecuteBatchError as e:
+ */
+    __pyx_L6_except_error:;
+    __Pyx_XGIVEREF(__pyx_t_3);
+    __Pyx_XGIVEREF(__pyx_t_4);
+    __Pyx_XGIVEREF(__pyx_t_5);
+    __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
+    goto __pyx_L1_error;
+    __pyx_L5_exception_handled:;
+    __Pyx_XGIVEREF(__pyx_t_3);
+    __Pyx_XGIVEREF(__pyx_t_4);
+    __Pyx_XGIVEREF(__pyx_t_5);
+    __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
+    __pyx_L9_try_end:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":136
+ *     # NOTE(lidiz) The returned message might be an empty bytes (aka. b'').
+ *     # Please explicitly check if it is None or falsey string object!
+ *     return receive_op.message()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_op), __pyx_n_s_message); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 136, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_6 = NULL;
+  __pyx_t_7 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 136, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  goto __pyx_L0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":115
+ * 
+ * 
+ * async def _receive_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                            object loop):
+ *     """Retrives parsed messages from Core.
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("_receive_message", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_134generator4(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":139
+ * 
+ * 
+ * async def _send_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                         bytes message,
+ *                         Operation send_initial_metadata_op,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_133_send_message(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_133_send_message = {"_send_message", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_133_send_message, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_133_send_message(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper = 0;
+  PyObject *__pyx_v_message = 0;
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_initial_metadata_op = 0;
+  int __pyx_v_write_flag;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[5] = {0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_send_message (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grpc_call_wrapper,&__pyx_n_s_message,&__pyx_n_s_send_initial_metadata_op,&__pyx_n_s_write_flag,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_grpc_call_wrapper)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 139, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_message)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 139, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_message", 1, 5, 5, 1); __PYX_ERR(32, 139, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_send_initial_metadata_op)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 139, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_message", 1, 5, 5, 2); __PYX_ERR(32, 139, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_write_flag)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 139, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_message", 1, 5, 5, 3); __PYX_ERR(32, 139, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 139, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_message", 1, 5, 5, 4); __PYX_ERR(32, 139, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_send_message") < 0)) __PYX_ERR(32, 139, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 5)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+      values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+    }
+    __pyx_v_grpc_call_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *)values[0]);
+    __pyx_v_message = ((PyObject*)values[1]);
+    __pyx_v_send_initial_metadata_op = ((struct __pyx_obj_7_cython_6cygrpc_Operation *)values[2]);
+    __pyx_v_write_flag = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_write_flag == (int)-1) && PyErr_Occurred())) __PYX_ERR(32, 142, __pyx_L3_error)
+    __pyx_v_loop = values[4];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_send_message", 1, 5, 5, __pyx_nargs); __PYX_ERR(32, 139, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._send_message", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grpc_call_wrapper), __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper, 1, "grpc_call_wrapper", 0))) __PYX_ERR(32, 139, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_message), (&PyBytes_Type), 1, "message", 1))) __PYX_ERR(32, 140, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_send_initial_metadata_op), __pyx_ptype_7_cython_6cygrpc_Operation, 1, "send_initial_metadata_op", 0))) __PYX_ERR(32, 141, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_132_send_message(__pyx_self, __pyx_v_grpc_call_wrapper, __pyx_v_message, __pyx_v_send_initial_metadata_op, __pyx_v_write_flag, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_132_send_message(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_message, struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_initial_metadata_op, int __pyx_v_write_flag, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_send_message", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_14__send_message(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(32, 139, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_grpc_call_wrapper = __pyx_v_grpc_call_wrapper;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __pyx_cur_scope->__pyx_v_message = __pyx_v_message;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_message);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_message);
+  __pyx_cur_scope->__pyx_v_send_initial_metadata_op = __pyx_v_send_initial_metadata_op;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op);
+  __pyx_cur_scope->__pyx_v_write_flag = __pyx_v_write_flag;
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_134generator4, __pyx_codeobj__53, (PyObject *) __pyx_cur_scope, __pyx_n_s_send_message, __pyx_n_s_send_message, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(32, 139, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._send_message", __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_7_cython_6cygrpc_134generator4(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_send_message", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 139, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":144
+ *                         int write_flag,
+ *                         object loop):
+ *     cdef SendMessageOperation op = SendMessageOperation(message, write_flag)             # <<<<<<<<<<<<<<
+ *     cdef tuple ops = (op,)
+ *     if send_initial_metadata_op is not None:
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_write_flag); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 144, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 144, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_message);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_message);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_message)) __PYX_ERR(32, 144, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(32, 144, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendMessageOperation), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 144, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":145
+ *                         object loop):
+ *     cdef SendMessageOperation op = SendMessageOperation(message, write_flag)
+ *     cdef tuple ops = (op,)             # <<<<<<<<<<<<<<
+ *     if send_initial_metadata_op is not None:
+ *         ops = (send_initial_metadata_op,) + ops
+ */
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 145, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_op))) __PYX_ERR(32, 145, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":146
+ *     cdef SendMessageOperation op = SendMessageOperation(message, write_flag)
+ *     cdef tuple ops = (op,)
+ *     if send_initial_metadata_op is not None:             # <<<<<<<<<<<<<<
+ *         ops = (send_initial_metadata_op,) + ops
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ */
+  __pyx_t_3 = (((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op) != Py_None);
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":147
+ *     cdef tuple ops = (op,)
+ *     if send_initial_metadata_op is not None:
+ *         ops = (send_initial_metadata_op,) + ops             # <<<<<<<<<<<<<<
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ * 
+ */
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 147, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op);
+    __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op))) __PYX_ERR(32, 147, __pyx_L1_error);
+    __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_cur_scope->__pyx_v_ops); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 147, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_ops);
+    __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_ops, ((PyObject*)__pyx_t_2));
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":146
+ *     cdef SendMessageOperation op = SendMessageOperation(message, write_flag)
+ *     cdef tuple ops = (op,)
+ *     if send_initial_metadata_op is not None:             # <<<<<<<<<<<<<<
+ *         ops = (send_initial_metadata_op,) + ops
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":148
+ *     if send_initial_metadata_op is not None:
+ *         ops = (send_initial_metadata_op,) + ops
+ *     await execute_batch(grpc_call_wrapper, ops, loop)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 148, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_4, ((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 148, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 148, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(32, 148, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":139
+ * 
+ * 
+ * async def _send_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                         bytes message,
+ *                         Operation send_initial_metadata_op,
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_send_message", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_137generator5(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":151
+ * 
+ * 
+ * async def _send_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                  tuple metadata,
+ *                                  int flags,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_136_send_initial_metadata(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_136_send_initial_metadata = {"_send_initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_136_send_initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_136_send_initial_metadata(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper = 0;
+  PyObject *__pyx_v_metadata = 0;
+  int __pyx_v_flags;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[4] = {0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_send_initial_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grpc_call_wrapper,&__pyx_n_s_metadata,&__pyx_n_s_flags,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_grpc_call_wrapper)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 151, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 151, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_initial_metadata", 1, 4, 4, 1); __PYX_ERR(32, 151, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_flags)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 151, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_initial_metadata", 1, 4, 4, 2); __PYX_ERR(32, 151, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 151, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_initial_metadata", 1, 4, 4, 3); __PYX_ERR(32, 151, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_send_initial_metadata") < 0)) __PYX_ERR(32, 151, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 4)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+    }
+    __pyx_v_grpc_call_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *)values[0]);
+    __pyx_v_metadata = ((PyObject*)values[1]);
+    __pyx_v_flags = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(32, 153, __pyx_L3_error)
+    __pyx_v_loop = values[3];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_send_initial_metadata", 1, 4, 4, __pyx_nargs); __PYX_ERR(32, 151, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._send_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grpc_call_wrapper), __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper, 1, "grpc_call_wrapper", 0))) __PYX_ERR(32, 151, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_metadata), (&PyTuple_Type), 1, "metadata", 1))) __PYX_ERR(32, 152, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_135_send_initial_metadata(__pyx_self, __pyx_v_grpc_call_wrapper, __pyx_v_metadata, __pyx_v_flags, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_135_send_initial_metadata(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_metadata, int __pyx_v_flags, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_send_initial_metadata", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(32, 151, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_grpc_call_wrapper = __pyx_v_grpc_call_wrapper;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __pyx_cur_scope->__pyx_v_metadata = __pyx_v_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_metadata);
+  __pyx_cur_scope->__pyx_v_flags = __pyx_v_flags;
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_137generator5, __pyx_codeobj__54, (PyObject *) __pyx_cur_scope, __pyx_n_s_send_initial_metadata, __pyx_n_s_send_initial_metadata, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(32, 151, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._send_initial_metadata", __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_7_cython_6cygrpc_137generator5(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  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_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_send_initial_metadata", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 151, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":157
+ *     cdef SendInitialMetadataOperation op = SendInitialMetadataOperation(
+ *         metadata,
+ *         flags)             # <<<<<<<<<<<<<<
+ *     cdef tuple ops = (op,)
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 157, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":155
+ *                                  int flags,
+ *                                  object loop):
+ *     cdef SendInitialMetadataOperation op = SendInitialMetadataOperation(             # <<<<<<<<<<<<<<
+ *         metadata,
+ *         flags)
+ */
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 155, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_metadata)) __PYX_ERR(32, 155, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(32, 155, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 155, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":158
+ *         metadata,
+ *         flags)
+ *     cdef tuple ops = (op,)             # <<<<<<<<<<<<<<
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ * 
+ */
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 158, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_op))) __PYX_ERR(32, 158, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":159
+ *         flags)
+ *     cdef tuple ops = (op,)
+ *     await execute_batch(grpc_call_wrapper, ops, loop)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 159, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 159, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 159, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(32, 159, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":151
+ * 
+ * 
+ * async def _send_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                  tuple metadata,
+ *                                  int flags,
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_send_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_140generator6(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":162
+ * 
+ * 
+ * async def _receive_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                     object loop):
+ *     cdef ReceiveInitialMetadataOperation op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_139_receive_initial_metadata(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_139_receive_initial_metadata = {"_receive_initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_139_receive_initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_139_receive_initial_metadata(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_receive_initial_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grpc_call_wrapper,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_grpc_call_wrapper)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 162, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 162, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_receive_initial_metadata", 1, 2, 2, 1); __PYX_ERR(32, 162, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_receive_initial_metadata") < 0)) __PYX_ERR(32, 162, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_grpc_call_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *)values[0]);
+    __pyx_v_loop = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_receive_initial_metadata", 1, 2, 2, __pyx_nargs); __PYX_ERR(32, 162, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._receive_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grpc_call_wrapper), __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper, 1, "grpc_call_wrapper", 0))) __PYX_ERR(32, 162, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_138_receive_initial_metadata(__pyx_self, __pyx_v_grpc_call_wrapper, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_138_receive_initial_metadata(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_receive_initial_metadata", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(32, 162, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_grpc_call_wrapper = __pyx_v_grpc_call_wrapper;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_140generator6, __pyx_codeobj__55, (PyObject *) __pyx_cur_scope, __pyx_n_s_receive_initial_metadata, __pyx_n_s_receive_initial_metadata, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(32, 162, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._receive_initial_metadata", __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_7_cython_6cygrpc_140generator6(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  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_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_receive_initial_metadata", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 162, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":164
+ * async def _receive_initial_metadata(GrpcCallWrapper grpc_call_wrapper,
+ *                                     object loop):
+ *     cdef ReceiveInitialMetadataOperation op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *     cdef tuple ops = (op,)
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 164, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 164, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":165
+ *                                     object loop):
+ *     cdef ReceiveInitialMetadataOperation op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ *     cdef tuple ops = (op,)             # <<<<<<<<<<<<<<
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ *     return op.initial_metadata()
+ */
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 165, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_op))) __PYX_ERR(32, 165, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":166
+ *     cdef ReceiveInitialMetadataOperation op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ *     cdef tuple ops = (op,)
+ *     await execute_batch(grpc_call_wrapper, ops, loop)             # <<<<<<<<<<<<<<
+ *     return op.initial_metadata()
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 166, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 166, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 166, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(32, 166, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":167
+ *     cdef tuple ops = (op,)
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ *     return op.initial_metadata()             # <<<<<<<<<<<<<<
+ * 
+ * async def _send_error_status_from_server(GrpcCallWrapper grpc_call_wrapper,
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_op), __pyx_n_s_initial_metadata); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 167, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  goto __pyx_L0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":162
+ * 
+ * 
+ * async def _receive_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                     object loop):
+ *     cdef ReceiveInitialMetadataOperation op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_receive_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_143generator7(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":169
+ *     return op.initial_metadata()
+ * 
+ * async def _send_error_status_from_server(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                          grpc_status_code code,
+ *                                          str details,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_142_send_error_status_from_server(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_142_send_error_status_from_server = {"_send_error_status_from_server", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_142_send_error_status_from_server, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_142_send_error_status_from_server(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper = 0;
+  grpc_status_code __pyx_v_code;
+  PyObject *__pyx_v_details = 0;
+  PyObject *__pyx_v_trailing_metadata = 0;
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_initial_metadata_op = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[6] = {0,0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_send_error_status_from_server (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grpc_call_wrapper,&__pyx_n_s_code,&__pyx_n_s_details,&__pyx_n_s_trailing_metadata,&__pyx_n_s_send_initial_metadata_op,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
+        CYTHON_FALLTHROUGH;
+        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_grpc_call_wrapper)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 169, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 169, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_error_status_from_server", 1, 6, 6, 1); __PYX_ERR(32, 169, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 169, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_error_status_from_server", 1, 6, 6, 2); __PYX_ERR(32, 169, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_trailing_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 169, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_error_status_from_server", 1, 6, 6, 3); __PYX_ERR(32, 169, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_send_initial_metadata_op)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 169, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_error_status_from_server", 1, 6, 6, 4); __PYX_ERR(32, 169, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  5:
+        if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[5]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 169, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_send_error_status_from_server", 1, 6, 6, 5); __PYX_ERR(32, 169, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_send_error_status_from_server") < 0)) __PYX_ERR(32, 169, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 6)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+      values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+      values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
+    }
+    __pyx_v_grpc_call_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *)values[0]);
+    __pyx_v_code = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(values[1])); if (unlikely(PyErr_Occurred())) __PYX_ERR(32, 170, __pyx_L3_error)
+    __pyx_v_details = ((PyObject*)values[2]);
+    __pyx_v_trailing_metadata = ((PyObject*)values[3]);
+    __pyx_v_send_initial_metadata_op = ((struct __pyx_obj_7_cython_6cygrpc_Operation *)values[4]);
+    __pyx_v_loop = values[5];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_send_error_status_from_server", 1, 6, 6, __pyx_nargs); __PYX_ERR(32, 169, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._send_error_status_from_server", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grpc_call_wrapper), __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper, 1, "grpc_call_wrapper", 0))) __PYX_ERR(32, 169, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_details), (&PyString_Type), 1, "details", 1))) __PYX_ERR(32, 171, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_trailing_metadata), (&PyTuple_Type), 1, "trailing_metadata", 1))) __PYX_ERR(32, 172, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_send_initial_metadata_op), __pyx_ptype_7_cython_6cygrpc_Operation, 1, "send_initial_metadata_op", 0))) __PYX_ERR(32, 173, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_141_send_error_status_from_server(__pyx_self, __pyx_v_grpc_call_wrapper, __pyx_v_code, __pyx_v_details, __pyx_v_trailing_metadata, __pyx_v_send_initial_metadata_op, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_141_send_error_status_from_server(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper *__pyx_v_grpc_call_wrapper, grpc_status_code __pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_trailing_metadata, struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_v_send_initial_metadata_op, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_send_error_status_from_server", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(32, 169, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_grpc_call_wrapper = __pyx_v_grpc_call_wrapper;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper);
+  __pyx_cur_scope->__pyx_v_code = __pyx_v_code;
+  __pyx_cur_scope->__pyx_v_details = __pyx_v_details;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_details);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_details);
+  __pyx_cur_scope->__pyx_v_trailing_metadata = __pyx_v_trailing_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+  __pyx_cur_scope->__pyx_v_send_initial_metadata_op = __pyx_v_send_initial_metadata_op;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_143generator7, __pyx_codeobj__56, (PyObject *) __pyx_cur_scope, __pyx_n_s_send_error_status_from_server, __pyx_n_s_send_error_status_from_server, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(32, 169, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._send_error_status_from_server", __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_7_cython_6cygrpc_143generator7(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_send_error_status_from_server", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 169, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":175
+ *                                          Operation send_initial_metadata_op,
+ *                                          object loop):
+ *     assert code != StatusCode.ok, 'Expecting non-ok status code.'             # <<<<<<<<<<<<<<
+ *     cdef SendStatusFromServerOperation op = SendStatusFromServerOperation(
+ *         trailing_metadata,
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(__pyx_assertions_enabled())) {
+    __pyx_t_1 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 175, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 175, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ok); if (unlikely(!__pyx_t_3)) __PYX_ERR(32, 175, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 175, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_4 < 0))) __PYX_ERR(32, 175, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_4)) {
+      __Pyx_Raise(__pyx_builtin_AssertionError, __pyx_kp_s_Expecting_non_ok_status_code, 0, 0);
+      __PYX_ERR(32, 175, __pyx_L1_error)
+    }
+  }
+  #else
+  if ((1)); else __PYX_ERR(32, 175, __pyx_L1_error)
+  #endif
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":178
+ *     cdef SendStatusFromServerOperation op = SendStatusFromServerOperation(
+ *         trailing_metadata,
+ *         code,             # <<<<<<<<<<<<<<
+ *         details,
+ *         _EMPTY_FLAGS,
+ */
+  __pyx_t_2 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 178, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":180
+ *         code,
+ *         details,
+ *         _EMPTY_FLAGS,             # <<<<<<<<<<<<<<
+ *     )
+ *     cdef tuple ops = (op,)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_3)) __PYX_ERR(32, 180, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":176
+ *                                          object loop):
+ *     assert code != StatusCode.ok, 'Expecting non-ok status code.'
+ *     cdef SendStatusFromServerOperation op = SendStatusFromServerOperation(             # <<<<<<<<<<<<<<
+ *         trailing_metadata,
+ *         code,
+ */
+  __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 176, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_v_trailing_metadata)) __PYX_ERR(32, 176, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2)) __PYX_ERR(32, 176, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_details);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_details);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_cur_scope->__pyx_v_details)) __PYX_ERR(32, 176, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_3);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_3)) __PYX_ERR(32, 176, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation), __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(32, 176, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_cur_scope->__pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":182
+ *         _EMPTY_FLAGS,
+ *     )
+ *     cdef tuple ops = (op,)             # <<<<<<<<<<<<<<
+ *     if send_initial_metadata_op is not None:
+ *         ops = (send_initial_metadata_op,) + ops
+ */
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(32, 182, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_op))) __PYX_ERR(32, 182, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_3);
+  __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":183
+ *     )
+ *     cdef tuple ops = (op,)
+ *     if send_initial_metadata_op is not None:             # <<<<<<<<<<<<<<
+ *         ops = (send_initial_metadata_op,) + ops
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ */
+  __pyx_t_4 = (((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op) != Py_None);
+  if (__pyx_t_4) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":184
+ *     cdef tuple ops = (op,)
+ *     if send_initial_metadata_op is not None:
+ *         ops = (send_initial_metadata_op,) + ops             # <<<<<<<<<<<<<<
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ */
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(32, 184, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op);
+    __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_send_initial_metadata_op))) __PYX_ERR(32, 184, __pyx_L1_error);
+    __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_ops); if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 184, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_ops);
+    __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_ops, ((PyObject*)__pyx_t_1));
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":183
+ *     )
+ *     cdef tuple ops = (op,)
+ *     if send_initial_metadata_op is not None:             # <<<<<<<<<<<<<<
+ *         ops = (send_initial_metadata_op,) + ops
+ *     await execute_batch(grpc_call_wrapper, ops, loop)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":185
+ *     if send_initial_metadata_op is not None:
+ *         ops = (send_initial_metadata_op,) + ops
+ *     await execute_batch(grpc_call_wrapper, ops, loop)             # <<<<<<<<<<<<<<
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_3)) __PYX_ERR(32, 185, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_2, ((PyObject *)__pyx_cur_scope->__pyx_v_grpc_call_wrapper), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(32, 185, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(32, 185, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(32, 185, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":169
+ *     return op.initial_metadata()
+ * 
+ * async def _send_error_status_from_server(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                          grpc_status_code code,
+ *                                          str details,
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_send_error_status_from_server", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":28
+ * 
+ * 
+ * cdef _default_asyncio_engine():             # <<<<<<<<<<<<<<
+ *     return AsyncIOEngine.POLLER
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__default_asyncio_engine(void) {
+  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("_default_asyncio_engine", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":29
+ * 
+ * cdef _default_asyncio_engine():
+ *     return AsyncIOEngine.POLLER             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_AsyncIOEngine); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 29, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_POLLER); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 29, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":28
+ * 
+ * 
+ * cdef _default_asyncio_engine():             # <<<<<<<<<<<<<<
+ *     return AsyncIOEngine.POLLER
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._default_asyncio_engine", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":32
+ * 
+ * 
+ * cdef grpc_completion_queue *global_completion_queue():             # <<<<<<<<<<<<<<
+ *     return _global_aio_state.cq.c_ptr()
+ * 
+ */
+
+static grpc_completion_queue *__pyx_f_7_cython_6cygrpc_global_completion_queue(void) {
+  grpc_completion_queue *__pyx_r;
+  grpc_completion_queue *__pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":33
+ * 
+ * cdef grpc_completion_queue *global_completion_queue():
+ *     return _global_aio_state.cq.c_ptr()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_BaseCompletionQueue *)__pyx_v_7_cython_6cygrpc__global_aio_state->cq->__pyx_vtab)->c_ptr(__pyx_v_7_cython_6cygrpc__global_aio_state->cq); if (unlikely(PyErr_Occurred())) __PYX_ERR(33, 33, __pyx_L1_error)
+  __pyx_r = __pyx_t_1;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":32
+ * 
+ * 
+ * cdef grpc_completion_queue *global_completion_queue():             # <<<<<<<<<<<<<<
+ *     return _global_aio_state.cq.c_ptr()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.global_completion_queue", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":38
+ * cdef class _AioState:
+ * 
+ *     def __cinit__(self):             # <<<<<<<<<<<<<<
+ *         self.lock = threading.RLock()
+ *         self.refcount = 0
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_9_AioState_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_9_AioState_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9_AioState___cinit__(((struct __pyx_obj_7_cython_6cygrpc__AioState *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_9_AioState___cinit__(struct __pyx_obj_7_cython_6cygrpc__AioState *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":39
+ * 
+ *     def __cinit__(self):
+ *         self.lock = threading.RLock()             # <<<<<<<<<<<<<<
+ *         self.refcount = 0
+ *         self.engine = None
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_threading); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_RLock); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 39, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->lock);
+  __Pyx_DECREF(__pyx_v_self->lock);
+  __pyx_v_self->lock = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":40
+ *     def __cinit__(self):
+ *         self.lock = threading.RLock()
+ *         self.refcount = 0             # <<<<<<<<<<<<<<
+ *         self.engine = None
+ *         self.cq = None
+ */
+  __pyx_v_self->refcount = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":41
+ *         self.lock = threading.RLock()
+ *         self.refcount = 0
+ *         self.engine = None             # <<<<<<<<<<<<<<
+ *         self.cq = None
+ * 
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->engine);
+  __Pyx_DECREF(__pyx_v_self->engine);
+  __pyx_v_self->engine = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":42
+ *         self.refcount = 0
+ *         self.engine = None
+ *         self.cq = None             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->cq);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->cq);
+  __pyx_v_self->cq = ((struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *)Py_None);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":38
+ * cdef class _AioState:
+ * 
+ *     def __cinit__(self):             # <<<<<<<<<<<<<<
+ *         self.lock = threading.RLock()
+ *         self.refcount = 0
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._AioState.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9_AioState_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9_AioState_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9_AioState_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9_AioState_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9_AioState_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__AioState *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9_AioState_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__AioState *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioState.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9_AioState_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9_AioState_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9_AioState_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9_AioState_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioState.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9_AioState_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__AioState *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9_AioState_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__AioState *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioState.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":45
+ * 
+ * 
+ * cdef _initialize_poller():             # <<<<<<<<<<<<<<
+ *     # Initializes gRPC Core, must be called before other Core API
+ *     grpc_init()
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__initialize_poller(void) {
+  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("_initialize_poller", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":47
+ * cdef _initialize_poller():
+ *     # Initializes gRPC Core, must be called before other Core API
+ *     grpc_init()             # <<<<<<<<<<<<<<
+ * 
+ *     # Creates the only completion queue
+ */
+  grpc_init();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":50
+ * 
+ *     # Creates the only completion queue
+ *     _global_aio_state.cq = PollerCompletionQueue()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue)); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v_7_cython_6cygrpc__global_aio_state->cq);
+  __Pyx_DECREF((PyObject *)__pyx_v_7_cython_6cygrpc__global_aio_state->cq);
+  __pyx_v_7_cython_6cygrpc__global_aio_state->cq = ((struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":45
+ * 
+ * 
+ * cdef _initialize_poller():             # <<<<<<<<<<<<<<
+ *     # Initializes gRPC Core, must be called before other Core API
+ *     grpc_init()
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._initialize_poller", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":53
+ * 
+ * 
+ * cdef _actual_aio_initialization():             # <<<<<<<<<<<<<<
+ *     # Picks the engine for gRPC AsyncIO Stack
+ *     _global_aio_state.engine = AsyncIOEngine.__members__.get(
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__actual_aio_initialization(void) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_actual_aio_initialization", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":55
+ * cdef _actual_aio_initialization():
+ *     # Picks the engine for gRPC AsyncIO Stack
+ *     _global_aio_state.engine = AsyncIOEngine.__members__.get(             # <<<<<<<<<<<<<<
+ *         _GRPC_ASYNCIO_ENGINE,
+ *         _default_asyncio_engine(),
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_AsyncIOEngine); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 55, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_members); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 55, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 55, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":57
+ *     _global_aio_state.engine = AsyncIOEngine.__members__.get(
+ *         _GRPC_ASYNCIO_ENGINE,
+ *         _default_asyncio_engine(),             # <<<<<<<<<<<<<<
+ *     )
+ *     _LOGGER.debug('Using %s as I/O engine', _global_aio_state.engine)
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc__default_asyncio_engine(); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_v_7_cython_6cygrpc__GRPC_ASYNCIO_ENGINE, __pyx_t_3};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 55, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":55
+ * cdef _actual_aio_initialization():
+ *     # Picks the engine for gRPC AsyncIO Stack
+ *     _global_aio_state.engine = AsyncIOEngine.__members__.get(             # <<<<<<<<<<<<<<
+ *         _GRPC_ASYNCIO_ENGINE,
+ *         _default_asyncio_engine(),
+ */
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_7_cython_6cygrpc__global_aio_state->engine);
+  __Pyx_DECREF(__pyx_v_7_cython_6cygrpc__global_aio_state->engine);
+  __pyx_v_7_cython_6cygrpc__global_aio_state->engine = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":59
+ *         _default_asyncio_engine(),
+ *     )
+ *     _LOGGER.debug('Using %s as I/O engine', _global_aio_state.engine)             # <<<<<<<<<<<<<<
+ * 
+ *     # Initializes the process-level state accordingly
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_kp_s_Using_s_as_I_O_engine, __pyx_v_7_cython_6cygrpc__global_aio_state->engine};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 59, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":62
+ * 
+ *     # Initializes the process-level state accordingly
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:             # <<<<<<<<<<<<<<
+ *         _initialize_poller()
+ *     else:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_AsyncIOEngine); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_POLLER); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_6 = (__pyx_v_7_cython_6cygrpc__global_aio_state->engine == __pyx_t_3);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (likely(__pyx_t_6)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":63
+ *     # Initializes the process-level state accordingly
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ *         _initialize_poller()             # <<<<<<<<<<<<<<
+ *     else:
+ *         raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine)
+ */
+    __pyx_t_3 = __pyx_f_7_cython_6cygrpc__initialize_poller(); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 63, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":62
+ * 
+ *     # Initializes the process-level state accordingly
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:             # <<<<<<<<<<<<<<
+ *         _initialize_poller()
+ *     else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":65
+ *         _initialize_poller()
+ *     else:
+ *         raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Unsupported_engine_type_s, __pyx_v_7_cython_6cygrpc__global_aio_state->engine); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 65, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 65, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(33, 65, __pyx_L1_error)
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":53
+ * 
+ * 
+ * cdef _actual_aio_initialization():             # <<<<<<<<<<<<<<
+ *     # Picks the engine for gRPC AsyncIO Stack
+ *     _global_aio_state.engine = AsyncIOEngine.__members__.get(
+ */
+
+  /* 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_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._actual_aio_initialization", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":68
+ * 
+ * 
+ * def _grpc_shutdown_wrapper(_):             # <<<<<<<<<<<<<<
+ *     """A thin Python wrapper of Core's shutdown function.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_145_grpc_shutdown_wrapper(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_144_grpc_shutdown_wrapper, "A thin Python wrapper of Core's shutdown function.\n\n    Define functions are not allowed in \"cdef\" functions, and Cython complains\n    about a simple lambda with a C function.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_145_grpc_shutdown_wrapper = {"_grpc_shutdown_wrapper", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_145_grpc_shutdown_wrapper, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_144_grpc_shutdown_wrapper};
+static PyObject *__pyx_pw_7_cython_6cygrpc_145_grpc_shutdown_wrapper(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v__ = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_grpc_shutdown_wrapper (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s__57,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s__57)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(33, 68, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_grpc_shutdown_wrapper") < 0)) __PYX_ERR(33, 68, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v__ = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_grpc_shutdown_wrapper", 1, 1, 1, __pyx_nargs); __PYX_ERR(33, 68, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._grpc_shutdown_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_144_grpc_shutdown_wrapper(__pyx_self, __pyx_v__);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_144_grpc_shutdown_wrapper(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v__) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_grpc_shutdown_wrapper", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":74
+ *     about a simple lambda with a C function.
+ *     """
+ *     grpc_shutdown()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  grpc_shutdown();
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":68
+ * 
+ * 
+ * def _grpc_shutdown_wrapper(_):             # <<<<<<<<<<<<<<
+ *     """A thin Python wrapper of Core's shutdown function.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":77
+ * 
+ * 
+ * cdef _actual_aio_shutdown():             # <<<<<<<<<<<<<<
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ *         (<PollerCompletionQueue>_global_aio_state.cq).shutdown()
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__actual_aio_shutdown(void) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_actual_aio_shutdown", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":78
+ * 
+ * cdef _actual_aio_shutdown():
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:             # <<<<<<<<<<<<<<
+ *         (<PollerCompletionQueue>_global_aio_state.cq).shutdown()
+ *         grpc_shutdown()
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_AsyncIOEngine); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_POLLER); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = (__pyx_v_7_cython_6cygrpc__global_aio_state->engine == __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (likely(__pyx_t_3)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":79
+ * cdef _actual_aio_shutdown():
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ *         (<PollerCompletionQueue>_global_aio_state.cq).shutdown()             # <<<<<<<<<<<<<<
+ *         grpc_shutdown()
+ *     else:
+ */
+    __pyx_t_2 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_PollerCompletionQueue *)((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_7_cython_6cygrpc__global_aio_state->cq)->__pyx_base.__pyx_vtab)->shutdown(((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)__pyx_v_7_cython_6cygrpc__global_aio_state->cq)); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 79, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":80
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ *         (<PollerCompletionQueue>_global_aio_state.cq).shutdown()
+ *         grpc_shutdown()             # <<<<<<<<<<<<<<
+ *     else:
+ *         raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine)
+ */
+    grpc_shutdown();
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":78
+ * 
+ * cdef _actual_aio_shutdown():
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:             # <<<<<<<<<<<<<<
+ *         (<PollerCompletionQueue>_global_aio_state.cq).shutdown()
+ *         grpc_shutdown()
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":82
+ *         grpc_shutdown()
+ *     else:
+ *         raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __pyx_t_2 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Unsupported_engine_type_s, __pyx_v_7_cython_6cygrpc__global_aio_state->engine); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 82, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 82, __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_ERR(33, 82, __pyx_L1_error)
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":77
+ * 
+ * 
+ * cdef _actual_aio_shutdown():             # <<<<<<<<<<<<<<
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ *         (<PollerCompletionQueue>_global_aio_state.cq).shutdown()
+ */
+
+  /* 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_AddTraceback("_cython.cygrpc._actual_aio_shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":85
+ * 
+ * 
+ * cdef _initialize_per_loop():             # <<<<<<<<<<<<<<
+ *     cdef object loop = get_working_loop()
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__initialize_per_loop(void) {
+  PyObject *__pyx_v_loop = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_initialize_per_loop", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":86
+ * 
+ * cdef _initialize_per_loop():
+ *     cdef object loop = get_working_loop()             # <<<<<<<<<<<<<<
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ *         _global_aio_state.cq.bind_loop(loop)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_get_working_loop); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 86, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 86, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_v_loop = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":87
+ * cdef _initialize_per_loop():
+ *     cdef object loop = get_working_loop()
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:             # <<<<<<<<<<<<<<
+ *         _global_aio_state.cq.bind_loop(loop)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_AsyncIOEngine); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 87, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_POLLER); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 87, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_5 = (__pyx_v_7_cython_6cygrpc__global_aio_state->engine == __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":88
+ *     cdef object loop = get_working_loop()
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ *         _global_aio_state.cq.bind_loop(loop)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_7_cython_6cygrpc__global_aio_state->cq), __pyx_n_s_bind_loop); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 88, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_loop};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 88, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":87
+ * cdef _initialize_per_loop():
+ *     cdef object loop = get_working_loop()
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:             # <<<<<<<<<<<<<<
+ *         _global_aio_state.cq.bind_loop(loop)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":85
+ * 
+ * 
+ * cdef _initialize_per_loop():             # <<<<<<<<<<<<<<
+ *     cdef object loop = get_working_loop()
+ *     if _global_aio_state.engine is AsyncIOEngine.POLLER:
+ */
+
+  /* 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("_cython.cygrpc._initialize_per_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_loop);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":91
+ * 
+ * 
+ * cpdef init_grpc_aio():             # <<<<<<<<<<<<<<
+ *     """Initializes the gRPC AsyncIO module.
+ * 
+ */
+
+static PyObject *__pyx_pw_7_cython_6cygrpc_147init_grpc_aio(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_init_grpc_aio(CYTHON_UNUSED int __pyx_skip_dispatch) {
+  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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("init_grpc_aio", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":97
+ *     E.g., AioChannel, AioServer.
+ *     """
+ *     with _global_aio_state.lock:             # <<<<<<<<<<<<<<
+ *         _global_aio_state.refcount += 1
+ *         if _global_aio_state.refcount == 1:
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_7_cython_6cygrpc__global_aio_state->lock, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 97, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_7_cython_6cygrpc__global_aio_state->lock, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 97, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 97, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":98
+ *     """
+ *     with _global_aio_state.lock:
+ *         _global_aio_state.refcount += 1             # <<<<<<<<<<<<<<
+ *         if _global_aio_state.refcount == 1:
+ *             _actual_aio_initialization()
+ */
+          __pyx_v_7_cython_6cygrpc__global_aio_state->refcount = (__pyx_v_7_cython_6cygrpc__global_aio_state->refcount + 1);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":99
+ *     with _global_aio_state.lock:
+ *         _global_aio_state.refcount += 1
+ *         if _global_aio_state.refcount == 1:             # <<<<<<<<<<<<<<
+ *             _actual_aio_initialization()
+ *         _initialize_per_loop()
+ */
+          __pyx_t_9 = (__pyx_v_7_cython_6cygrpc__global_aio_state->refcount == 1);
+          if (__pyx_t_9) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":100
+ *         _global_aio_state.refcount += 1
+ *         if _global_aio_state.refcount == 1:
+ *             _actual_aio_initialization()             # <<<<<<<<<<<<<<
+ *         _initialize_per_loop()
+ * 
+ */
+            __pyx_t_2 = __pyx_f_7_cython_6cygrpc__actual_aio_initialization(); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 100, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":99
+ *     with _global_aio_state.lock:
+ *         _global_aio_state.refcount += 1
+ *         if _global_aio_state.refcount == 1:             # <<<<<<<<<<<<<<
+ *             _actual_aio_initialization()
+ *         _initialize_per_loop()
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":101
+ *         if _global_aio_state.refcount == 1:
+ *             _actual_aio_initialization()
+ *         _initialize_per_loop()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+          __pyx_t_2 = __pyx_f_7_cython_6cygrpc__initialize_per_loop(); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 101, __pyx_L7_error)
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":97
+ *     E.g., AioChannel, AioServer.
+ *     """
+ *     with _global_aio_state.lock:             # <<<<<<<<<<<<<<
+ *         _global_aio_state.refcount += 1
+ *         if _global_aio_state.refcount == 1:
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc.init_grpc_aio", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(33, 97, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_10 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(33, 97, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_10, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(33, 97, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(33, 97, __pyx_L9_except_error)
+          __pyx_t_12 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_3, __pyx_t_4);
+            __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(33, 97, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(33, 97, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L17;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L17:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":91
+ * 
+ * 
+ * cpdef init_grpc_aio():             # <<<<<<<<<<<<<<
+ *     """Initializes the gRPC AsyncIO module.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_AddTraceback("_cython.cygrpc.init_grpc_aio", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_147init_grpc_aio(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_146init_grpc_aio, "Initializes the gRPC AsyncIO module.\n\n    Expected to be invoked on critical class constructors.\n    E.g., AioChannel, AioServer.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_147init_grpc_aio = {"init_grpc_aio", (PyCFunction)__pyx_pw_7_cython_6cygrpc_147init_grpc_aio, METH_NOARGS, __pyx_doc_7_cython_6cygrpc_146init_grpc_aio};
+static PyObject *__pyx_pw_7_cython_6cygrpc_147init_grpc_aio(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("init_grpc_aio (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_146init_grpc_aio(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_146init_grpc_aio(CYTHON_UNUSED PyObject *__pyx_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("init_grpc_aio", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_init_grpc_aio(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 91, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.init_grpc_aio", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":104
+ * 
+ * 
+ * cpdef shutdown_grpc_aio():             # <<<<<<<<<<<<<<
+ *     """Shuts down the gRPC AsyncIO module.
+ * 
+ */
+
+static PyObject *__pyx_pw_7_cython_6cygrpc_149shutdown_grpc_aio(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_f_7_cython_6cygrpc_shutdown_grpc_aio(CYTHON_UNUSED int __pyx_skip_dispatch) {
+  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;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("shutdown_grpc_aio", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":110
+ *     E.g., AioChannel, AioServer.
+ *     """
+ *     with _global_aio_state.lock:             # <<<<<<<<<<<<<<
+ *         assert _global_aio_state.refcount > 0
+ *         _global_aio_state.refcount -= 1
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_v_7_cython_6cygrpc__global_aio_state->lock, __pyx_n_s_exit); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 110, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_v_7_cython_6cygrpc__global_aio_state->lock, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(33, 110, __pyx_L3_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 110, __pyx_L3_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":111
+ *     """
+ *     with _global_aio_state.lock:
+ *         assert _global_aio_state.refcount > 0             # <<<<<<<<<<<<<<
+ *         _global_aio_state.refcount -= 1
+ *         if not _global_aio_state.refcount:
+ */
+          #ifndef CYTHON_WITHOUT_ASSERTIONS
+          if (unlikely(__pyx_assertions_enabled())) {
+            __pyx_t_9 = (__pyx_v_7_cython_6cygrpc__global_aio_state->refcount > 0);
+            if (unlikely(!__pyx_t_9)) {
+              __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0);
+              __PYX_ERR(33, 111, __pyx_L7_error)
+            }
+          }
+          #else
+          if ((1)); else __PYX_ERR(33, 111, __pyx_L7_error)
+          #endif
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":112
+ *     with _global_aio_state.lock:
+ *         assert _global_aio_state.refcount > 0
+ *         _global_aio_state.refcount -= 1             # <<<<<<<<<<<<<<
+ *         if not _global_aio_state.refcount:
+ *             _actual_aio_shutdown()
+ */
+          __pyx_v_7_cython_6cygrpc__global_aio_state->refcount = (__pyx_v_7_cython_6cygrpc__global_aio_state->refcount - 1);
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":113
+ *         assert _global_aio_state.refcount > 0
+ *         _global_aio_state.refcount -= 1
+ *         if not _global_aio_state.refcount:             # <<<<<<<<<<<<<<
+ *             _actual_aio_shutdown()
+ */
+          __pyx_t_9 = (!(__pyx_v_7_cython_6cygrpc__global_aio_state->refcount != 0));
+          if (__pyx_t_9) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":114
+ *         _global_aio_state.refcount -= 1
+ *         if not _global_aio_state.refcount:
+ *             _actual_aio_shutdown()             # <<<<<<<<<<<<<<
+ */
+            __pyx_t_2 = __pyx_f_7_cython_6cygrpc__actual_aio_shutdown(); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 114, __pyx_L7_error)
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":113
+ *         assert _global_aio_state.refcount > 0
+ *         _global_aio_state.refcount -= 1
+ *         if not _global_aio_state.refcount:             # <<<<<<<<<<<<<<
+ *             _actual_aio_shutdown()
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":110
+ *     E.g., AioChannel, AioServer.
+ *     """
+ *     with _global_aio_state.lock:             # <<<<<<<<<<<<<<
+ *         assert _global_aio_state.refcount > 0
+ *         _global_aio_state.refcount -= 1
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L12_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc.shutdown_grpc_aio", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(33, 110, __pyx_L9_except_error)
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_10 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(33, 110, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_10, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(33, 110, __pyx_L9_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(33, 110, __pyx_L9_except_error)
+          __pyx_t_12 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_3, __pyx_t_4);
+            __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(33, 110, __pyx_L9_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
+        }
+        __pyx_L9_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L8_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L12_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(33, 110, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L6;
+      }
+      __pyx_L6:;
+    }
+    goto __pyx_L17;
+    __pyx_L3_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L17:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":104
+ * 
+ * 
+ * cpdef shutdown_grpc_aio():             # <<<<<<<<<<<<<<
+ *     """Shuts down the gRPC AsyncIO module.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_AddTraceback("_cython.cygrpc.shutdown_grpc_aio", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_149shutdown_grpc_aio(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_148shutdown_grpc_aio, "Shuts down the gRPC AsyncIO module.\n\n    Expected to be invoked on critical class destructors.\n    E.g., AioChannel, AioServer.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_149shutdown_grpc_aio = {"shutdown_grpc_aio", (PyCFunction)__pyx_pw_7_cython_6cygrpc_149shutdown_grpc_aio, METH_NOARGS, __pyx_doc_7_cython_6cygrpc_148shutdown_grpc_aio};
+static PyObject *__pyx_pw_7_cython_6cygrpc_149shutdown_grpc_aio(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("shutdown_grpc_aio (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_148shutdown_grpc_aio(__pyx_self);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_148shutdown_grpc_aio(CYTHON_UNUSED PyObject *__pyx_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("shutdown_grpc_aio", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_shutdown_grpc_aio(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(33, 104, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.shutdown_grpc_aio", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":33
+ * 
+ * 
+ * cdef int _get_send_initial_metadata_flags(object wait_for_ready) except *:             # <<<<<<<<<<<<<<
+ *     cdef int flags = 0
+ *     # Wait-for-ready can be None, which means using default value in Core.
+ */
+
+static int __pyx_f_7_cython_6cygrpc__get_send_initial_metadata_flags(PyObject *__pyx_v_wait_for_ready) {
+  int __pyx_v_flags;
+  int __pyx_r;
+  __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;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_get_send_initial_metadata_flags", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":34
+ * 
+ * cdef int _get_send_initial_metadata_flags(object wait_for_ready) except *:
+ *     cdef int flags = 0             # <<<<<<<<<<<<<<
+ *     # Wait-for-ready can be None, which means using default value in Core.
+ *     if wait_for_ready is not None:
+ */
+  __pyx_v_flags = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":36
+ *     cdef int flags = 0
+ *     # Wait-for-ready can be None, which means using default value in Core.
+ *     if wait_for_ready is not None:             # <<<<<<<<<<<<<<
+ *         flags |= InitialMetadataFlags.wait_for_ready_explicitly_set
+ *         if wait_for_ready:
+ */
+  __pyx_t_1 = (__pyx_v_wait_for_ready != Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":37
+ *     # Wait-for-ready can be None, which means using default value in Core.
+ *     if wait_for_ready is not None:
+ *         flags |= InitialMetadataFlags.wait_for_ready_explicitly_set             # <<<<<<<<<<<<<<
+ *         if wait_for_ready:
+ *             flags |= InitialMetadataFlags.wait_for_ready
+ */
+    __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 37, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_InitialMetadataFlags); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 37, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_wait_for_ready_explicitly_set); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 37, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyNumber_InPlaceOr(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 37, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(34, 37, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_v_flags = __pyx_t_5;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":38
+ *     if wait_for_ready is not None:
+ *         flags |= InitialMetadataFlags.wait_for_ready_explicitly_set
+ *         if wait_for_ready:             # <<<<<<<<<<<<<<
+ *             flags |= InitialMetadataFlags.wait_for_ready
+ * 
+ */
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_wait_for_ready); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(34, 38, __pyx_L1_error)
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":39
+ *         flags |= InitialMetadataFlags.wait_for_ready_explicitly_set
+ *         if wait_for_ready:
+ *             flags |= InitialMetadataFlags.wait_for_ready             # <<<<<<<<<<<<<<
+ * 
+ *     flags &= InitialMetadataFlags.used_mask
+ */
+      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 39, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_InitialMetadataFlags); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 39, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_wait_for_ready); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 39, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_4 = PyNumber_InPlaceOr(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 39, __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_t_5 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(34, 39, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_v_flags = __pyx_t_5;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":38
+ *     if wait_for_ready is not None:
+ *         flags |= InitialMetadataFlags.wait_for_ready_explicitly_set
+ *         if wait_for_ready:             # <<<<<<<<<<<<<<
+ *             flags |= InitialMetadataFlags.wait_for_ready
+ * 
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":36
+ *     cdef int flags = 0
+ *     # Wait-for-ready can be None, which means using default value in Core.
+ *     if wait_for_ready is not None:             # <<<<<<<<<<<<<<
+ *         flags |= InitialMetadataFlags.wait_for_ready_explicitly_set
+ *         if wait_for_ready:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":41
+ *             flags |= InitialMetadataFlags.wait_for_ready
+ * 
+ *     flags &= InitialMetadataFlags.used_mask             # <<<<<<<<<<<<<<
+ *     return flags
+ * 
+ */
+  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_InitialMetadataFlags); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_used_mask); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyNumber_InPlaceAnd(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(34, 41, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_flags = __pyx_t_5;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":42
+ * 
+ *     flags &= InitialMetadataFlags.used_mask
+ *     return flags             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_flags;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":33
+ * 
+ * 
+ * cdef int _get_send_initial_metadata_flags(object wait_for_ready) except *:             # <<<<<<<<<<<<<<
+ *     cdef int flags = 0
+ *     # Wait-for-ready can be None, which means using default value in Core.
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._get_send_initial_metadata_flags", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":47
+ * cdef class _AioCall(GrpcCallWrapper):
+ * 
+ *     def __cinit__(self, AioChannel channel, object deadline,             # <<<<<<<<<<<<<<
+ *                   bytes method, CallCredentials call_credentials, object wait_for_ready):
+ *         init_grpc_aio()
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_8_AioCall_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_8_AioCall_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_channel = 0;
+  PyObject *__pyx_v_deadline = 0;
+  PyObject *__pyx_v_method = 0;
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_credentials = 0;
+  PyObject *__pyx_v_wait_for_ready = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[5] = {0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_channel,&__pyx_n_s_deadline,&__pyx_n_s_method,&__pyx_n_s_call_credentials,&__pyx_n_s_wait_for_ready,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_channel)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 47, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_deadline)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 47, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 1); __PYX_ERR(34, 47, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 47, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 2); __PYX_ERR(34, 47, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_call_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 47, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 3); __PYX_ERR(34, 47, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_wait_for_ready)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 47, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 4); __PYX_ERR(34, 47, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(34, 47, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 5)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+      values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+      values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4);
+    }
+    __pyx_v_channel = ((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)values[0]);
+    __pyx_v_deadline = values[1];
+    __pyx_v_method = ((PyObject*)values[2]);
+    __pyx_v_call_credentials = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)values[3]);
+    __pyx_v_wait_for_ready = values[4];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, __pyx_nargs); __PYX_ERR(34, 47, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_channel), __pyx_ptype_7_cython_6cygrpc_AioChannel, 1, "channel", 0))) __PYX_ERR(34, 47, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_method), (&PyBytes_Type), 1, "method", 1))) __PYX_ERR(34, 48, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_call_credentials), __pyx_ptype_7_cython_6cygrpc_CallCredentials, 1, "call_credentials", 0))) __PYX_ERR(34, 48, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall___cinit__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_channel, __pyx_v_deadline, __pyx_v_method, __pyx_v_call_credentials, __pyx_v_wait_for_ready);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_8_AioCall___cinit__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_channel, PyObject *__pyx_v_deadline, PyObject *__pyx_v_method, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_call_credentials, PyObject *__pyx_v_wait_for_ready) {
+  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("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":49
+ *     def __cinit__(self, AioChannel channel, object deadline,
+ *                   bytes method, CallCredentials call_credentials, object wait_for_ready):
+ *         init_grpc_aio()             # <<<<<<<<<<<<<<
+ *         self.call = NULL
+ *         self._channel = channel
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_init_grpc_aio(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 49, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":50
+ *                   bytes method, CallCredentials call_credentials, object wait_for_ready):
+ *         init_grpc_aio()
+ *         self.call = NULL             # <<<<<<<<<<<<<<
+ *         self._channel = channel
+ *         self._loop = channel.loop
+ */
+  __pyx_v_self->__pyx_base.call = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":51
+ *         init_grpc_aio()
+ *         self.call = NULL
+ *         self._channel = channel             # <<<<<<<<<<<<<<
+ *         self._loop = channel.loop
+ *         self._references = []
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_channel);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_channel);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_channel);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_channel);
+  __pyx_v_self->_channel = __pyx_v_channel;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":52
+ *         self.call = NULL
+ *         self._channel = channel
+ *         self._loop = channel.loop             # <<<<<<<<<<<<<<
+ *         self._references = []
+ *         self._status = None
+ */
+  __pyx_t_1 = __pyx_v_channel->loop;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_loop);
+  __Pyx_DECREF(__pyx_v_self->_loop);
+  __pyx_v_self->_loop = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":53
+ *         self._channel = channel
+ *         self._loop = channel.loop
+ *         self._references = []             # <<<<<<<<<<<<<<
+ *         self._status = None
+ *         self._initial_metadata = None
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_references);
+  __Pyx_DECREF(__pyx_v_self->_references);
+  __pyx_v_self->_references = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":54
+ *         self._loop = channel.loop
+ *         self._references = []
+ *         self._status = None             # <<<<<<<<<<<<<<
+ *         self._initial_metadata = None
+ *         self._waiters_status = []
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_status);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_status);
+  __pyx_v_self->_status = ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)Py_None);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":55
+ *         self._references = []
+ *         self._status = None
+ *         self._initial_metadata = None             # <<<<<<<<<<<<<<
+ *         self._waiters_status = []
+ *         self._waiters_initial_metadata = []
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->_initial_metadata);
+  __Pyx_DECREF(__pyx_v_self->_initial_metadata);
+  __pyx_v_self->_initial_metadata = ((PyObject*)Py_None);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":56
+ *         self._status = None
+ *         self._initial_metadata = None
+ *         self._waiters_status = []             # <<<<<<<<<<<<<<
+ *         self._waiters_initial_metadata = []
+ *         self._done_callbacks = []
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 56, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_waiters_status);
+  __Pyx_DECREF(__pyx_v_self->_waiters_status);
+  __pyx_v_self->_waiters_status = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":57
+ *         self._initial_metadata = None
+ *         self._waiters_status = []
+ *         self._waiters_initial_metadata = []             # <<<<<<<<<<<<<<
+ *         self._done_callbacks = []
+ *         self._is_locally_cancelled = False
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_waiters_initial_metadata);
+  __Pyx_DECREF(__pyx_v_self->_waiters_initial_metadata);
+  __pyx_v_self->_waiters_initial_metadata = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":58
+ *         self._waiters_status = []
+ *         self._waiters_initial_metadata = []
+ *         self._done_callbacks = []             # <<<<<<<<<<<<<<
+ *         self._is_locally_cancelled = False
+ *         self._deadline = deadline
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 58, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_done_callbacks);
+  __Pyx_DECREF(__pyx_v_self->_done_callbacks);
+  __pyx_v_self->_done_callbacks = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":59
+ *         self._waiters_initial_metadata = []
+ *         self._done_callbacks = []
+ *         self._is_locally_cancelled = False             # <<<<<<<<<<<<<<
+ *         self._deadline = deadline
+ *         self._send_initial_metadata_flags = _get_send_initial_metadata_flags(wait_for_ready)
+ */
+  __pyx_v_self->_is_locally_cancelled = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":60
+ *         self._done_callbacks = []
+ *         self._is_locally_cancelled = False
+ *         self._deadline = deadline             # <<<<<<<<<<<<<<
+ *         self._send_initial_metadata_flags = _get_send_initial_metadata_flags(wait_for_ready)
+ *         self._create_grpc_call(deadline, method, call_credentials)
+ */
+  __Pyx_INCREF(__pyx_v_deadline);
+  __Pyx_GIVEREF(__pyx_v_deadline);
+  __Pyx_GOTREF(__pyx_v_self->_deadline);
+  __Pyx_DECREF(__pyx_v_self->_deadline);
+  __pyx_v_self->_deadline = __pyx_v_deadline;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":61
+ *         self._is_locally_cancelled = False
+ *         self._deadline = deadline
+ *         self._send_initial_metadata_flags = _get_send_initial_metadata_flags(wait_for_ready)             # <<<<<<<<<<<<<<
+ *         self._create_grpc_call(deadline, method, call_credentials)
+ * 
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc__get_send_initial_metadata_flags(__pyx_v_wait_for_ready); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(34, 61, __pyx_L1_error)
+  __pyx_v_self->_send_initial_metadata_flags = __pyx_t_2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":62
+ *         self._deadline = deadline
+ *         self._send_initial_metadata_flags = _get_send_initial_metadata_flags(wait_for_ready)
+ *         self._create_grpc_call(deadline, method, call_credentials)             # <<<<<<<<<<<<<<
+ * 
+ *     def __dealloc__(self):
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_v_self->__pyx_vtab)->_create_grpc_call(__pyx_v_self, __pyx_v_deadline, __pyx_v_method, __pyx_v_call_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 62, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":47
+ * cdef class _AioCall(GrpcCallWrapper):
+ * 
+ *     def __cinit__(self, AioChannel channel, object deadline,             # <<<<<<<<<<<<<<
+ *                   bytes method, CallCredentials call_credentials, object wait_for_ready):
+ *         init_grpc_aio()
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":64
+ *         self._create_grpc_call(deadline, method, call_credentials)
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         if self.call:
+ *             grpc_call_unref(self.call)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_8_AioCall_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_8_AioCall_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_8_AioCall_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_8_AioCall_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__dealloc__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":65
+ * 
+ *     def __dealloc__(self):
+ *         if self.call:             # <<<<<<<<<<<<<<
+ *             grpc_call_unref(self.call)
+ *         shutdown_grpc_aio()
+ */
+  __pyx_t_1 = (__pyx_v_self->__pyx_base.call != 0);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":66
+ *     def __dealloc__(self):
+ *         if self.call:
+ *             grpc_call_unref(self.call)             # <<<<<<<<<<<<<<
+ *         shutdown_grpc_aio()
+ * 
+ */
+    grpc_call_unref(__pyx_v_self->__pyx_base.call);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":65
+ * 
+ *     def __dealloc__(self):
+ *         if self.call:             # <<<<<<<<<<<<<<
+ *             grpc_call_unref(self.call)
+ *         shutdown_grpc_aio()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":67
+ *         if self.call:
+ *             grpc_call_unref(self.call)
+ *         shutdown_grpc_aio()             # <<<<<<<<<<<<<<
+ * 
+ *     def _repr(self) -> str:
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc_shutdown_grpc_aio(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":64
+ *         self._create_grpc_call(deadline, method, call_credentials)
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         if self.call:
+ *             grpc_call_unref(self.call)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_WriteUnraisable("_cython.cygrpc._AioCall.__dealloc__", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":69
+ *         shutdown_grpc_aio()
+ * 
+ *     def _repr(self) -> str:             # <<<<<<<<<<<<<<
+ *         """Assembles the RPC representation string."""
+ *         # This needs to be loaded at run time once everything
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_5_repr(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_4_repr, "Assembles the RPC representation string.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_5_repr = {"_repr", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_5_repr, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_4_repr};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_5_repr(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_repr (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("_repr", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_repr", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_4_repr(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_4_repr(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_v__common = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  grpc_status_code __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_repr", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":73
+ *         # This needs to be loaded at run time once everything
+ *         # has been loaded.
+ *         from grpc import _common             # <<<<<<<<<<<<<<
+ * 
+ *         if not self.done():
+ */
+  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_n_s_common);
+  __Pyx_GIVEREF(__pyx_n_s_common);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_common)) __PYX_ERR(34, 73, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_grpc, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 73, __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_common); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_v__common = __pyx_t_1;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":75
+ *         from grpc import _common
+ * 
+ *         if not self.done():             # <<<<<<<<<<<<<<
+ *             return '<{} object>'.format(self.__class__.__name__)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_done); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 75, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 75, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __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_ERR(34, 75, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_6 = (!__pyx_t_5);
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":76
+ * 
+ *         if not self.done():
+ *             return '<{} object>'.format(self.__class__.__name__)             # <<<<<<<<<<<<<<
+ * 
+ *         if self._status.code() is StatusCode.ok:
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_object_2, __pyx_n_s_format); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 76, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_class); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 76, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_name_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 76, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_7};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 76, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_2))) __PYX_ERR(34, 76, __pyx_L1_error)
+    __pyx_r = ((PyObject*)__pyx_t_2);
+    __pyx_t_2 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":75
+ *         from grpc import _common
+ * 
+ *         if not self.done():             # <<<<<<<<<<<<<<
+ *             return '<{} object>'.format(self.__class__.__name__)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":78
+ *             return '<{} object>'.format(self.__class__.__name__)
+ * 
+ *         if self._status.code() is StatusCode.ok:             # <<<<<<<<<<<<<<
+ *             return _OK_CALL_REPRESENTATION.format(
+ *                 self.__class__.__name__,
+ */
+  __pyx_t_8 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self->_status->__pyx_vtab)->code(__pyx_v_self->_status, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 78, __pyx_L1_error)
+  __pyx_t_2 = __Pyx_PyInt_From_grpc_status_code(__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ok); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_6 = (__pyx_t_2 == __pyx_t_7);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":79
+ * 
+ *         if self._status.code() is StatusCode.ok:
+ *             return _OK_CALL_REPRESENTATION.format(             # <<<<<<<<<<<<<<
+ *                 self.__class__.__name__,
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_OK_CALL_REPRESENTATION); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 79, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_format); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 79, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":80
+ *         if self._status.code() is StatusCode.ok:
+ *             return _OK_CALL_REPRESENTATION.format(
+ *                 self.__class__.__name__,             # <<<<<<<<<<<<<<
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],
+ *                 self._status.details())
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":81
+ *             return _OK_CALL_REPRESENTATION.format(
+ *                 self.__class__.__name__,
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],             # <<<<<<<<<<<<<<
+ *                 self._status.details())
+ *         else:
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v__common, __pyx_n_s_CYGRPC_STATUS_CODE_TO_STATUS_COD); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 81, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_8 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self->_status->__pyx_vtab)->code(__pyx_v_self->_status, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 81, __pyx_L1_error)
+    __pyx_t_9 = __Pyx_PyInt_From_grpc_status_code(__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(34, 81, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_10 = __Pyx_PyObject_GetItem(__pyx_t_2, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 81, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_10);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":82
+ *                 self.__class__.__name__,
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],
+ *                 self._status.details())             # <<<<<<<<<<<<<<
+ *         else:
+ *             return _NON_OK_CALL_REPRESENTATION.format(
+ */
+    __pyx_t_9 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self->_status->__pyx_vtab)->details(__pyx_v_self->_status, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(34, 82, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_2 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_1))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_1, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_2, __pyx_t_3, __pyx_t_10, __pyx_t_9};
+      __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 79, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":79
+ * 
+ *         if self._status.code() is StatusCode.ok:
+ *             return _OK_CALL_REPRESENTATION.format(             # <<<<<<<<<<<<<<
+ *                 self.__class__.__name__,
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],
+ */
+    if (!(likely(PyString_CheckExact(__pyx_t_7))||((__pyx_t_7) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_7))) __PYX_ERR(34, 79, __pyx_L1_error)
+    __pyx_r = ((PyObject*)__pyx_t_7);
+    __pyx_t_7 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":78
+ *             return '<{} object>'.format(self.__class__.__name__)
+ * 
+ *         if self._status.code() is StatusCode.ok:             # <<<<<<<<<<<<<<
+ *             return _OK_CALL_REPRESENTATION.format(
+ *                 self.__class__.__name__,
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":84
+ *                 self._status.details())
+ *         else:
+ *             return _NON_OK_CALL_REPRESENTATION.format(             # <<<<<<<<<<<<<<
+ *                 self.__class__.__name__,
+ *                 self._status.details(),
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_NON_OK_CALL_REPRESENTATION); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 84, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_format); if (unlikely(!__pyx_t_9)) __PYX_ERR(34, 84, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":85
+ *         else:
+ *             return _NON_OK_CALL_REPRESENTATION.format(
+ *                 self.__class__.__name__,             # <<<<<<<<<<<<<<
+ *                 self._status.details(),
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_class); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 85, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_name_2); if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 85, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_10);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":86
+ *             return _NON_OK_CALL_REPRESENTATION.format(
+ *                 self.__class__.__name__,
+ *                 self._status.details(),             # <<<<<<<<<<<<<<
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],
+ *                 self._status.debug_error_string())
+ */
+    __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self->_status->__pyx_vtab)->details(__pyx_v_self->_status, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 86, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":87
+ *                 self.__class__.__name__,
+ *                 self._status.details(),
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],             # <<<<<<<<<<<<<<
+ *                 self._status.debug_error_string())
+ * 
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v__common, __pyx_n_s_CYGRPC_STATUS_CODE_TO_STATUS_COD); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 87, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self->_status->__pyx_vtab)->code(__pyx_v_self->_status, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 87, __pyx_L1_error)
+    __pyx_t_2 = __Pyx_PyInt_From_grpc_status_code(__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 87, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_11 = __Pyx_PyObject_GetItem(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_11)) __PYX_ERR(34, 87, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_11);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":88
+ *                 self._status.details(),
+ *                 _common.CYGRPC_STATUS_CODE_TO_STATUS_CODE[self._status.code()],
+ *                 self._status.debug_error_string())             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self) -> str:
+ */
+    __pyx_t_2 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self->_status->__pyx_vtab)->debug_error_string(__pyx_v_self->_status, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 88, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_9))) {
+      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_9);
+      if (likely(__pyx_t_3)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+        __Pyx_INCREF(__pyx_t_3);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_9, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[5] = {__pyx_t_3, __pyx_t_10, __pyx_t_1, __pyx_t_11, __pyx_t_2};
+      __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_4, 4+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 84, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":84
+ *                 self._status.details())
+ *         else:
+ *             return _NON_OK_CALL_REPRESENTATION.format(             # <<<<<<<<<<<<<<
+ *                 self.__class__.__name__,
+ *                 self._status.details(),
+ */
+    if (!(likely(PyString_CheckExact(__pyx_t_7))||((__pyx_t_7) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_7))) __PYX_ERR(34, 84, __pyx_L1_error)
+    __pyx_r = ((PyObject*)__pyx_t_7);
+    __pyx_t_7 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":69
+ *         shutdown_grpc_aio()
+ * 
+ *     def _repr(self) -> str:             # <<<<<<<<<<<<<<
+ *         """Assembles the RPC representation string."""
+ *         # This needs to be loaded at run time once everything
+ */
+
+  /* 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_7);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall._repr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v__common);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":90
+ *                 self._status.debug_error_string())
+ * 
+ *     def __repr__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_7__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_7__repr__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_6__repr__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_6__repr__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__repr__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":91
+ * 
+ *     def __repr__(self) -> str:
+ *         return self._repr()             # <<<<<<<<<<<<<<
+ * 
+ *     def __str__(self) -> str:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_repr); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 91, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 91, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":90
+ *                 self._status.debug_error_string())
+ * 
+ *     def __repr__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":93
+ *         return self._repr()
+ * 
+ *     def __str__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_9__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_9__str__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_8__str__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_8__str__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("__str__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":94
+ * 
+ *     def __str__(self) -> str:
+ *         return self._repr()             # <<<<<<<<<<<<<<
+ * 
+ *     cdef void _create_grpc_call(self,
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_repr); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 94, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 94, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":93
+ *         return self._repr()
+ * 
+ *     def __str__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":96
+ *         return self._repr()
+ * 
+ *     cdef void _create_grpc_call(self,             # <<<<<<<<<<<<<<
+ *                                 object deadline,
+ *                                 bytes method,
+ */
+
+static void __pyx_f_7_cython_6cygrpc_8_AioCall__create_grpc_call(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_deadline, PyObject *__pyx_v_method, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_credentials) {
+  grpc_slice __pyx_v_method_slice;
+  gpr_timespec __pyx_v_c_deadline;
+  grpc_call_error __pyx_v_set_credentials_error;
+  __Pyx_RefNannyDeclarations
+  gpr_timespec __pyx_t_1;
+  char const *__pyx_t_2;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  __pyx_t_7_cython_6cygrpc_uint32_t __pyx_t_5;
+  grpc_completion_queue *__pyx_t_6;
+  int __pyx_t_7;
+  grpc_call_credentials *__pyx_t_8;
+  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;
+  unsigned int __pyx_t_14;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_create_grpc_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":109
+ *         """
+ *         cdef grpc_slice method_slice
+ *         cdef gpr_timespec c_deadline = _timespec_from_time(deadline)             # <<<<<<<<<<<<<<
+ *         cdef grpc_call_error set_credentials_error
+ * 
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__timespec_from_time(__pyx_v_deadline); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 109, __pyx_L1_error)
+  __pyx_v_c_deadline = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":113
+ * 
+ *         method_slice = grpc_slice_from_copied_buffer(
+ *             <const char *> method,             # <<<<<<<<<<<<<<
+ *             <size_t> len(method)
+ *         )
+ */
+  if (unlikely(__pyx_v_method == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+    __PYX_ERR(34, 113, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyBytes_AsString(__pyx_v_method); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) __PYX_ERR(34, 113, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":114
+ *         method_slice = grpc_slice_from_copied_buffer(
+ *             <const char *> method,
+ *             <size_t> len(method)             # <<<<<<<<<<<<<<
+ *         )
+ *         self.call = grpc_channel_create_call(
+ */
+  if (unlikely(__pyx_v_method == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+    __PYX_ERR(34, 114, __pyx_L1_error)
+  }
+  __pyx_t_3 = __Pyx_PyBytes_GET_SIZE(__pyx_v_method); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(34, 114, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":112
+ *         cdef grpc_call_error set_credentials_error
+ * 
+ *         method_slice = grpc_slice_from_copied_buffer(             # <<<<<<<<<<<<<<
+ *             <const char *> method,
+ *             <size_t> len(method)
+ */
+  __pyx_v_method_slice = grpc_slice_from_copied_buffer(((char const *)__pyx_t_2), ((size_t)__pyx_t_3));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":119
+ *             self._channel.channel,
+ *             NULL,
+ *             _EMPTY_MASK,             # <<<<<<<<<<<<<<
+ *             global_completion_queue(),
+ *             method_slice,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_EMPTY_MASK); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 119, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = __Pyx_PyInt_As_unsigned_int(__pyx_t_4); if (unlikely((__pyx_t_5 == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(34, 119, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":120
+ *             NULL,
+ *             _EMPTY_MASK,
+ *             global_completion_queue(),             # <<<<<<<<<<<<<<
+ *             method_slice,
+ *             NULL,
+ */
+  __pyx_t_6 = __pyx_f_7_cython_6cygrpc_global_completion_queue(); if (unlikely(__pyx_t_6 == ((grpc_completion_queue *)NULL) && PyErr_Occurred())) __PYX_ERR(34, 120, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":116
+ *             <size_t> len(method)
+ *         )
+ *         self.call = grpc_channel_create_call(             # <<<<<<<<<<<<<<
+ *             self._channel.channel,
+ *             NULL,
+ */
+  __pyx_v_self->__pyx_base.call = grpc_channel_create_call(__pyx_v_self->_channel->channel, NULL, __pyx_t_5, __pyx_t_6, __pyx_v_method_slice, NULL, __pyx_v_c_deadline, NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":127
+ *         )
+ * 
+ *         if credentials is not None:             # <<<<<<<<<<<<<<
+ *             set_credentials_error = grpc_call_set_credentials(self.call, credentials.c())
+ *             if set_credentials_error != GRPC_CALL_OK:
+ */
+  __pyx_t_7 = (((PyObject *)__pyx_v_credentials) != Py_None);
+  if (__pyx_t_7) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":128
+ * 
+ *         if credentials is not None:
+ *             set_credentials_error = grpc_call_set_credentials(self.call, credentials.c())             # <<<<<<<<<<<<<<
+ *             if set_credentials_error != GRPC_CALL_OK:
+ *                 raise InternalError("Credentials couldn't have been set: {0}".format(set_credentials_error))
+ */
+    __pyx_t_8 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials *)__pyx_v_credentials->__pyx_vtab)->c(__pyx_v_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 128, __pyx_L1_error)
+    __pyx_v_set_credentials_error = grpc_call_set_credentials(__pyx_v_self->__pyx_base.call, __pyx_t_8);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":129
+ *         if credentials is not None:
+ *             set_credentials_error = grpc_call_set_credentials(self.call, credentials.c())
+ *             if set_credentials_error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *                 raise InternalError("Credentials couldn't have been set: {0}".format(set_credentials_error))
+ * 
+ */
+    __pyx_t_7 = (__pyx_v_set_credentials_error != GRPC_CALL_OK);
+    if (unlikely(__pyx_t_7)) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":130
+ *             set_credentials_error = grpc_call_set_credentials(self.call, credentials.c())
+ *             if set_credentials_error != GRPC_CALL_OK:
+ *                 raise InternalError("Credentials couldn't have been set: {0}".format(set_credentials_error))             # <<<<<<<<<<<<<<
+ * 
+ *         grpc_slice_unref(method_slice)
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_InternalError); if (unlikely(!__pyx_t_9)) __PYX_ERR(34, 130, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Credentials_couldn_t_have_been_s, __pyx_n_s_format); if (unlikely(!__pyx_t_11)) __PYX_ERR(34, 130, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __pyx_t_12 = __Pyx_PyInt_From_grpc_call_error(__pyx_v_set_credentials_error); if (unlikely(!__pyx_t_12)) __PYX_ERR(34, 130, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_12);
+      __pyx_t_13 = NULL;
+      __pyx_t_14 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_14 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_13, __pyx_t_12};
+        __pyx_t_10 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_14, 1+__pyx_t_14);
+        __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 130, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      }
+      __pyx_t_11 = NULL;
+      __pyx_t_14 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_9))) {
+        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_9);
+        if (likely(__pyx_t_11)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+          __Pyx_INCREF(__pyx_t_11);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_9, function);
+          __pyx_t_14 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_t_10};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_14, 1+__pyx_t_14);
+        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 130, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      }
+      __Pyx_Raise(__pyx_t_4, 0, 0, 0);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __PYX_ERR(34, 130, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":129
+ *         if credentials is not None:
+ *             set_credentials_error = grpc_call_set_credentials(self.call, credentials.c())
+ *             if set_credentials_error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *                 raise InternalError("Credentials couldn't have been set: {0}".format(set_credentials_error))
+ * 
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":127
+ *         )
+ * 
+ *         if credentials is not None:             # <<<<<<<<<<<<<<
+ *             set_credentials_error = grpc_call_set_credentials(self.call, credentials.c())
+ *             if set_credentials_error != GRPC_CALL_OK:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":132
+ *                 raise InternalError("Credentials couldn't have been set: {0}".format(set_credentials_error))
+ * 
+ *         grpc_slice_unref(method_slice)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef void _set_status(self, AioRpcStatus status) except *:
+ */
+  grpc_slice_unref(__pyx_v_method_slice);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":96
+ *         return self._repr()
+ * 
+ *     cdef void _create_grpc_call(self,             # <<<<<<<<<<<<<<
+ *                                 object deadline,
+ *                                 bytes method,
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_13);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall._create_grpc_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":134
+ *         grpc_slice_unref(method_slice)
+ * 
+ *     cdef void _set_status(self, AioRpcStatus status) except *:             # <<<<<<<<<<<<<<
+ *         cdef list waiters
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc_8_AioCall__set_status(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *__pyx_v_status) {
+  PyObject *__pyx_v_waiter = NULL;
+  PyObject *__pyx_v_callback = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  unsigned int __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_set_status", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":138
+ * 
+ *         # No more waiters should be expected since status has been set.
+ *         self._status = status             # <<<<<<<<<<<<<<
+ * 
+ *         if self._initial_metadata is None:
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_status);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_status);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_status);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_status);
+  __pyx_v_self->_status = __pyx_v_status;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":140
+ *         self._status = status
+ * 
+ *         if self._initial_metadata is None:             # <<<<<<<<<<<<<<
+ *             self._set_initial_metadata(_IMMUTABLE_EMPTY_METADATA)
+ * 
+ */
+  __pyx_t_1 = (__pyx_v_self->_initial_metadata == ((PyObject*)Py_None));
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":141
+ * 
+ *         if self._initial_metadata is None:
+ *             self._set_initial_metadata(_IMMUTABLE_EMPTY_METADATA)             # <<<<<<<<<<<<<<
+ * 
+ *         for waiter in self._waiters_status:
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 141, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(34, 141, __pyx_L1_error)
+    ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_v_self->__pyx_vtab)->_set_initial_metadata(__pyx_v_self, ((PyObject*)__pyx_t_2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 141, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":140
+ *         self._status = status
+ * 
+ *         if self._initial_metadata is None:             # <<<<<<<<<<<<<<
+ *             self._set_initial_metadata(_IMMUTABLE_EMPTY_METADATA)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":143
+ *             self._set_initial_metadata(_IMMUTABLE_EMPTY_METADATA)
+ * 
+ *         for waiter in self._waiters_status:             # <<<<<<<<<<<<<<
+ *             if not waiter.done():
+ *                 waiter.set_result(None)
+ */
+  if (unlikely(__pyx_v_self->_waiters_status == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    __PYX_ERR(34, 143, __pyx_L1_error)
+  }
+  __pyx_t_2 = __pyx_v_self->_waiters_status; __Pyx_INCREF(__pyx_t_2);
+  __pyx_t_3 = 0;
+  for (;;) {
+    {
+      Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2);
+      #if !CYTHON_ASSUME_SAFE_MACROS
+      if (unlikely((__pyx_temp < 0))) __PYX_ERR(34, 143, __pyx_L1_error)
+      #endif
+      if (__pyx_t_3 >= __pyx_temp) break;
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(34, 143, __pyx_L1_error)
+    #else
+    __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 143, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_waiter, __pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":144
+ * 
+ *         for waiter in self._waiters_status:
+ *             if not waiter.done():             # <<<<<<<<<<<<<<
+ *                 waiter.set_result(None)
+ *         self._waiters_status = []
+ */
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_waiter, __pyx_n_s_done); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 144, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_7 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 144, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(34, 144, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_8 = (!__pyx_t_1);
+    if (__pyx_t_8) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":145
+ *         for waiter in self._waiters_status:
+ *             if not waiter.done():
+ *                 waiter.set_result(None)             # <<<<<<<<<<<<<<
+ *         self._waiters_status = []
+ * 
+ */
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_waiter, __pyx_n_s_set_result); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 145, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_6 = NULL;
+      __pyx_t_7 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_7 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_6, Py_None};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 145, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":144
+ * 
+ *         for waiter in self._waiters_status:
+ *             if not waiter.done():             # <<<<<<<<<<<<<<
+ *                 waiter.set_result(None)
+ *         self._waiters_status = []
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":143
+ *             self._set_initial_metadata(_IMMUTABLE_EMPTY_METADATA)
+ * 
+ *         for waiter in self._waiters_status:             # <<<<<<<<<<<<<<
+ *             if not waiter.done():
+ *                 waiter.set_result(None)
+ */
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":146
+ *             if not waiter.done():
+ *                 waiter.set_result(None)
+ *         self._waiters_status = []             # <<<<<<<<<<<<<<
+ * 
+ *         for callback in self._done_callbacks:
+ */
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 146, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->_waiters_status);
+  __Pyx_DECREF(__pyx_v_self->_waiters_status);
+  __pyx_v_self->_waiters_status = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":148
+ *         self._waiters_status = []
+ * 
+ *         for callback in self._done_callbacks:             # <<<<<<<<<<<<<<
+ *             callback()
+ * 
+ */
+  if (unlikely(__pyx_v_self->_done_callbacks == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    __PYX_ERR(34, 148, __pyx_L1_error)
+  }
+  __pyx_t_2 = __pyx_v_self->_done_callbacks; __Pyx_INCREF(__pyx_t_2);
+  __pyx_t_3 = 0;
+  for (;;) {
+    {
+      Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2);
+      #if !CYTHON_ASSUME_SAFE_MACROS
+      if (unlikely((__pyx_temp < 0))) __PYX_ERR(34, 148, __pyx_L1_error)
+      #endif
+      if (__pyx_t_3 >= __pyx_temp) break;
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(34, 148, __pyx_L1_error)
+    #else
+    __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 148, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_callback, __pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":149
+ * 
+ *         for callback in self._done_callbacks:
+ *             callback()             # <<<<<<<<<<<<<<
+ * 
+ *     cdef void _set_initial_metadata(self, tuple initial_metadata) except *:
+ */
+    __Pyx_INCREF(__pyx_v_callback);
+    __pyx_t_5 = __pyx_v_callback; __pyx_t_6 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(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);
+        __pyx_t_7 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 149, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":148
+ *         self._waiters_status = []
+ * 
+ *         for callback in self._done_callbacks:             # <<<<<<<<<<<<<<
+ *             callback()
+ * 
+ */
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":134
+ *         grpc_slice_unref(method_slice)
+ * 
+ *     cdef void _set_status(self, AioRpcStatus status) except *:             # <<<<<<<<<<<<<<
+ *         cdef list waiters
+ * 
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall._set_status", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_waiter);
+  __Pyx_XDECREF(__pyx_v_callback);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":151
+ *             callback()
+ * 
+ *     cdef void _set_initial_metadata(self, tuple initial_metadata) except *:             # <<<<<<<<<<<<<<
+ *         if self._initial_metadata is not None:
+ *             # Some gRPC calls might end before the initial metadata arrived in
+ */
+
+static void __pyx_f_7_cython_6cygrpc_8_AioCall__set_initial_metadata(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_initial_metadata) {
+  PyObject *__pyx_v_waiter = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  unsigned int __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_set_initial_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":152
+ * 
+ *     cdef void _set_initial_metadata(self, tuple initial_metadata) except *:
+ *         if self._initial_metadata is not None:             # <<<<<<<<<<<<<<
+ *             # Some gRPC calls might end before the initial metadata arrived in
+ *             # the Call object. That causes this method to be invoked twice: 1.
+ */
+  __pyx_t_1 = (__pyx_v_self->_initial_metadata != ((PyObject*)Py_None));
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":157
+ *             # filled with an empty metadata; 2. updated with the actual user
+ *             # provided metadata.
+ *             return             # <<<<<<<<<<<<<<
+ * 
+ *         cdef list waiters
+ */
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":152
+ * 
+ *     cdef void _set_initial_metadata(self, tuple initial_metadata) except *:
+ *         if self._initial_metadata is not None:             # <<<<<<<<<<<<<<
+ *             # Some gRPC calls might end before the initial metadata arrived in
+ *             # the Call object. That causes this method to be invoked twice: 1.
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":163
+ *         # No more waiters should be expected since initial metadata has been
+ *         # set.
+ *         self._initial_metadata = initial_metadata             # <<<<<<<<<<<<<<
+ * 
+ *         for waiter in self._waiters_initial_metadata:
+ */
+  __Pyx_INCREF(__pyx_v_initial_metadata);
+  __Pyx_GIVEREF(__pyx_v_initial_metadata);
+  __Pyx_GOTREF(__pyx_v_self->_initial_metadata);
+  __Pyx_DECREF(__pyx_v_self->_initial_metadata);
+  __pyx_v_self->_initial_metadata = __pyx_v_initial_metadata;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":165
+ *         self._initial_metadata = initial_metadata
+ * 
+ *         for waiter in self._waiters_initial_metadata:             # <<<<<<<<<<<<<<
+ *             if not waiter.done():
+ *                 waiter.set_result(None)
+ */
+  if (unlikely(__pyx_v_self->_waiters_initial_metadata == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    __PYX_ERR(34, 165, __pyx_L1_error)
+  }
+  __pyx_t_2 = __pyx_v_self->_waiters_initial_metadata; __Pyx_INCREF(__pyx_t_2);
+  __pyx_t_3 = 0;
+  for (;;) {
+    {
+      Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2);
+      #if !CYTHON_ASSUME_SAFE_MACROS
+      if (unlikely((__pyx_temp < 0))) __PYX_ERR(34, 165, __pyx_L1_error)
+      #endif
+      if (__pyx_t_3 >= __pyx_temp) break;
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(34, 165, __pyx_L1_error)
+    #else
+    __pyx_t_4 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 165, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_waiter, __pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":166
+ * 
+ *         for waiter in self._waiters_initial_metadata:
+ *             if not waiter.done():             # <<<<<<<<<<<<<<
+ *                 waiter.set_result(None)
+ *         self._waiters_initial_metadata = []
+ */
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_waiter, __pyx_n_s_done); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 166, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = NULL;
+    __pyx_t_7 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_7 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 0+__pyx_t_7);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 166, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(34, 166, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_8 = (!__pyx_t_1);
+    if (__pyx_t_8) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":167
+ *         for waiter in self._waiters_initial_metadata:
+ *             if not waiter.done():
+ *                 waiter.set_result(None)             # <<<<<<<<<<<<<<
+ *         self._waiters_initial_metadata = []
+ * 
+ */
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_waiter, __pyx_n_s_set_result); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 167, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_6 = NULL;
+      __pyx_t_7 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_7 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_6, Py_None};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_7, 1+__pyx_t_7);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 167, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":166
+ * 
+ *         for waiter in self._waiters_initial_metadata:
+ *             if not waiter.done():             # <<<<<<<<<<<<<<
+ *                 waiter.set_result(None)
+ *         self._waiters_initial_metadata = []
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":165
+ *         self._initial_metadata = initial_metadata
+ * 
+ *         for waiter in self._waiters_initial_metadata:             # <<<<<<<<<<<<<<
+ *             if not waiter.done():
+ *                 waiter.set_result(None)
+ */
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":168
+ *             if not waiter.done():
+ *                 waiter.set_result(None)
+ *         self._waiters_initial_metadata = []             # <<<<<<<<<<<<<<
+ * 
+ *     def add_done_callback(self, callback):
+ */
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 168, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->_waiters_initial_metadata);
+  __Pyx_DECREF(__pyx_v_self->_waiters_initial_metadata);
+  __pyx_v_self->_waiters_initial_metadata = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":151
+ *             callback()
+ * 
+ *     cdef void _set_initial_metadata(self, tuple initial_metadata) except *:             # <<<<<<<<<<<<<<
+ *         if self._initial_metadata is not None:
+ *             # Some gRPC calls might end before the initial metadata arrived in
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall._set_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_waiter);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":170
+ *         self._waiters_initial_metadata = []
+ * 
+ *     def add_done_callback(self, callback):             # <<<<<<<<<<<<<<
+ *         if self.done():
+ *             callback()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_11add_done_callback(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_11add_done_callback = {"add_done_callback", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_11add_done_callback, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_11add_done_callback(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_callback = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("add_done_callback (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_callback,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_callback)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 170, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_done_callback") < 0)) __PYX_ERR(34, 170, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_callback = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("add_done_callback", 1, 1, 1, __pyx_nargs); __PYX_ERR(34, 170, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.add_done_callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_10add_done_callback(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_callback);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_10add_done_callback(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_callback) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("add_done_callback", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":171
+ * 
+ *     def add_done_callback(self, callback):
+ *         if self.done():             # <<<<<<<<<<<<<<
+ *             callback()
+ *         else:
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_done); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 171, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 171, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(34, 171, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":172
+ *     def add_done_callback(self, callback):
+ *         if self.done():
+ *             callback()             # <<<<<<<<<<<<<<
+ *         else:
+ *             self._done_callbacks.append(callback)
+ */
+    __Pyx_INCREF(__pyx_v_callback);
+    __pyx_t_2 = __pyx_v_callback; __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 172, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":171
+ * 
+ *     def add_done_callback(self, callback):
+ *         if self.done():             # <<<<<<<<<<<<<<
+ *             callback()
+ *         else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":174
+ *             callback()
+ *         else:
+ *             self._done_callbacks.append(callback)             # <<<<<<<<<<<<<<
+ * 
+ *     def time_remaining(self):
+ */
+  /*else*/ {
+    if (unlikely(__pyx_v_self->_done_callbacks == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+      __PYX_ERR(34, 174, __pyx_L1_error)
+    }
+    __pyx_t_6 = __Pyx_PyList_Append(__pyx_v_self->_done_callbacks, __pyx_v_callback); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(34, 174, __pyx_L1_error)
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":170
+ *         self._waiters_initial_metadata = []
+ * 
+ *     def add_done_callback(self, callback):             # <<<<<<<<<<<<<<
+ *         if self.done():
+ *             callback()
+ */
+
+  /* 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("_cython.cygrpc._AioCall.add_done_callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":176
+ *             self._done_callbacks.append(callback)
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         if self._deadline is None:
+ *             return None
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_13time_remaining(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_13time_remaining = {"time_remaining", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_13time_remaining, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_13time_remaining(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("time_remaining (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("time_remaining", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "time_remaining", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_12time_remaining(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_12time_remaining(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_5;
+  long __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("time_remaining", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":177
+ * 
+ *     def time_remaining(self):
+ *         if self._deadline is None:             # <<<<<<<<<<<<<<
+ *             return None
+ *         else:
+ */
+  __pyx_t_1 = (__pyx_v_self->_deadline == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":178
+ *     def time_remaining(self):
+ *         if self._deadline is None:
+ *             return None             # <<<<<<<<<<<<<<
+ *         else:
+ *             return max(0, self._deadline - time.time())
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":177
+ * 
+ *     def time_remaining(self):
+ *         if self._deadline is None:             # <<<<<<<<<<<<<<
+ *             return None
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":180
+ *             return None
+ *         else:
+ *             return max(0, self._deadline - time.time())             # <<<<<<<<<<<<<<
+ * 
+ *     def cancel(self, str details):
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_time); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 180, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_time); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 180, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_3)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_3);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 180, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __pyx_t_4 = PyNumber_Subtract(__pyx_v_self->_deadline, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 180, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_6 = 0;
+    __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 180, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_4, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 180, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(34, 180, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    if (__pyx_t_1) {
+      __Pyx_INCREF(__pyx_t_4);
+      __pyx_t_2 = __pyx_t_4;
+    } else {
+      __pyx_t_7 = __Pyx_PyInt_From_long(__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 180, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_2 = __pyx_t_7;
+      __pyx_t_7 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_INCREF(__pyx_t_2);
+    __pyx_r = __pyx_t_2;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":176
+ *             self._done_callbacks.append(callback)
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         if self._deadline is None:
+ *             return None
+ */
+
+  /* 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("_cython.cygrpc._AioCall.time_remaining", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":182
+ *             return max(0, self._deadline - time.time())
+ * 
+ *     def cancel(self, str details):             # <<<<<<<<<<<<<<
+ *         """Cancels the RPC in Core with given RPC status.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_15cancel(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_14cancel, "Cancels the RPC in Core with given RPC status.\n\n        Above abstractions must invoke this method to set Core objects into\n        proper state.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_15cancel = {"cancel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_15cancel, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_14cancel};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_15cancel(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancel (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 182, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "cancel") < 0)) __PYX_ERR(34, 182, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_details = ((PyObject*)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("cancel", 1, 1, 1, __pyx_nargs); __PYX_ERR(34, 182, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_details), (&PyString_Type), 1, "details", 1))) __PYX_ERR(34, 182, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_14cancel(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_details);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_14cancel(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_details) {
+  PyObject *__pyx_v_details_bytes = 0;
+  char *__pyx_v_c_details;
+  grpc_call_error __pyx_v_error;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  char *__pyx_t_4;
+  grpc_status_code __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("cancel", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":188
+ *         proper state.
+ *         """
+ *         self._is_locally_cancelled = True             # <<<<<<<<<<<<<<
+ * 
+ *         cdef object details_bytes
+ */
+  __pyx_v_self->_is_locally_cancelled = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":195
+ * 
+ *         self._set_status(AioRpcStatus(
+ *             StatusCode.cancelled,             # <<<<<<<<<<<<<<
+ *             details,
+ *             None,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 195, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_cancelled); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 195, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":194
+ *         cdef grpc_call_error error
+ * 
+ *         self._set_status(AioRpcStatus(             # <<<<<<<<<<<<<<
+ *             StatusCode.cancelled,
+ *             details,
+ */
+  __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 194, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2)) __PYX_ERR(34, 194, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_details);
+  __Pyx_GIVEREF(__pyx_v_details);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_details)) __PYX_ERR(34, 194, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(34, 194, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, Py_None)) __PYX_ERR(34, 194, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 194, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_v_self->__pyx_vtab)->_set_status(__pyx_v_self, ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_t_2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 194, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":201
+ *         ))
+ * 
+ *         details_bytes = str_to_bytes(details)             # <<<<<<<<<<<<<<
+ *         self._references.append(details_bytes)
+ *         c_details = <char *>details_bytes
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc_str_to_bytes(__pyx_v_details); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_v_details_bytes = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":202
+ * 
+ *         details_bytes = str_to_bytes(details)
+ *         self._references.append(details_bytes)             # <<<<<<<<<<<<<<
+ *         c_details = <char *>details_bytes
+ *         # By implementation, grpc_call_cancel_with_status always return OK
+ */
+  if (unlikely(__pyx_v_self->_references == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(34, 202, __pyx_L1_error)
+  }
+  __pyx_t_3 = __Pyx_PyList_Append(__pyx_v_self->_references, __pyx_v_details_bytes); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(34, 202, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":203
+ *         details_bytes = str_to_bytes(details)
+ *         self._references.append(details_bytes)
+ *         c_details = <char *>details_bytes             # <<<<<<<<<<<<<<
+ *         # By implementation, grpc_call_cancel_with_status always return OK
+ *         error = grpc_call_cancel_with_status(
+ */
+  __pyx_t_4 = __Pyx_PyObject_AsWritableString(__pyx_v_details_bytes); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) __PYX_ERR(34, 203, __pyx_L1_error)
+  __pyx_v_c_details = ((char *)__pyx_t_4);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":207
+ *         error = grpc_call_cancel_with_status(
+ *             self.call,
+ *             StatusCode.cancelled,             # <<<<<<<<<<<<<<
+ *             c_details,
+ *             NULL,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 207, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_cancelled); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 207, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_5 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_t_1)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 207, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":205
+ *         c_details = <char *>details_bytes
+ *         # By implementation, grpc_call_cancel_with_status always return OK
+ *         error = grpc_call_cancel_with_status(             # <<<<<<<<<<<<<<
+ *             self.call,
+ *             StatusCode.cancelled,
+ */
+  __pyx_v_error = grpc_call_cancel_with_status(__pyx_v_self->__pyx_base.call, __pyx_t_5, __pyx_v_c_details, NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":211
+ *             NULL,
+ *         )
+ *         assert error == GRPC_CALL_OK             # <<<<<<<<<<<<<<
+ * 
+ *     def done(self):
+ */
+  #ifndef CYTHON_WITHOUT_ASSERTIONS
+  if (unlikely(__pyx_assertions_enabled())) {
+    __pyx_t_6 = (__pyx_v_error == GRPC_CALL_OK);
+    if (unlikely(!__pyx_t_6)) {
+      __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0);
+      __PYX_ERR(34, 211, __pyx_L1_error)
+    }
+  }
+  #else
+  if ((1)); else __PYX_ERR(34, 211, __pyx_L1_error)
+  #endif
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":182
+ *             return max(0, self._deadline - time.time())
+ * 
+ *     def cancel(self, str details):             # <<<<<<<<<<<<<<
+ *         """Cancels the RPC in Core with given RPC status.
+ * 
+ */
+
+  /* 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_AddTraceback("_cython.cygrpc._AioCall.cancel", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_details_bytes);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":213
+ *         assert error == GRPC_CALL_OK
+ * 
+ *     def done(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC call has finished.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_17done(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_16done, "Returns if the RPC call has finished.\n\n        Checks if the status has been provided, either\n        because the RPC finished or because was cancelled..\n\n        Returns:\n            True if the RPC can be considered finished.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_17done = {"done", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_17done, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_16done};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_17done(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("done (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("done", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "done", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_16done(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_16done(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("done", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":222
+ *             True if the RPC can be considered finished.
+ *         """
+ *         return self._status is not None             # <<<<<<<<<<<<<<
+ * 
+ *     def cancelled(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = (((PyObject *)__pyx_v_self->_status) != Py_None);
+  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 222, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":213
+ *         assert error == GRPC_CALL_OK
+ * 
+ *     def done(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC call has finished.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.done", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":224
+ *         return self._status is not None
+ * 
+ *     def cancelled(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC was cancelled.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_19cancelled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_18cancelled, "Returns if the RPC was cancelled.\n\n        Returns:\n            True if the RPC was cancelled.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_19cancelled = {"cancelled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_19cancelled, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_18cancelled};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_19cancelled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancelled (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("cancelled", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "cancelled", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_18cancelled(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_18cancelled(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  grpc_status_code __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("cancelled", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":230
+ *             True if the RPC was cancelled.
+ *         """
+ *         if not self.done():             # <<<<<<<<<<<<<<
+ *             return False
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_done); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 230, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 230, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(34, 230, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_6 = (!__pyx_t_5);
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":231
+ *         """
+ *         if not self.done():
+ *             return False             # <<<<<<<<<<<<<<
+ * 
+ *         return self._status.code() == StatusCode.cancelled
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(Py_False);
+    __pyx_r = Py_False;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":230
+ *             True if the RPC was cancelled.
+ *         """
+ *         if not self.done():             # <<<<<<<<<<<<<<
+ *             return False
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":233
+ *             return False
+ * 
+ *         return self._status.code() == StatusCode.cancelled             # <<<<<<<<<<<<<<
+ * 
+ *     async def status(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_7 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self->_status->__pyx_vtab)->code(__pyx_v_self->_status, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 233, __pyx_L1_error)
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_status_code(__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 233, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 233, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_cancelled); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 233, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 233, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":224
+ *         return self._status is not None
+ * 
+ *     def cancelled(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC was cancelled.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.cancelled", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_22generator8(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":235
+ *         return self._status.code() == StatusCode.cancelled
+ * 
+ *     async def status(self):             # <<<<<<<<<<<<<<
+ *         """Returns the status of the RPC call.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_21status(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_20status, "Returns the status of the RPC call.\n\n        It returns the finshed status of the RPC. If the RPC\n        has not finished yet this function will wait until the RPC\n        gets finished.\n\n        Returns:\n            Finished status of the RPC as an AioRpcStatus object.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_21status = {"status", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_21status, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_20status};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_21status(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("status (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("status", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "status", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_20status(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_20status(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("status", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_18_status(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 235, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_22generator8, __pyx_codeobj__59, (PyObject *) __pyx_cur_scope, __pyx_n_s_status, __pyx_n_s_AioCall_status, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 235, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.status", __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_7_cython_6cygrpc_8_AioCall_22generator8(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("status", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 235, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":245
+ *             Finished status of the RPC as an AioRpcStatus object.
+ *         """
+ *         if self._status is not None:             # <<<<<<<<<<<<<<
+ *             return self._status
+ * 
+ */
+  __pyx_t_1 = (((PyObject *)__pyx_cur_scope->__pyx_v_self->_status) != Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":246
+ *         """
+ *         if self._status is not None:
+ *             return self._status             # <<<<<<<<<<<<<<
+ * 
+ *         future = self._loop.create_future()
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(((PyObject *)__pyx_cur_scope->__pyx_v_self->_status));
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":245
+ *             Finished status of the RPC as an AioRpcStatus object.
+ *         """
+ *         if self._status is not None:             # <<<<<<<<<<<<<<
+ *             return self._status
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":248
+ *             return self._status
+ * 
+ *         future = self._loop.create_future()             # <<<<<<<<<<<<<<
+ *         self._waiters_status.append(future)
+ *         await future
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_loop, __pyx_n_s_create_future); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 248, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 248, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_future = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":249
+ * 
+ *         future = self._loop.create_future()
+ *         self._waiters_status.append(future)             # <<<<<<<<<<<<<<
+ *         await future
+ * 
+ */
+  if (unlikely(__pyx_cur_scope->__pyx_v_self->_waiters_status == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(34, 249, __pyx_L1_error)
+  }
+  __pyx_t_6 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_self->_waiters_status, __pyx_cur_scope->__pyx_v_future); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(34, 249, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":250
+ *         future = self._loop.create_future()
+ *         self._waiters_status.append(future)
+ *         await future             # <<<<<<<<<<<<<<
+ * 
+ *         return self._status
+ */
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_future);
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 250, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(34, 250, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":252
+ *         await future
+ * 
+ *         return self._status             # <<<<<<<<<<<<<<
+ * 
+ *     def is_ok(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_r = NULL; __Pyx_ReturnWithStopIteration(((PyObject *)__pyx_cur_scope->__pyx_v_self->_status));
+  goto __pyx_L0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":235
+ *         return self._status.code() == StatusCode.cancelled
+ * 
+ *     async def status(self):             # <<<<<<<<<<<<<<
+ *         """Returns the status of the RPC call.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("status", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":254
+ *         return self._status
+ * 
+ *     def is_ok(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC is ended with ok."""
+ *         return self.done() and self._status.code() == StatusCode.ok
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_24is_ok(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_23is_ok, "Returns if the RPC is ended with ok.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_24is_ok = {"is_ok", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_24is_ok, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_23is_ok};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_24is_ok(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_ok (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("is_ok", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_ok", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_23is_ok(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_23is_ok(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  grpc_status_code __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("is_ok", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":256
+ *     def is_ok(self):
+ *         """Returns if the RPC is ended with ok."""
+ *         return self.done() and self._status.code() == StatusCode.ok             # <<<<<<<<<<<<<<
+ * 
+ *     async def initial_metadata(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_done); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 256, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 256, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(34, 256, __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_L3_bool_binop_done;
+  }
+  __pyx_t_7 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus *)__pyx_v_self->_status->__pyx_vtab)->code(__pyx_v_self->_status, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 256, __pyx_L1_error)
+  __pyx_t_2 = __Pyx_PyInt_From_grpc_status_code(__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 256, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 256, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ok); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 256, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 256, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_1 = __pyx_t_3;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_L3_bool_binop_done:;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":254
+ *         return self._status
+ * 
+ *     def is_ok(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC is ended with ok."""
+ *         return self.done() and self._status.code() == StatusCode.ok
+ */
+
+  /* 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("_cython.cygrpc._AioCall.is_ok", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_27generator9(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":258
+ *         return self.done() and self._status.code() == StatusCode.ok
+ * 
+ *     async def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *         """Returns the initial metadata of the RPC call.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_26initial_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_25initial_metadata, "Returns the initial metadata of the RPC call.\n\n        If the initial metadata has not been received yet this function will\n        wait until the RPC gets finished.\n\n        Returns:\n            The tuple object with the initial metadata.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_26initial_metadata = {"initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_26initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_25initial_metadata};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_26initial_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("initial_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("initial_metadata", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "initial_metadata", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_25initial_metadata(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_25initial_metadata(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("initial_metadata", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 258, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_27generator9, __pyx_codeobj__60, (PyObject *) __pyx_cur_scope, __pyx_n_s_initial_metadata, __pyx_n_s_AioCall_initial_metadata, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 258, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.initial_metadata", __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_7_cython_6cygrpc_8_AioCall_27generator9(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("initial_metadata", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 258, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":267
+ *             The tuple object with the initial metadata.
+ *         """
+ *         if self._initial_metadata is not None:             # <<<<<<<<<<<<<<
+ *             return self._initial_metadata
+ * 
+ */
+  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_self->_initial_metadata != ((PyObject*)Py_None));
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":268
+ *         """
+ *         if self._initial_metadata is not None:
+ *             return self._initial_metadata             # <<<<<<<<<<<<<<
+ * 
+ *         future = self._loop.create_future()
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_cur_scope->__pyx_v_self->_initial_metadata);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":267
+ *             The tuple object with the initial metadata.
+ *         """
+ *         if self._initial_metadata is not None:             # <<<<<<<<<<<<<<
+ *             return self._initial_metadata
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":270
+ *             return self._initial_metadata
+ * 
+ *         future = self._loop.create_future()             # <<<<<<<<<<<<<<
+ *         self._waiters_initial_metadata.append(future)
+ *         await future
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_loop, __pyx_n_s_create_future); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 270, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 270, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_future = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":271
+ * 
+ *         future = self._loop.create_future()
+ *         self._waiters_initial_metadata.append(future)             # <<<<<<<<<<<<<<
+ *         await future
+ * 
+ */
+  if (unlikely(__pyx_cur_scope->__pyx_v_self->_waiters_initial_metadata == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(34, 271, __pyx_L1_error)
+  }
+  __pyx_t_6 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_self->_waiters_initial_metadata, __pyx_cur_scope->__pyx_v_future); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(34, 271, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":272
+ *         future = self._loop.create_future()
+ *         self._waiters_initial_metadata.append(future)
+ *         await future             # <<<<<<<<<<<<<<
+ * 
+ *         return self._initial_metadata
+ */
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_future);
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 272, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(34, 272, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":274
+ *         await future
+ * 
+ *         return self._initial_metadata             # <<<<<<<<<<<<<<
+ * 
+ *     def is_locally_cancelled(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_cur_scope->__pyx_v_self->_initial_metadata);
+  goto __pyx_L0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":258
+ *         return self.done() and self._status.code() == StatusCode.ok
+ * 
+ *     async def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *         """Returns the initial metadata of the RPC call.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":276
+ *         return self._initial_metadata
+ * 
+ *     def is_locally_cancelled(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC was cancelled locally.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_29is_locally_cancelled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_28is_locally_cancelled, "Returns if the RPC was cancelled locally.\n\n        Returns:\n            True when was cancelled locally, False when was cancelled remotelly or\n            is still ongoing.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_29is_locally_cancelled = {"is_locally_cancelled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_29is_locally_cancelled, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_28is_locally_cancelled};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_29is_locally_cancelled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_locally_cancelled (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("is_locally_cancelled", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_locally_cancelled", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_28is_locally_cancelled(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_28is_locally_cancelled(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_locally_cancelled", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":283
+ *             is still ongoing.
+ *         """
+ *         if self._is_locally_cancelled:             # <<<<<<<<<<<<<<
+ *             return True
+ * 
+ */
+  if (__pyx_v_self->_is_locally_cancelled) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":284
+ *         """
+ *         if self._is_locally_cancelled:
+ *             return True             # <<<<<<<<<<<<<<
+ * 
+ *         return False
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(Py_True);
+    __pyx_r = Py_True;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":283
+ *             is still ongoing.
+ *         """
+ *         if self._is_locally_cancelled:             # <<<<<<<<<<<<<<
+ *             return True
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":286
+ *             return True
+ * 
+ *         return False             # <<<<<<<<<<<<<<
+ * 
+ *     def set_internal_error(self, str error_str):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(Py_False);
+  __pyx_r = Py_False;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":276
+ *         return self._initial_metadata
+ * 
+ *     def is_locally_cancelled(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC was cancelled locally.
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":288
+ *         return False
+ * 
+ *     def set_internal_error(self, str error_str):             # <<<<<<<<<<<<<<
+ *         self._set_status(AioRpcStatus(
+ *             StatusCode.internal,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_31set_internal_error(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_31set_internal_error = {"set_internal_error", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_31set_internal_error, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_31set_internal_error(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_error_str = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_internal_error (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_error_str,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_error_str)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 288, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_internal_error") < 0)) __PYX_ERR(34, 288, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_error_str = ((PyObject*)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_internal_error", 1, 1, 1, __pyx_nargs); __PYX_ERR(34, 288, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.set_internal_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_error_str), (&PyString_Type), 1, "error_str", 1))) __PYX_ERR(34, 288, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_30set_internal_error(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_error_str);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_30set_internal_error(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_error_str) {
+  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("set_internal_error", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":290
+ *     def set_internal_error(self, str error_str):
+ *         self._set_status(AioRpcStatus(
+ *             StatusCode.internal,             # <<<<<<<<<<<<<<
+ *             'Internal error from Core',
+ *             (),
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 290, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_internal); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 290, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":289
+ * 
+ *     def set_internal_error(self, str error_str):
+ *         self._set_status(AioRpcStatus(             # <<<<<<<<<<<<<<
+ *             StatusCode.internal,
+ *             'Internal error from Core',
+ */
+  __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 289, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2)) __PYX_ERR(34, 289, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_kp_s_Internal_error_from_Core);
+  __Pyx_GIVEREF(__pyx_kp_s_Internal_error_from_Core);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_kp_s_Internal_error_from_Core)) __PYX_ERR(34, 289, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_empty_tuple);
+  __Pyx_GIVEREF(__pyx_empty_tuple);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_empty_tuple)) __PYX_ERR(34, 289, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_error_str);
+  __Pyx_GIVEREF(__pyx_v_error_str);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_error_str)) __PYX_ERR(34, 289, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 289, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_v_self->__pyx_vtab)->_set_status(__pyx_v_self, ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_t_2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 289, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":288
+ *         return False
+ * 
+ *     def set_internal_error(self, str error_str):             # <<<<<<<<<<<<<<
+ *         self._set_status(AioRpcStatus(
+ *             StatusCode.internal,
+ */
+
+  /* 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_AddTraceback("_cython.cygrpc._AioCall.set_internal_error", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_34generator10(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":296
+ *         ))
+ * 
+ *     async def unary_unary(self,             # <<<<<<<<<<<<<<
+ *                           bytes request,
+ *                           tuple outbound_initial_metadata,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_33unary_unary(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_32unary_unary, "Performs a unary unary RPC.\n\n        Args:\n          request: the serialized requests in bytes.\n          outbound_initial_metadata: optional outbound metadata.\n          context: instrumentation context.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_33unary_unary = {"unary_unary", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_33unary_unary, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_32unary_unary};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_33unary_unary(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_request = 0;
+  PyObject *__pyx_v_outbound_initial_metadata = 0;
+  PyObject *__pyx_v_context = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("unary_unary (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_request,&__pyx_n_s_outbound_initial_metadata,&__pyx_n_s_context,0};
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":299
+ *                           bytes request,
+ *                           tuple outbound_initial_metadata,
+ *                           object context = None):             # <<<<<<<<<<<<<<
+ *         """Performs a unary unary RPC.
+ * 
+ */
+    values[2] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_request)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 296, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_outbound_initial_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 296, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("unary_unary", 0, 2, 3, 1); __PYX_ERR(34, 296, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context);
+          if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 296, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "unary_unary") < 0)) __PYX_ERR(34, 296, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_request = ((PyObject*)values[0]);
+    __pyx_v_outbound_initial_metadata = ((PyObject*)values[1]);
+    __pyx_v_context = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("unary_unary", 0, 2, 3, __pyx_nargs); __PYX_ERR(34, 296, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.unary_unary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_request), (&PyBytes_Type), 1, "request", 1))) __PYX_ERR(34, 297, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_outbound_initial_metadata), (&PyTuple_Type), 1, "outbound_initial_metadata", 1))) __PYX_ERR(34, 298, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_32unary_unary(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_request, __pyx_v_outbound_initial_metadata, __pyx_v_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":296
+ *         ))
+ * 
+ *     async def unary_unary(self,             # <<<<<<<<<<<<<<
+ *                           bytes request,
+ *                           tuple outbound_initial_metadata,
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_32unary_unary(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_request, PyObject *__pyx_v_outbound_initial_metadata, PyObject *__pyx_v_context) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("unary_unary", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 296, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_request = __pyx_v_request;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_request);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_request);
+  __pyx_cur_scope->__pyx_v_outbound_initial_metadata = __pyx_v_outbound_initial_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __pyx_cur_scope->__pyx_v_context = __pyx_v_context;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_context);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_context);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_34generator10, __pyx_codeobj__61, (PyObject *) __pyx_cur_scope, __pyx_n_s_unary_unary, __pyx_n_s_AioCall_unary_unary, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 296, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.unary_unary", __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_7_cython_6cygrpc_8_AioCall_34generator10(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  grpc_status_code __pyx_t_6;
+  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_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("unary_unary", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 296, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":311
+ *         cdef SendInitialMetadataOperation initial_metadata_op = SendInitialMetadataOperation(
+ *             outbound_initial_metadata,
+ *             self._send_initial_metadata_flags)             # <<<<<<<<<<<<<<
+ *         cdef SendMessageOperation send_message_op = SendMessageOperation(request, _EMPTY_FLAGS)
+ *         cdef SendCloseFromClientOperation send_close_op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->_send_initial_metadata_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":309
+ *         cdef tuple ops
+ * 
+ *         cdef SendInitialMetadataOperation initial_metadata_op = SendInitialMetadataOperation(             # <<<<<<<<<<<<<<
+ *             outbound_initial_metadata,
+ *             self._send_initial_metadata_flags)
+ */
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 309, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_outbound_initial_metadata)) __PYX_ERR(34, 309, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(34, 309, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 309, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_initial_metadata_op = ((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":312
+ *             outbound_initial_metadata,
+ *             self._send_initial_metadata_flags)
+ *         cdef SendMessageOperation send_message_op = SendMessageOperation(request, _EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *         cdef SendCloseFromClientOperation send_close_op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveInitialMetadataOperation receive_initial_metadata_op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_request);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_request);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_request)) __PYX_ERR(34, 312, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(34, 312, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendMessageOperation), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_send_message_op = ((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":313
+ *             self._send_initial_metadata_flags)
+ *         cdef SendMessageOperation send_message_op = SendMessageOperation(request, _EMPTY_FLAGS)
+ *         cdef SendCloseFromClientOperation send_close_op = SendCloseFromClientOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *         cdef ReceiveInitialMetadataOperation receive_initial_metadata_op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveMessageOperation receive_message_op = ReceiveMessageOperation(_EMPTY_FLAGS)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 313, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 313, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_send_close_op = ((struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":314
+ *         cdef SendMessageOperation send_message_op = SendMessageOperation(request, _EMPTY_FLAGS)
+ *         cdef SendCloseFromClientOperation send_close_op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveInitialMetadataOperation receive_initial_metadata_op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *         cdef ReceiveMessageOperation receive_message_op = ReceiveMessageOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 314, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation), __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 314, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_receive_initial_metadata_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":315
+ *         cdef SendCloseFromClientOperation send_close_op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveInitialMetadataOperation receive_initial_metadata_op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveMessageOperation receive_message_op = ReceiveMessageOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 315, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 315, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_receive_message_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":316
+ *         cdef ReceiveInitialMetadataOperation receive_initial_metadata_op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveMessageOperation receive_message_op = ReceiveMessageOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ * 
+ *         if context is not None:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 316, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation), __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 316, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_receive_status_on_client_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":318
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ * 
+ *         if context is not None:             # <<<<<<<<<<<<<<
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         ops = (initial_metadata_op, send_message_op, send_close_op,
+ */
+  __pyx_t_3 = (__pyx_cur_scope->__pyx_v_context != Py_None);
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":319
+ * 
+ *         if context is not None:
+ *             set_instrumentation_context_on_call_aio(self, context)             # <<<<<<<<<<<<<<
+ *         ops = (initial_metadata_op, send_message_op, send_close_op,
+ *                receive_initial_metadata_op, receive_message_op,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_set_instrumentation_context_on_c); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 319, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_4, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_context};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 319, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":318
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ * 
+ *         if context is not None:             # <<<<<<<<<<<<<<
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         ops = (initial_metadata_op, send_message_op, send_close_op,
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":320
+ *         if context is not None:
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         ops = (initial_metadata_op, send_message_op, send_close_op,             # <<<<<<<<<<<<<<
+ *                receive_initial_metadata_op, receive_message_op,
+ *                receive_status_on_client_op)
+ */
+  __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 320, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_initial_metadata_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_initial_metadata_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_initial_metadata_op))) __PYX_ERR(34, 320, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_send_message_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_send_message_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_cur_scope->__pyx_v_send_message_op))) __PYX_ERR(34, 320, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_send_close_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_send_close_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_cur_scope->__pyx_v_send_close_op))) __PYX_ERR(34, 320, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_initial_metadata_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_initial_metadata_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, ((PyObject *)__pyx_cur_scope->__pyx_v_receive_initial_metadata_op))) __PYX_ERR(34, 320, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_message_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_message_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 4, ((PyObject *)__pyx_cur_scope->__pyx_v_receive_message_op))) __PYX_ERR(34, 320, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 5, ((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op))) __PYX_ERR(34, 320, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":326
+ *         # Executes all operations in one batch.
+ *         # Might raise CancelledError, handling it in Python UnaryUnaryCall.
+ *         await execute_batch(self,             # <<<<<<<<<<<<<<
+ *                             ops,
+ *                             self._loop)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":328
+ *         await execute_batch(self,
+ *                             ops,
+ *                             self._loop)             # <<<<<<<<<<<<<<
+ * 
+ *         self._set_initial_metadata(receive_initial_metadata_op.initial_metadata())
+ */
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_4, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_self->_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 326, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 326, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(34, 326, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":330
+ *                             self._loop)
+ * 
+ *         self._set_initial_metadata(receive_initial_metadata_op.initial_metadata())             # <<<<<<<<<<<<<<
+ * 
+ *         cdef grpc_status_code code
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_initial_metadata_op), __pyx_n_s_initial_metadata); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 330, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 330, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(34, 330, __pyx_L1_error)
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->_set_initial_metadata(__pyx_cur_scope->__pyx_v_self, ((PyObject*)__pyx_t_1)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 330, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":333
+ * 
+ *         cdef grpc_status_code code
+ *         code = receive_status_on_client_op.code()             # <<<<<<<<<<<<<<
+ * 
+ *         self._set_status(AioRpcStatus(
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op), __pyx_n_s_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 333, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 333, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_6 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_t_1)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 333, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_cur_scope->__pyx_v_code = __pyx_t_6;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":336
+ * 
+ *         self._set_status(AioRpcStatus(
+ *             code,             # <<<<<<<<<<<<<<
+ *             receive_status_on_client_op.details(),
+ *             receive_status_on_client_op.trailing_metadata(),
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 336, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":337
+ *         self._set_status(AioRpcStatus(
+ *             code,
+ *             receive_status_on_client_op.details(),             # <<<<<<<<<<<<<<
+ *             receive_status_on_client_op.trailing_metadata(),
+ *             receive_status_on_client_op.error_string(),
+ */
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op), __pyx_n_s_details); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 337, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_7 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_4))) {
+    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
+    if (likely(__pyx_t_7)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_7);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_4, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 337, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":338
+ *             code,
+ *             receive_status_on_client_op.details(),
+ *             receive_status_on_client_op.trailing_metadata(),             # <<<<<<<<<<<<<<
+ *             receive_status_on_client_op.error_string(),
+ *         ))
+ */
+  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op), __pyx_n_s_trailing_metadata); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 338, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_8 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_7))) {
+    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
+    if (likely(__pyx_t_8)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+      __Pyx_INCREF(__pyx_t_8);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_7, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_8, NULL};
+    __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+    if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 338, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":339
+ *             receive_status_on_client_op.details(),
+ *             receive_status_on_client_op.trailing_metadata(),
+ *             receive_status_on_client_op.error_string(),             # <<<<<<<<<<<<<<
+ *         ))
+ * 
+ */
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op), __pyx_n_s_error_string); if (unlikely(!__pyx_t_8)) __PYX_ERR(34, 339, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_8))) {
+    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8);
+    if (likely(__pyx_t_9)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
+      __Pyx_INCREF(__pyx_t_9);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_8, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_9, NULL};
+    __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+    if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 339, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":335
+ *         code = receive_status_on_client_op.code()
+ * 
+ *         self._set_status(AioRpcStatus(             # <<<<<<<<<<<<<<
+ *             code,
+ *             receive_status_on_client_op.details(),
+ */
+  __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(34, 335, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1)) __PYX_ERR(34, 335, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2)) __PYX_ERR(34, 335, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_4);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4)) __PYX_ERR(34, 335, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_7);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_7)) __PYX_ERR(34, 335, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_4 = 0;
+  __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 335, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->_set_status(__pyx_cur_scope->__pyx_v_self, ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_t_7)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 335, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":342
+ *         ))
+ * 
+ *         if code == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *             return receive_message_op.message()
+ *         else:
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_code); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 342, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_8)) __PYX_ERR(34, 342, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_ok); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 342, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_RichCompare(__pyx_t_7, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) __PYX_ERR(34, 342, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(34, 342, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":343
+ * 
+ *         if code == StatusCode.ok:
+ *             return receive_message_op.message()             # <<<<<<<<<<<<<<
+ *         else:
+ *             return None
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_message_op), __pyx_n_s_message); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 343, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_7 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_7)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_7);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
+      __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (unlikely(!__pyx_t_8)) __PYX_ERR(34, 343, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":342
+ *         ))
+ * 
+ *         if code == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *             return receive_message_op.message()
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":345
+ *             return receive_message_op.message()
+ *         else:
+ *             return None             # <<<<<<<<<<<<<<
+ * 
+ *     async def _handle_status_once_received(self):
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":296
+ *         ))
+ * 
+ *     async def unary_unary(self,             # <<<<<<<<<<<<<<
+ *                           bytes request,
+ *                           tuple outbound_initial_metadata,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("unary_unary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_37generator11(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":347
+ *             return None
+ * 
+ *     async def _handle_status_once_received(self):             # <<<<<<<<<<<<<<
+ *         """Handles the status sent by peer once received."""
+ *         cdef ReceiveStatusOnClientOperation op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_36_handle_status_once_received(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_35_handle_status_once_received, "Handles the status sent by peer once received.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_36_handle_status_once_received = {"_handle_status_once_received", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_36_handle_status_once_received, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_35_handle_status_once_received};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_36_handle_status_once_received(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_status_once_received (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("_handle_status_once_received", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_handle_status_once_received", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_35_handle_status_once_received(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_35_handle_status_once_received(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_status_once_received", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 347, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_37generator11, __pyx_codeobj__62, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_status_once_received, __pyx_n_s_AioCall__handle_status_once_rec, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 347, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall._handle_status_once_received", __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_7_cython_6cygrpc_8_AioCall_37generator11(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_status_once_received", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 347, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":349
+ *     async def _handle_status_once_received(self):
+ *         """Handles the status sent by peer once received."""
+ *         cdef ReceiveStatusOnClientOperation op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *         cdef tuple ops = (op,)
+ *         await execute_batch(self, ops, self._loop)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 349, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 349, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":350
+ *         """Handles the status sent by peer once received."""
+ *         cdef ReceiveStatusOnClientOperation op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ *         cdef tuple ops = (op,)             # <<<<<<<<<<<<<<
+ *         await execute_batch(self, ops, self._loop)
+ * 
+ */
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 350, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_op))) __PYX_ERR(34, 350, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":351
+ *         cdef ReceiveStatusOnClientOperation op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ *         cdef tuple ops = (op,)
+ *         await execute_batch(self, ops, self._loop)             # <<<<<<<<<<<<<<
+ * 
+ *         # Halts if the RPC is locally cancelled
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 351, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_self->_loop};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 351, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 351, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(34, 351, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":354
+ * 
+ *         # Halts if the RPC is locally cancelled
+ *         if self._is_locally_cancelled:             # <<<<<<<<<<<<<<
+ *             return
+ * 
+ */
+  if (__pyx_cur_scope->__pyx_v_self->_is_locally_cancelled) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":355
+ *         # Halts if the RPC is locally cancelled
+ *         if self._is_locally_cancelled:
+ *             return             # <<<<<<<<<<<<<<
+ * 
+ *         self._set_status(AioRpcStatus(
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":354
+ * 
+ *         # Halts if the RPC is locally cancelled
+ *         if self._is_locally_cancelled:             # <<<<<<<<<<<<<<
+ *             return
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":358
+ * 
+ *         self._set_status(AioRpcStatus(
+ *             op.code(),             # <<<<<<<<<<<<<<
+ *             op.details(),
+ *             op.trailing_metadata(),
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_op), __pyx_n_s_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 358, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":359
+ *         self._set_status(AioRpcStatus(
+ *             op.code(),
+ *             op.details(),             # <<<<<<<<<<<<<<
+ *             op.trailing_metadata(),
+ *             op.error_string(),
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_op), __pyx_n_s_details); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_5 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 359, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":360
+ *             op.code(),
+ *             op.details(),
+ *             op.trailing_metadata(),             # <<<<<<<<<<<<<<
+ *             op.error_string(),
+ *         ))
+ */
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_op), __pyx_n_s_trailing_metadata); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 360, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 360, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":361
+ *             op.details(),
+ *             op.trailing_metadata(),
+ *             op.error_string(),             # <<<<<<<<<<<<<<
+ *         ))
+ * 
+ */
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_op), __pyx_n_s_error_string); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
+    __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 361, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":357
+ *             return
+ * 
+ *         self._set_status(AioRpcStatus(             # <<<<<<<<<<<<<<
+ *             op.code(),
+ *             op.details(),
+ */
+  __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(34, 357, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1)) __PYX_ERR(34, 357, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_3);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_3)) __PYX_ERR(34, 357, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_5);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_t_5)) __PYX_ERR(34, 357, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_1 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->_set_status(__pyx_cur_scope->__pyx_v_self, ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_t_5)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 357, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":347
+ *             return None
+ * 
+ *     async def _handle_status_once_received(self):             # <<<<<<<<<<<<<<
+ *         """Handles the status sent by peer once received."""
+ *         cdef ReceiveStatusOnClientOperation op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_handle_status_once_received", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_40generator12(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":364
+ *         ))
+ * 
+ *     async def receive_serialized_message(self):             # <<<<<<<<<<<<<<
+ *         """Receives one single raw message in bytes."""
+ *         cdef bytes received_message
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_39receive_serialized_message(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_38receive_serialized_message, "Receives one single raw message in bytes.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_39receive_serialized_message = {"receive_serialized_message", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_39receive_serialized_message, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_38receive_serialized_message};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_39receive_serialized_message(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("receive_serialized_message (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("receive_serialized_message", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "receive_serialized_message", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_38receive_serialized_message(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_38receive_serialized_message(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("receive_serialized_message", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 364, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_40generator12, __pyx_codeobj__63, (PyObject *) __pyx_cur_scope, __pyx_n_s_receive_serialized_message, __pyx_n_s_AioCall_receive_serialized_mess, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 364, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.receive_serialized_message", __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_7_cython_6cygrpc_8_AioCall_40generator12(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("receive_serialized_message", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 364, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":372
+ *         # * The client application cancels;
+ *         # * The server sends final status.
+ *         received_message = await _receive_message(             # <<<<<<<<<<<<<<
+ *             self,
+ *             self._loop
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_receive_message); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 372, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":374
+ *         received_message = await _receive_message(
+ *             self,
+ *             self._loop             # <<<<<<<<<<<<<<
+ *         )
+ *         if received_message is not None:
+ */
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_self->_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 372, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 372, __pyx_L1_error)
+    __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+  } else {
+    __pyx_t_1 = NULL;
+    if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(34, 372, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":372
+ *         # * The client application cancels;
+ *         # * The server sends final status.
+ *         received_message = await _receive_message(             # <<<<<<<<<<<<<<
+ *             self,
+ *             self._loop
+ */
+  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_1))) __PYX_ERR(34, 372, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_received_message = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":376
+ *             self._loop
+ *         )
+ *         if received_message is not None:             # <<<<<<<<<<<<<<
+ *             return received_message
+ *         else:
+ */
+  __pyx_t_5 = (__pyx_cur_scope->__pyx_v_received_message != ((PyObject*)Py_None));
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":377
+ *         )
+ *         if received_message is not None:
+ *             return received_message             # <<<<<<<<<<<<<<
+ *         else:
+ *             return EOF
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_cur_scope->__pyx_v_received_message);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":376
+ *             self._loop
+ *         )
+ *         if received_message is not None:             # <<<<<<<<<<<<<<
+ *             return received_message
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":379
+ *             return received_message
+ *         else:
+ *             return EOF             # <<<<<<<<<<<<<<
+ * 
+ *     async def send_serialized_message(self, bytes message):
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EOF); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 379, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L0;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":364
+ *         ))
+ * 
+ *     async def receive_serialized_message(self):             # <<<<<<<<<<<<<<
+ *         """Receives one single raw message in bytes."""
+ *         cdef bytes received_message
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("receive_serialized_message", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_43generator13(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":381
+ *             return EOF
+ * 
+ *     async def send_serialized_message(self, bytes message):             # <<<<<<<<<<<<<<
+ *         """Sends one single raw message in bytes."""
+ *         await _send_message(self,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_42send_serialized_message(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_41send_serialized_message, "Sends one single raw message in bytes.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_42send_serialized_message = {"send_serialized_message", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_42send_serialized_message, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_41send_serialized_message};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_42send_serialized_message(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_message = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("send_serialized_message (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_message,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_message)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 381, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "send_serialized_message") < 0)) __PYX_ERR(34, 381, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_message = ((PyObject*)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("send_serialized_message", 1, 1, 1, __pyx_nargs); __PYX_ERR(34, 381, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.send_serialized_message", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_message), (&PyBytes_Type), 1, "message", 1))) __PYX_ERR(34, 381, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_41send_serialized_message(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_message);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_41send_serialized_message(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_message) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("send_serialized_message", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 381, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_message = __pyx_v_message;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_message);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_message);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_43generator13, __pyx_codeobj__64, (PyObject *) __pyx_cur_scope, __pyx_n_s_send_serialized_message, __pyx_n_s_AioCall_send_serialized_message, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 381, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.send_serialized_message", __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_7_cython_6cygrpc_8_AioCall_43generator13(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  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_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("send_serialized_message", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 381, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":383
+ *     async def send_serialized_message(self, bytes message):
+ *         """Sends one single raw message in bytes."""
+ *         await _send_message(self,             # <<<<<<<<<<<<<<
+ *                             message,
+ *                             None,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_send_message); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 383, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":387
+ *                             None,
+ *                             False,
+ *                             self._loop)             # <<<<<<<<<<<<<<
+ * 
+ *     async def send_receive_close(self):
+ */
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[6] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_message, Py_None, Py_False, __pyx_cur_scope->__pyx_v_self->_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 5+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 383, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 383, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(34, 383, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":381
+ *             return EOF
+ * 
+ *     async def send_serialized_message(self, bytes message):             # <<<<<<<<<<<<<<
+ *         """Sends one single raw message in bytes."""
+ *         await _send_message(self,
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("send_serialized_message", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_46generator14(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":389
+ *                             self._loop)
+ * 
+ *     async def send_receive_close(self):             # <<<<<<<<<<<<<<
+ *         """Half close the RPC on the client-side."""
+ *         cdef SendCloseFromClientOperation op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_45send_receive_close(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_44send_receive_close, "Half close the RPC on the client-side.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_45send_receive_close = {"send_receive_close", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_45send_receive_close, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_44send_receive_close};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_45send_receive_close(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("send_receive_close (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("send_receive_close", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "send_receive_close", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_44send_receive_close(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_44send_receive_close(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("send_receive_close", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 389, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_46generator14, __pyx_codeobj__65, (PyObject *) __pyx_cur_scope, __pyx_n_s_send_receive_close, __pyx_n_s_AioCall_send_receive_close, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 389, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.send_receive_close", __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_7_cython_6cygrpc_8_AioCall_46generator14(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  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_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("send_receive_close", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 389, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":391
+ *     async def send_receive_close(self):
+ *         """Half close the RPC on the client-side."""
+ *         cdef SendCloseFromClientOperation op = SendCloseFromClientOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *         cdef tuple ops = (op,)
+ *         await execute_batch(self, ops, self._loop)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 391, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 391, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":392
+ *         """Half close the RPC on the client-side."""
+ *         cdef SendCloseFromClientOperation op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ *         cdef tuple ops = (op,)             # <<<<<<<<<<<<<<
+ *         await execute_batch(self, ops, self._loop)
+ * 
+ */
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 392, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_op))) __PYX_ERR(34, 392, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":393
+ *         cdef SendCloseFromClientOperation op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ *         cdef tuple ops = (op,)
+ *         await execute_batch(self, ops, self._loop)             # <<<<<<<<<<<<<<
+ * 
+ *     async def initiate_unary_stream(self,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 393, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_self->_loop};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 393, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 393, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(34, 393, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":389
+ *                             self._loop)
+ * 
+ *     async def send_receive_close(self):             # <<<<<<<<<<<<<<
+ *         """Half close the RPC on the client-side."""
+ *         cdef SendCloseFromClientOperation op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("send_receive_close", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_49generator15(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":395
+ *         await execute_batch(self, ops, self._loop)
+ * 
+ *     async def initiate_unary_stream(self,             # <<<<<<<<<<<<<<
+ *                            bytes request,
+ *                            tuple outbound_initial_metadata,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_48initiate_unary_stream(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_47initiate_unary_stream, "Implementation of the start of a unary-stream call.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_48initiate_unary_stream = {"initiate_unary_stream", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_48initiate_unary_stream, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_47initiate_unary_stream};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_48initiate_unary_stream(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_request = 0;
+  PyObject *__pyx_v_outbound_initial_metadata = 0;
+  PyObject *__pyx_v_context = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("initiate_unary_stream (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_request,&__pyx_n_s_outbound_initial_metadata,&__pyx_n_s_context,0};
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":398
+ *                            bytes request,
+ *                            tuple outbound_initial_metadata,
+ *                            object context = None):             # <<<<<<<<<<<<<<
+ *         """Implementation of the start of a unary-stream call."""
+ *         # Peer may prematurely end this RPC at any point. We need a corutine
+ */
+    values[2] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_request)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 395, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_outbound_initial_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 395, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("initiate_unary_stream", 0, 2, 3, 1); __PYX_ERR(34, 395, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context);
+          if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 395, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "initiate_unary_stream") < 0)) __PYX_ERR(34, 395, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_request = ((PyObject*)values[0]);
+    __pyx_v_outbound_initial_metadata = ((PyObject*)values[1]);
+    __pyx_v_context = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("initiate_unary_stream", 0, 2, 3, __pyx_nargs); __PYX_ERR(34, 395, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.initiate_unary_stream", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_request), (&PyBytes_Type), 1, "request", 1))) __PYX_ERR(34, 396, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_outbound_initial_metadata), (&PyTuple_Type), 1, "outbound_initial_metadata", 1))) __PYX_ERR(34, 397, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_47initiate_unary_stream(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_request, __pyx_v_outbound_initial_metadata, __pyx_v_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":395
+ *         await execute_batch(self, ops, self._loop)
+ * 
+ *     async def initiate_unary_stream(self,             # <<<<<<<<<<<<<<
+ *                            bytes request,
+ *                            tuple outbound_initial_metadata,
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_47initiate_unary_stream(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_request, PyObject *__pyx_v_outbound_initial_metadata, PyObject *__pyx_v_context) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("initiate_unary_stream", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 395, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_request = __pyx_v_request;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_request);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_request);
+  __pyx_cur_scope->__pyx_v_outbound_initial_metadata = __pyx_v_outbound_initial_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __pyx_cur_scope->__pyx_v_context = __pyx_v_context;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_context);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_context);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_49generator15, __pyx_codeobj__66, (PyObject *) __pyx_cur_scope, __pyx_n_s_initiate_unary_stream, __pyx_n_s_AioCall_initiate_unary_stream, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 395, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.initiate_unary_stream", __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_7_cython_6cygrpc_8_AioCall_49generator15(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  unsigned int __pyx_t_6;
+  int __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  int __pyx_t_12;
+  char const *__pyx_t_13;
+  PyObject *__pyx_t_14 = NULL;
+  PyObject *__pyx_t_15 = NULL;
+  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_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("initiate_unary_stream", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L11_resume_from_await;
+    case 2: goto __pyx_L12_resume_from_await;
+    case 3: goto __pyx_L20_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 395, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":402
+ *         # Peer may prematurely end this RPC at any point. We need a corutine
+ *         # that watches if the server sends the final status.
+ *         status_task = self._loop.create_task(self._handle_status_once_received())             # <<<<<<<<<<<<<<
+ * 
+ *         cdef tuple outbound_ops
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_loop, __pyx_n_s_create_task); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 402, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_handle_status_once_received); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 402, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 402, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __pyx_t_4 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 402, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_status_task = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":407
+ *         cdef Operation initial_metadata_op = SendInitialMetadataOperation(
+ *             outbound_initial_metadata,
+ *             self._send_initial_metadata_flags)             # <<<<<<<<<<<<<<
+ *         cdef Operation send_message_op = SendMessageOperation(
+ *             request,
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->_send_initial_metadata_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":405
+ * 
+ *         cdef tuple outbound_ops
+ *         cdef Operation initial_metadata_op = SendInitialMetadataOperation(             # <<<<<<<<<<<<<<
+ *             outbound_initial_metadata,
+ *             self._send_initial_metadata_flags)
+ */
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 405, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_outbound_initial_metadata)) __PYX_ERR(34, 405, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(34, 405, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 405, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_initial_metadata_op = ((struct __pyx_obj_7_cython_6cygrpc_Operation *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":410
+ *         cdef Operation send_message_op = SendMessageOperation(
+ *             request,
+ *             _EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *         cdef Operation send_close_op = SendCloseFromClientOperation(
+ *             _EMPTY_FLAGS)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 410, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":408
+ *             outbound_initial_metadata,
+ *             self._send_initial_metadata_flags)
+ *         cdef Operation send_message_op = SendMessageOperation(             # <<<<<<<<<<<<<<
+ *             request,
+ *             _EMPTY_FLAGS)
+ */
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 408, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_request);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_request);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_request)) __PYX_ERR(34, 408, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(34, 408, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendMessageOperation), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 408, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_send_message_op = ((struct __pyx_obj_7_cython_6cygrpc_Operation *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":412
+ *             _EMPTY_FLAGS)
+ *         cdef Operation send_close_op = SendCloseFromClientOperation(
+ *             _EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ * 
+ *         if context is not None:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 412, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":411
+ *             request,
+ *             _EMPTY_FLAGS)
+ *         cdef Operation send_close_op = SendCloseFromClientOperation(             # <<<<<<<<<<<<<<
+ *             _EMPTY_FLAGS)
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 411, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_send_close_op = ((struct __pyx_obj_7_cython_6cygrpc_Operation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":414
+ *             _EMPTY_FLAGS)
+ * 
+ *         if context is not None:             # <<<<<<<<<<<<<<
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         outbound_ops = (
+ */
+  __pyx_t_7 = (__pyx_cur_scope->__pyx_v_context != Py_None);
+  if (__pyx_t_7) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":415
+ * 
+ *         if context is not None:
+ *             set_instrumentation_context_on_call_aio(self, context)             # <<<<<<<<<<<<<<
+ *         outbound_ops = (
+ *             initial_metadata_op,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_set_instrumentation_context_on_c); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 415, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_context};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 415, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":414
+ *             _EMPTY_FLAGS)
+ * 
+ *         if context is not None:             # <<<<<<<<<<<<<<
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         outbound_ops = (
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":417
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         outbound_ops = (
+ *             initial_metadata_op,             # <<<<<<<<<<<<<<
+ *             send_message_op,
+ *             send_close_op,
+ */
+  __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 417, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_initial_metadata_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_initial_metadata_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_initial_metadata_op))) __PYX_ERR(34, 417, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_send_message_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_send_message_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_cur_scope->__pyx_v_send_message_op))) __PYX_ERR(34, 417, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_send_close_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_send_close_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_cur_scope->__pyx_v_send_close_op))) __PYX_ERR(34, 417, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_outbound_ops = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":422
+ *         )
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out the request message.
+ *             await execute_batch(self,
+ */
+  {
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":424
+ *         try:
+ *             # Sends out the request message.
+ *             await execute_batch(self,             # <<<<<<<<<<<<<<
+ *                                 outbound_ops,
+ *                                 self._loop)
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 424, __pyx_L5_error)
+      __Pyx_GOTREF(__pyx_t_1);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":426
+ *             await execute_batch(self,
+ *                                 outbound_ops,
+ *                                 self._loop)             # <<<<<<<<<<<<<<
+ * 
+ *             # Receives initial metadata.
+ */
+      __pyx_t_3 = NULL;
+      __pyx_t_6 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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_6 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[4] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_outbound_ops, __pyx_cur_scope->__pyx_v_self->_loop};
+        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 424, __pyx_L5_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_8;
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_9;
+        __Pyx_XGIVEREF(__pyx_t_10);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_10;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 1;
+        return __pyx_r;
+        __pyx_L11_resume_from_await:;
+        __pyx_t_8 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_8);
+        __pyx_t_9 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_9);
+        __pyx_t_10 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_10);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 424, __pyx_L5_error)
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+          else __PYX_ERR(34, 424, __pyx_L5_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":430
+ *             # Receives initial metadata.
+ *             self._set_initial_metadata(
+ *                 await _receive_initial_metadata(self,             # <<<<<<<<<<<<<<
+ *                                                 self._loop),
+ *             )
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_receive_initial_metadata); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 430, __pyx_L5_error)
+      __Pyx_GOTREF(__pyx_t_1);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":431
+ *             self._set_initial_metadata(
+ *                 await _receive_initial_metadata(self,
+ *                                                 self._loop),             # <<<<<<<<<<<<<<
+ *             )
+ *         except ExecuteBatchError as batch_error:
+ */
+      __pyx_t_3 = NULL;
+      __pyx_t_6 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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_6 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_self->_loop};
+        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 430, __pyx_L5_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_8;
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_9;
+        __Pyx_XGIVEREF(__pyx_t_10);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_10;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 2;
+        return __pyx_r;
+        __pyx_L12_resume_from_await:;
+        __pyx_t_8 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_8);
+        __pyx_t_9 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_9);
+        __pyx_t_10 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_10);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 430, __pyx_L5_error)
+        __pyx_t_2 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_2);
+      } else {
+        __pyx_t_2 = NULL;
+        if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_2) < 0) __PYX_ERR(34, 430, __pyx_L5_error)
+        __Pyx_GOTREF(__pyx_t_2);
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":430
+ *             # Receives initial metadata.
+ *             self._set_initial_metadata(
+ *                 await _receive_initial_metadata(self,             # <<<<<<<<<<<<<<
+ *                                                 self._loop),
+ *             )
+ */
+      if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(34, 430, __pyx_L5_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":429
+ * 
+ *             # Receives initial metadata.
+ *             self._set_initial_metadata(             # <<<<<<<<<<<<<<
+ *                 await _receive_initial_metadata(self,
+ *                                                 self._loop),
+ */
+      ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->_set_initial_metadata(__pyx_cur_scope->__pyx_v_self, ((PyObject*)__pyx_t_2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 429, __pyx_L5_error)
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":422
+ *         )
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out the request message.
+ *             await execute_batch(self,
+ */
+    }
+    __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_L10_try_end;
+    __pyx_L5_error:;
+    __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;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":433
+ *                                                 self._loop),
+ *             )
+ *         except ExecuteBatchError as batch_error:             # <<<<<<<<<<<<<<
+ *             # Core should explain why this batch failed
+ *             await status_task
+ */
+    __Pyx_ErrFetch(&__pyx_t_2, &__pyx_t_1, &__pyx_t_3);
+    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ExecuteBatchError); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 433, __pyx_L7_except_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_11 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_2, __pyx_t_4);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_3);
+    __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_3 = 0;
+    if (__pyx_t_11) {
+      __Pyx_AddTraceback("_cython.cygrpc._AioCall.initiate_unary_stream", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_1, &__pyx_t_2) < 0) __PYX_ERR(34, 433, __pyx_L7_except_error)
+      __Pyx_XGOTREF(__pyx_t_3);
+      __Pyx_XGOTREF(__pyx_t_1);
+      __Pyx_XGOTREF(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_cur_scope->__pyx_v_batch_error = __pyx_t_1;
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":435
+ *         except ExecuteBatchError as batch_error:
+ *             # Core should explain why this batch failed
+ *             await status_task             # <<<<<<<<<<<<<<
+ * 
+ *     async def stream_unary(self,
+ */
+        __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_status_task);
+        __Pyx_XGOTREF(__pyx_r);
+        if (likely(__pyx_r)) {
+          __Pyx_XGIVEREF(__pyx_t_1);
+          __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+          __Pyx_XGIVEREF(__pyx_t_2);
+          __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+          __Pyx_XGIVEREF(__pyx_t_3);
+          __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+          __Pyx_XGIVEREF(__pyx_t_8);
+          __pyx_cur_scope->__pyx_t_3 = __pyx_t_8;
+          __Pyx_XGIVEREF(__pyx_t_9);
+          __pyx_cur_scope->__pyx_t_4 = __pyx_t_9;
+          __Pyx_XGIVEREF(__pyx_t_10);
+          __pyx_cur_scope->__pyx_t_5 = __pyx_t_10;
+          __Pyx_XGIVEREF(__pyx_r);
+          __Pyx_RefNannyFinishContext();
+          __Pyx_Coroutine_SwapException(__pyx_generator);
+          /* return from generator, awaiting value */
+          __pyx_generator->resume_label = 3;
+          return __pyx_r;
+          __pyx_L20_resume_from_await:;
+          __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+          __pyx_cur_scope->__pyx_t_0 = 0;
+          __Pyx_XGOTREF(__pyx_t_1);
+          __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+          __pyx_cur_scope->__pyx_t_1 = 0;
+          __Pyx_XGOTREF(__pyx_t_2);
+          __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+          __pyx_cur_scope->__pyx_t_2 = 0;
+          __Pyx_XGOTREF(__pyx_t_3);
+          __pyx_t_8 = __pyx_cur_scope->__pyx_t_3;
+          __pyx_cur_scope->__pyx_t_3 = 0;
+          __Pyx_XGOTREF(__pyx_t_8);
+          __pyx_t_9 = __pyx_cur_scope->__pyx_t_4;
+          __pyx_cur_scope->__pyx_t_4 = 0;
+          __Pyx_XGOTREF(__pyx_t_9);
+          __pyx_t_10 = __pyx_cur_scope->__pyx_t_5;
+          __pyx_cur_scope->__pyx_t_5 = 0;
+          __Pyx_XGOTREF(__pyx_t_10);
+          if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 435, __pyx_L18_error)
+        } else {
+          PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+          if (exc_type) {
+            if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+            else __PYX_ERR(34, 435, __pyx_L18_error)
+          }
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":433
+ *                                                 self._loop),
+ *             )
+ *         except ExecuteBatchError as batch_error:             # <<<<<<<<<<<<<<
+ *             # Core should explain why this batch failed
+ *             await status_task
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_batch_error);
+          __Pyx_DECREF(__pyx_cur_scope->__pyx_v_batch_error); __pyx_cur_scope->__pyx_v_batch_error = 0;
+          goto __pyx_L19;
+        }
+        __pyx_L18_error:;
+        /*exception exit:*/{
+          __Pyx_PyThreadState_assign
+          __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19);
+          if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16) < 0)) __Pyx_ErrFetch(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16);
+          __Pyx_XGOTREF(__pyx_t_14);
+          __Pyx_XGOTREF(__pyx_t_15);
+          __Pyx_XGOTREF(__pyx_t_16);
+          __Pyx_XGOTREF(__pyx_t_17);
+          __Pyx_XGOTREF(__pyx_t_18);
+          __Pyx_XGOTREF(__pyx_t_19);
+          __pyx_t_11 = __pyx_lineno; __pyx_t_12 = __pyx_clineno; __pyx_t_13 = __pyx_filename;
+          {
+            __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_batch_error);
+            __Pyx_DECREF(__pyx_cur_scope->__pyx_v_batch_error); __pyx_cur_scope->__pyx_v_batch_error = 0;
+          }
+          if (PY_MAJOR_VERSION >= 3) {
+            __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_XGIVEREF(__pyx_t_14);
+          __Pyx_XGIVEREF(__pyx_t_15);
+          __Pyx_XGIVEREF(__pyx_t_16);
+          __Pyx_ErrRestore(__pyx_t_14, __pyx_t_15, __pyx_t_16);
+          __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+          __pyx_lineno = __pyx_t_11; __pyx_clineno = __pyx_t_12; __pyx_filename = __pyx_t_13;
+          goto __pyx_L7_except_error;
+        }
+        __pyx_L19:;
+      }
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      goto __pyx_L6_exception_handled;
+    }
+    goto __pyx_L7_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":422
+ *         )
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out the request message.
+ *             await execute_batch(self,
+ */
+    __pyx_L7_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_L6_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_L10_try_end:;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":395
+ *         await execute_batch(self, ops, self._loop)
+ * 
+ *     async def initiate_unary_stream(self,             # <<<<<<<<<<<<<<
+ *                            bytes request,
+ *                            tuple outbound_initial_metadata,
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __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_AddTraceback("initiate_unary_stream", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_52generator16(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":437
+ *             await status_task
+ * 
+ *     async def stream_unary(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_51stream_unary(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_50stream_unary, "Actual implementation of the complete unary-stream call.\n\n        Needs to pay extra attention to the raise mechanism. If we want to\n        propagate the final status exception, then we have to raise it.\n        Othersize, it would end normally and raise `StopAsyncIteration()`.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_51stream_unary = {"stream_unary", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_51stream_unary, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_50stream_unary};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_51stream_unary(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_outbound_initial_metadata = 0;
+  PyObject *__pyx_v_metadata_sent_observer = 0;
+  PyObject *__pyx_v_context = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("stream_unary (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_outbound_initial_metadata,&__pyx_n_s_metadata_sent_observer,&__pyx_n_s_context,0};
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":440
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ *                            object context = None):             # <<<<<<<<<<<<<<
+ *         """Actual implementation of the complete unary-stream call.
+ * 
+ */
+    values[2] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_outbound_initial_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 437, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata_sent_observer)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 437, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("stream_unary", 0, 2, 3, 1); __PYX_ERR(34, 437, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context);
+          if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 437, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "stream_unary") < 0)) __PYX_ERR(34, 437, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_outbound_initial_metadata = ((PyObject*)values[0]);
+    __pyx_v_metadata_sent_observer = values[1];
+    __pyx_v_context = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("stream_unary", 0, 2, 3, __pyx_nargs); __PYX_ERR(34, 437, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.stream_unary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_outbound_initial_metadata), (&PyTuple_Type), 1, "outbound_initial_metadata", 1))) __PYX_ERR(34, 438, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_50stream_unary(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_outbound_initial_metadata, __pyx_v_metadata_sent_observer, __pyx_v_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":437
+ *             await status_task
+ * 
+ *     async def stream_unary(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_50stream_unary(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_outbound_initial_metadata, PyObject *__pyx_v_metadata_sent_observer, PyObject *__pyx_v_context) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("stream_unary", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 437, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_outbound_initial_metadata = __pyx_v_outbound_initial_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __pyx_cur_scope->__pyx_v_metadata_sent_observer = __pyx_v_metadata_sent_observer;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata_sent_observer);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_metadata_sent_observer);
+  __pyx_cur_scope->__pyx_v_context = __pyx_v_context;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_context);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_context);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_52generator16, __pyx_codeobj__67, (PyObject *) __pyx_cur_scope, __pyx_n_s_stream_unary, __pyx_n_s_AioCall_stream_unary, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 437, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.stream_unary", __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_7_cython_6cygrpc_8_AioCall_52generator16(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  unsigned int __pyx_t_8;
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  grpc_status_code __pyx_t_13;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("stream_unary", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L10_resume_from_await;
+    case 2: goto __pyx_L11_resume_from_await;
+    case 3: goto __pyx_L14_resume_from_await;
+    case 4: goto __pyx_L16_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 437, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":447
+ *         Othersize, it would end normally and raise `StopAsyncIteration()`.
+ *         """
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out initial_metadata ASAP.
+ *             await _send_initial_metadata(self,
+ */
+  {
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":449
+ *         try:
+ *             # Sends out initial_metadata ASAP.
+ *             await _send_initial_metadata(self,             # <<<<<<<<<<<<<<
+ *                                         outbound_initial_metadata,
+ *                                         self._send_initial_metadata_flags,
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_send_initial_metadata); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 449, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_5);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":451
+ *             await _send_initial_metadata(self,
+ *                                         outbound_initial_metadata,
+ *                                         self._send_initial_metadata_flags,             # <<<<<<<<<<<<<<
+ *                                         self._loop)
+ *             # Notify upper level that sending messages are allowed now.
+ */
+      __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->_send_initial_metadata_flags); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 451, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_6);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":452
+ *                                         outbound_initial_metadata,
+ *                                         self._send_initial_metadata_flags,
+ *                                         self._loop)             # <<<<<<<<<<<<<<
+ *             # Notify upper level that sending messages are allowed now.
+ *             metadata_sent_observer()
+ */
+      __pyx_t_7 = NULL;
+      __pyx_t_8 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[5] = {__pyx_t_7, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_outbound_initial_metadata, __pyx_t_6, __pyx_cur_scope->__pyx_v_self->_loop};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 4+__pyx_t_8);
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 449, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_4);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_1);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+        __Pyx_XGIVEREF(__pyx_t_2);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+        __Pyx_XGIVEREF(__pyx_t_3);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 1;
+        return __pyx_r;
+        __pyx_L10_resume_from_await:;
+        __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_1);
+        __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_2);
+        __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_3);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 449, __pyx_L4_error)
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+          else __PYX_ERR(34, 449, __pyx_L4_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":454
+ *                                         self._loop)
+ *             # Notify upper level that sending messages are allowed now.
+ *             metadata_sent_observer()             # <<<<<<<<<<<<<<
+ * 
+ *             # Receives initial metadata.
+ */
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata_sent_observer);
+      __pyx_t_5 = __pyx_cur_scope->__pyx_v_metadata_sent_observer; __pyx_t_6 = NULL;
+      __pyx_t_8 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(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);
+          __pyx_t_8 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 454, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":458
+ *             # Receives initial metadata.
+ *             self._set_initial_metadata(
+ *                 await _receive_initial_metadata(self, self._loop)             # <<<<<<<<<<<<<<
+ *             )
+ *         except ExecuteBatchError:
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_receive_initial_metadata); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 458, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_6 = NULL;
+      __pyx_t_8 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(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);
+          __pyx_t_8 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_6, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_self->_loop};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 458, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_4);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_1);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+        __Pyx_XGIVEREF(__pyx_t_2);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+        __Pyx_XGIVEREF(__pyx_t_3);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 2;
+        return __pyx_r;
+        __pyx_L11_resume_from_await:;
+        __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_1);
+        __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_2);
+        __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_3);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 458, __pyx_L4_error)
+        __pyx_t_4 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_4);
+      } else {
+        __pyx_t_4 = NULL;
+        if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_4) < 0) __PYX_ERR(34, 458, __pyx_L4_error)
+        __Pyx_GOTREF(__pyx_t_4);
+      }
+      if (!(likely(PyTuple_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_4))) __PYX_ERR(34, 458, __pyx_L4_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":457
+ * 
+ *             # Receives initial metadata.
+ *             self._set_initial_metadata(             # <<<<<<<<<<<<<<
+ *                 await _receive_initial_metadata(self, self._loop)
+ *             )
+ */
+      ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->_set_initial_metadata(__pyx_cur_scope->__pyx_v_self, ((PyObject*)__pyx_t_4)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 457, __pyx_L4_error)
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":447
+ *         Othersize, it would end normally and raise `StopAsyncIteration()`.
+ *         """
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out initial_metadata ASAP.
+ *             await _send_initial_metadata(self,
+ */
+    }
+    __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_L9_try_end;
+    __pyx_L4_error:;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":460
+ *                 await _receive_initial_metadata(self, self._loop)
+ *             )
+ *         except ExecuteBatchError:             # <<<<<<<<<<<<<<
+ *             # Core should explain why this batch failed
+ *             await self._handle_status_once_received()
+ */
+    __Pyx_ErrFetch(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+    __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_ExecuteBatchError); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 460, __pyx_L6_except_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_9 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_4, __pyx_t_7);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_ErrRestore(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+    __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0;
+    if (__pyx_t_9) {
+      __Pyx_AddTraceback("_cython.cygrpc._AioCall.stream_unary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_4) < 0) __PYX_ERR(34, 460, __pyx_L6_except_error)
+      __Pyx_XGOTREF(__pyx_t_6);
+      __Pyx_XGOTREF(__pyx_t_5);
+      __Pyx_XGOTREF(__pyx_t_4);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":462
+ *         except ExecuteBatchError:
+ *             # Core should explain why this batch failed
+ *             await self._handle_status_once_received()             # <<<<<<<<<<<<<<
+ * 
+ *             # Allow upper layer to proceed only if the status is set
+ */
+      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_handle_status_once_received); if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 462, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __pyx_t_11 = NULL;
+      __pyx_t_8 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (likely(PyMethod_Check(__pyx_t_10))) {
+        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_10);
+        if (likely(__pyx_t_11)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_11);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_10, function);
+          __pyx_t_8 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_11, NULL};
+        __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 462, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_7);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_1);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+        __Pyx_XGIVEREF(__pyx_t_2);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+        __Pyx_XGIVEREF(__pyx_t_3);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_cur_scope->__pyx_t_3 = __pyx_t_4;
+        __Pyx_XGIVEREF(__pyx_t_5);
+        __pyx_cur_scope->__pyx_t_4 = __pyx_t_5;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __pyx_cur_scope->__pyx_t_5 = __pyx_t_6;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_SwapException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 3;
+        return __pyx_r;
+        __pyx_L14_resume_from_await:;
+        __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_1);
+        __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_2);
+        __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_3);
+        __pyx_t_4 = __pyx_cur_scope->__pyx_t_3;
+        __pyx_cur_scope->__pyx_t_3 = 0;
+        __Pyx_XGOTREF(__pyx_t_4);
+        __pyx_t_5 = __pyx_cur_scope->__pyx_t_4;
+        __pyx_cur_scope->__pyx_t_4 = 0;
+        __Pyx_XGOTREF(__pyx_t_5);
+        __pyx_t_6 = __pyx_cur_scope->__pyx_t_5;
+        __pyx_cur_scope->__pyx_t_5 = 0;
+        __Pyx_XGOTREF(__pyx_t_6);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 462, __pyx_L6_except_error)
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+          else __PYX_ERR(34, 462, __pyx_L6_except_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":465
+ * 
+ *             # Allow upper layer to proceed only if the status is set
+ *             metadata_sent_observer()             # <<<<<<<<<<<<<<
+ *             return None
+ * 
+ */
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata_sent_observer);
+      __pyx_t_10 = __pyx_cur_scope->__pyx_v_metadata_sent_observer; __pyx_t_11 = NULL;
+      __pyx_t_8 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_10))) {
+        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_10);
+        if (likely(__pyx_t_11)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_11);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_10, function);
+          __pyx_t_8 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_11, NULL};
+        __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 465, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":466
+ *             # Allow upper layer to proceed only if the status is set
+ *             metadata_sent_observer()
+ *             return None             # <<<<<<<<<<<<<<
+ * 
+ *         cdef tuple inbound_ops
+ */
+      __Pyx_XDECREF(__pyx_r);
+      __pyx_r = NULL;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      goto __pyx_L7_except_return;
+    }
+    goto __pyx_L6_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":447
+ *         Othersize, it would end normally and raise `StopAsyncIteration()`.
+ *         """
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out initial_metadata ASAP.
+ *             await _send_initial_metadata(self,
+ */
+    __pyx_L6_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_L7_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_L9_try_end:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":469
+ * 
+ *         cdef tuple inbound_ops
+ *         cdef ReceiveMessageOperation receive_message_op = ReceiveMessageOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 469, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation), __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 469, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_GIVEREF(__pyx_t_5);
+  __pyx_cur_scope->__pyx_v_receive_message_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)__pyx_t_5);
+  __pyx_t_5 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":470
+ *         cdef tuple inbound_ops
+ *         cdef ReceiveMessageOperation receive_message_op = ReceiveMessageOperation(_EMPTY_FLAGS)
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)             # <<<<<<<<<<<<<<
+ * 
+ *         if context is not None:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 470, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation), __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 470, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __Pyx_GIVEREF(__pyx_t_4);
+  __pyx_cur_scope->__pyx_v_receive_status_on_client_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)__pyx_t_4);
+  __pyx_t_4 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":472
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ * 
+ *         if context is not None:             # <<<<<<<<<<<<<<
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         inbound_ops = (receive_message_op, receive_status_on_client_op)
+ */
+  __pyx_t_12 = (__pyx_cur_scope->__pyx_v_context != Py_None);
+  if (__pyx_t_12) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":473
+ * 
+ *         if context is not None:
+ *             set_instrumentation_context_on_call_aio(self, context)             # <<<<<<<<<<<<<<
+ *         inbound_ops = (receive_message_op, receive_status_on_client_op)
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_set_instrumentation_context_on_c); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 473, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = NULL;
+    __pyx_t_8 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(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);
+        __pyx_t_8 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_6, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_context};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 473, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":472
+ *         cdef ReceiveStatusOnClientOperation receive_status_on_client_op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ * 
+ *         if context is not None:             # <<<<<<<<<<<<<<
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         inbound_ops = (receive_message_op, receive_status_on_client_op)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":474
+ *         if context is not None:
+ *             set_instrumentation_context_on_call_aio(self, context)
+ *         inbound_ops = (receive_message_op, receive_status_on_client_op)             # <<<<<<<<<<<<<<
+ * 
+ *         # Executes all operations in one batch.
+ */
+  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 474, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_message_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_message_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_receive_message_op))) __PYX_ERR(34, 474, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op))) __PYX_ERR(34, 474, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_4);
+  __pyx_cur_scope->__pyx_v_inbound_ops = ((PyObject*)__pyx_t_4);
+  __pyx_t_4 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":477
+ * 
+ *         # Executes all operations in one batch.
+ *         await execute_batch(self,             # <<<<<<<<<<<<<<
+ *                             inbound_ops,
+ *                             self._loop)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 477, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":479
+ *         await execute_batch(self,
+ *                             inbound_ops,
+ *                             self._loop)             # <<<<<<<<<<<<<<
+ * 
+ *         cdef grpc_status_code code
+ */
+  __pyx_t_6 = NULL;
+  __pyx_t_8 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(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);
+      __pyx_t_8 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_6, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_inbound_ops, __pyx_cur_scope->__pyx_v_self->_loop};
+    __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 3+__pyx_t_8);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 477, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_4);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 4;
+    return __pyx_r;
+    __pyx_L16_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 477, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(34, 477, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":482
+ * 
+ *         cdef grpc_status_code code
+ *         code = receive_status_on_client_op.code()             # <<<<<<<<<<<<<<
+ * 
+ *         self._set_status(AioRpcStatus(
+ */
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op), __pyx_n_s_code); if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 482, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = NULL;
+  __pyx_t_8 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_8 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+    __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 482, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
+  __pyx_t_13 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_t_4)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 482, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_cur_scope->__pyx_v_code = __pyx_t_13;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":485
+ * 
+ *         self._set_status(AioRpcStatus(
+ *             code,             # <<<<<<<<<<<<<<
+ *             receive_status_on_client_op.details(),
+ *             receive_status_on_client_op.trailing_metadata(),
+ */
+  __pyx_t_4 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_code); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 485, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":486
+ *         self._set_status(AioRpcStatus(
+ *             code,
+ *             receive_status_on_client_op.details(),             # <<<<<<<<<<<<<<
+ *             receive_status_on_client_op.trailing_metadata(),
+ *             receive_status_on_client_op.error_string(),
+ */
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op), __pyx_n_s_details); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 486, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = NULL;
+  __pyx_t_8 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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);
+      __pyx_t_8 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
+    __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    if (unlikely(!__pyx_t_5)) __PYX_ERR(34, 486, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":487
+ *             code,
+ *             receive_status_on_client_op.details(),
+ *             receive_status_on_client_op.trailing_metadata(),             # <<<<<<<<<<<<<<
+ *             receive_status_on_client_op.error_string(),
+ *         ))
+ */
+  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op), __pyx_n_s_trailing_metadata); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 487, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_10 = NULL;
+  __pyx_t_8 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_7))) {
+    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7);
+    if (likely(__pyx_t_10)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+      __Pyx_INCREF(__pyx_t_10);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_7, function);
+      __pyx_t_8 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_10, NULL};
+    __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+    if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 487, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":488
+ *             receive_status_on_client_op.details(),
+ *             receive_status_on_client_op.trailing_metadata(),
+ *             receive_status_on_client_op.error_string(),             # <<<<<<<<<<<<<<
+ *         ))
+ * 
+ */
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_status_on_client_op), __pyx_n_s_error_string); if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 488, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_11 = NULL;
+  __pyx_t_8 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_10))) {
+    __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_10);
+    if (likely(__pyx_t_11)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
+      __Pyx_INCREF(__pyx_t_11);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_10, function);
+      __pyx_t_8 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_11, NULL};
+    __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+    __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+    if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 488, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":484
+ *         code = receive_status_on_client_op.code()
+ * 
+ *         self._set_status(AioRpcStatus(             # <<<<<<<<<<<<<<
+ *             code,
+ *             receive_status_on_client_op.details(),
+ */
+  __pyx_t_10 = PyTuple_New(4); if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 484, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_4);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_4)) __PYX_ERR(34, 484, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_5);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_5)) __PYX_ERR(34, 484, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_6);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_6)) __PYX_ERR(34, 484, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_7);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_t_7)) __PYX_ERR(34, 484, __pyx_L1_error);
+  __pyx_t_4 = 0;
+  __pyx_t_5 = 0;
+  __pyx_t_6 = 0;
+  __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus), __pyx_t_10, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 484, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->_set_status(__pyx_cur_scope->__pyx_v_self, ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)__pyx_t_7)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 484, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":491
+ *         ))
+ * 
+ *         if code == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *             return receive_message_op.message()
+ *         else:
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_code); if (unlikely(!__pyx_t_7)) __PYX_ERR(34, 491, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 491, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_ok); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 491, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = PyObject_RichCompare(__pyx_t_7, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 491, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_12 < 0))) __PYX_ERR(34, 491, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  if (__pyx_t_12) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":492
+ * 
+ *         if code == StatusCode.ok:
+ *             return receive_message_op.message()             # <<<<<<<<<<<<<<
+ *         else:
+ *             return None
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_receive_message_op), __pyx_n_s_message); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 492, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_7 = NULL;
+    __pyx_t_8 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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);
+        __pyx_t_8 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_7, NULL};
+      __pyx_t_10 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (unlikely(!__pyx_t_10)) __PYX_ERR(34, 492, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_10);
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":491
+ *         ))
+ * 
+ *         if code == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *             return receive_message_op.message()
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":494
+ *             return receive_message_op.message()
+ *         else:
+ *             return None             # <<<<<<<<<<<<<<
+ * 
+ *     async def initiate_stream_stream(self,
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":437
+ *             await status_task
+ * 
+ *     async def stream_unary(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("stream_unary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_8_AioCall_55generator17(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":496
+ *             return None
+ * 
+ *     async def initiate_stream_stream(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_54initiate_stream_stream(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_8_AioCall_53initiate_stream_stream, "Actual implementation of the complete stream-stream call.\n\n        Needs to pay extra attention to the raise mechanism. If we want to\n        propagate the final status exception, then we have to raise it.\n        Othersize, it would end normally and raise `StopAsyncIteration()`.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_54initiate_stream_stream = {"initiate_stream_stream", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_54initiate_stream_stream, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_53initiate_stream_stream};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_54initiate_stream_stream(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_outbound_initial_metadata = 0;
+  PyObject *__pyx_v_metadata_sent_observer = 0;
+  PyObject *__pyx_v_context = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("initiate_stream_stream (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_outbound_initial_metadata,&__pyx_n_s_metadata_sent_observer,&__pyx_n_s_context,0};
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":499
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ *                            object context = None):             # <<<<<<<<<<<<<<
+ *         """Actual implementation of the complete stream-stream call.
+ * 
+ */
+    values[2] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None));
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_outbound_initial_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 496, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata_sent_observer)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 496, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("initiate_stream_stream", 0, 2, 3, 1); __PYX_ERR(34, 496, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context);
+          if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 496, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "initiate_stream_stream") < 0)) __PYX_ERR(34, 496, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_outbound_initial_metadata = ((PyObject*)values[0]);
+    __pyx_v_metadata_sent_observer = values[1];
+    __pyx_v_context = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("initiate_stream_stream", 0, 2, 3, __pyx_nargs); __PYX_ERR(34, 496, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.initiate_stream_stream", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_outbound_initial_metadata), (&PyTuple_Type), 1, "outbound_initial_metadata", 1))) __PYX_ERR(34, 497, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_53initiate_stream_stream(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v_outbound_initial_metadata, __pyx_v_metadata_sent_observer, __pyx_v_context);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":496
+ *             return None
+ * 
+ *     async def initiate_stream_stream(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_53initiate_stream_stream(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, PyObject *__pyx_v_outbound_initial_metadata, PyObject *__pyx_v_metadata_sent_observer, PyObject *__pyx_v_context) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("initiate_stream_stream", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(34, 496, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_outbound_initial_metadata = __pyx_v_outbound_initial_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_outbound_initial_metadata);
+  __pyx_cur_scope->__pyx_v_metadata_sent_observer = __pyx_v_metadata_sent_observer;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata_sent_observer);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_metadata_sent_observer);
+  __pyx_cur_scope->__pyx_v_context = __pyx_v_context;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_context);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_context);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_8_AioCall_55generator17, __pyx_codeobj__68, (PyObject *) __pyx_cur_scope, __pyx_n_s_initiate_stream_stream, __pyx_n_s_AioCall_initiate_stream_stream, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(34, 496, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.initiate_stream_stream", __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_7_cython_6cygrpc_8_AioCall_55generator17(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  unsigned int __pyx_t_6;
+  int __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  PyObject *__pyx_t_12 = NULL;
+  int __pyx_t_13;
+  char const *__pyx_t_14;
+  PyObject *__pyx_t_15 = NULL;
+  PyObject *__pyx_t_16 = NULL;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *__pyx_t_18 = NULL;
+  PyObject *__pyx_t_19 = NULL;
+  PyObject *__pyx_t_20 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("initiate_stream_stream", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L11_resume_from_await;
+    case 2: goto __pyx_L12_resume_from_await;
+    case 3: goto __pyx_L20_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 496, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":508
+ *         # Peer may prematurely end this RPC at any point. We need a corutine
+ *         # that watches if the server sends the final status.
+ *         status_task = self._loop.create_task(self._handle_status_once_received())             # <<<<<<<<<<<<<<
+ * 
+ *         if context is not None:
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_loop, __pyx_n_s_create_task); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 508, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_handle_status_once_received); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 508, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_5, NULL};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 508, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __pyx_t_4 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 508, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_status_task = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":510
+ *         status_task = self._loop.create_task(self._handle_status_once_received())
+ * 
+ *         if context is not None:             # <<<<<<<<<<<<<<
+ *             set_instrumentation_context_on_call_aio(self, context)
+ * 
+ */
+  __pyx_t_7 = (__pyx_cur_scope->__pyx_v_context != Py_None);
+  if (__pyx_t_7) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":511
+ * 
+ *         if context is not None:
+ *             set_instrumentation_context_on_call_aio(self, context)             # <<<<<<<<<<<<<<
+ * 
+ *         try:
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_set_instrumentation_context_on_c); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 511, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_context};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 511, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":510
+ *         status_task = self._loop.create_task(self._handle_status_once_received())
+ * 
+ *         if context is not None:             # <<<<<<<<<<<<<<
+ *             set_instrumentation_context_on_call_aio(self, context)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":513
+ *             set_instrumentation_context_on_call_aio(self, context)
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out initial_metadata ASAP.
+ *             await _send_initial_metadata(self,
+ */
+  {
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":515
+ *         try:
+ *             # Sends out initial_metadata ASAP.
+ *             await _send_initial_metadata(self,             # <<<<<<<<<<<<<<
+ *                                         outbound_initial_metadata,
+ *                                         self._send_initial_metadata_flags,
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_send_initial_metadata); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 515, __pyx_L5_error)
+      __Pyx_GOTREF(__pyx_t_2);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":517
+ *             await _send_initial_metadata(self,
+ *                                         outbound_initial_metadata,
+ *                                         self._send_initial_metadata_flags,             # <<<<<<<<<<<<<<
+ *                                         self._loop)
+ *             # Notify upper level that sending messages are allowed now.
+ */
+      __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_self->_send_initial_metadata_flags); if (unlikely(!__pyx_t_3)) __PYX_ERR(34, 517, __pyx_L5_error)
+      __Pyx_GOTREF(__pyx_t_3);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":518
+ *                                         outbound_initial_metadata,
+ *                                         self._send_initial_metadata_flags,
+ *                                         self._loop)             # <<<<<<<<<<<<<<
+ *             # Notify upper level that sending messages are allowed now.
+ *             metadata_sent_observer()
+ */
+      __pyx_t_4 = NULL;
+      __pyx_t_6 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_2))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_2, function);
+          __pyx_t_6 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[5] = {__pyx_t_4, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_outbound_initial_metadata, __pyx_t_3, __pyx_cur_scope->__pyx_v_self->_loop};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 4+__pyx_t_6);
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 515, __pyx_L5_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_8;
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_9;
+        __Pyx_XGIVEREF(__pyx_t_10);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_10;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 1;
+        return __pyx_r;
+        __pyx_L11_resume_from_await:;
+        __pyx_t_8 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_8);
+        __pyx_t_9 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_9);
+        __pyx_t_10 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_10);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 515, __pyx_L5_error)
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+          else __PYX_ERR(34, 515, __pyx_L5_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":520
+ *                                         self._loop)
+ *             # Notify upper level that sending messages are allowed now.
+ *             metadata_sent_observer()             # <<<<<<<<<<<<<<
+ * 
+ *             # Receives initial metadata.
+ */
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata_sent_observer);
+      __pyx_t_2 = __pyx_cur_scope->__pyx_v_metadata_sent_observer; __pyx_t_3 = NULL;
+      __pyx_t_6 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_6 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 520, __pyx_L5_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":524
+ *             # Receives initial metadata.
+ *             self._set_initial_metadata(
+ *                 await _receive_initial_metadata(self, self._loop)             # <<<<<<<<<<<<<<
+ *             )
+ *         except ExecuteBatchError as batch_error:
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_receive_initial_metadata); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 524, __pyx_L5_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = NULL;
+      __pyx_t_6 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_6 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_self->_loop};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 524, __pyx_L5_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_8;
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_9;
+        __Pyx_XGIVEREF(__pyx_t_10);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_10;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 2;
+        return __pyx_r;
+        __pyx_L12_resume_from_await:;
+        __pyx_t_8 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_8);
+        __pyx_t_9 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_9);
+        __pyx_t_10 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_10);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 524, __pyx_L5_error)
+        __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+      } else {
+        __pyx_t_1 = NULL;
+        if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(34, 524, __pyx_L5_error)
+        __Pyx_GOTREF(__pyx_t_1);
+      }
+      if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(34, 524, __pyx_L5_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":523
+ * 
+ *             # Receives initial metadata.
+ *             self._set_initial_metadata(             # <<<<<<<<<<<<<<
+ *                 await _receive_initial_metadata(self, self._loop)
+ *             )
+ */
+      ((struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->_set_initial_metadata(__pyx_cur_scope->__pyx_v_self, ((PyObject*)__pyx_t_1)); if (unlikely(PyErr_Occurred())) __PYX_ERR(34, 523, __pyx_L5_error)
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":513
+ *             set_instrumentation_context_on_call_aio(self, context)
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out initial_metadata ASAP.
+ *             await _send_initial_metadata(self,
+ */
+    }
+    __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_L10_try_end;
+    __pyx_L5_error:;
+    __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;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":526
+ *                 await _receive_initial_metadata(self, self._loop)
+ *             )
+ *         except ExecuteBatchError as batch_error:             # <<<<<<<<<<<<<<
+ *             # Core should explain why this batch failed
+ *             await status_task
+ */
+    __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3);
+    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ExecuteBatchError); if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 526, __pyx_L7_except_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_11 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_4);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_3);
+    __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0;
+    if (__pyx_t_11) {
+      __Pyx_AddTraceback("_cython.cygrpc._AioCall.initiate_stream_stream", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) __PYX_ERR(34, 526, __pyx_L7_except_error)
+      __Pyx_XGOTREF(__pyx_t_3);
+      __Pyx_XGOTREF(__pyx_t_2);
+      __Pyx_XGOTREF(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_GIVEREF(__pyx_t_2);
+      __pyx_cur_scope->__pyx_v_batch_error = __pyx_t_2;
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":528
+ *         except ExecuteBatchError as batch_error:
+ *             # Core should explain why this batch failed
+ *             await status_task             # <<<<<<<<<<<<<<
+ * 
+ *             # Allow upper layer to proceed only if the status is set
+ */
+        __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_status_task);
+        __Pyx_XGOTREF(__pyx_r);
+        if (likely(__pyx_r)) {
+          __Pyx_XGIVEREF(__pyx_t_1);
+          __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+          __Pyx_XGIVEREF(__pyx_t_2);
+          __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+          __Pyx_XGIVEREF(__pyx_t_3);
+          __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+          __Pyx_XGIVEREF(__pyx_t_8);
+          __pyx_cur_scope->__pyx_t_3 = __pyx_t_8;
+          __Pyx_XGIVEREF(__pyx_t_9);
+          __pyx_cur_scope->__pyx_t_4 = __pyx_t_9;
+          __Pyx_XGIVEREF(__pyx_t_10);
+          __pyx_cur_scope->__pyx_t_5 = __pyx_t_10;
+          __Pyx_XGIVEREF(__pyx_r);
+          __Pyx_RefNannyFinishContext();
+          __Pyx_Coroutine_SwapException(__pyx_generator);
+          /* return from generator, awaiting value */
+          __pyx_generator->resume_label = 3;
+          return __pyx_r;
+          __pyx_L20_resume_from_await:;
+          __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+          __pyx_cur_scope->__pyx_t_0 = 0;
+          __Pyx_XGOTREF(__pyx_t_1);
+          __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+          __pyx_cur_scope->__pyx_t_1 = 0;
+          __Pyx_XGOTREF(__pyx_t_2);
+          __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+          __pyx_cur_scope->__pyx_t_2 = 0;
+          __Pyx_XGOTREF(__pyx_t_3);
+          __pyx_t_8 = __pyx_cur_scope->__pyx_t_3;
+          __pyx_cur_scope->__pyx_t_3 = 0;
+          __Pyx_XGOTREF(__pyx_t_8);
+          __pyx_t_9 = __pyx_cur_scope->__pyx_t_4;
+          __pyx_cur_scope->__pyx_t_4 = 0;
+          __Pyx_XGOTREF(__pyx_t_9);
+          __pyx_t_10 = __pyx_cur_scope->__pyx_t_5;
+          __pyx_cur_scope->__pyx_t_5 = 0;
+          __Pyx_XGOTREF(__pyx_t_10);
+          if (unlikely(!__pyx_sent_value)) __PYX_ERR(34, 528, __pyx_L18_error)
+        } else {
+          PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+          if (exc_type) {
+            if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+            else __PYX_ERR(34, 528, __pyx_L18_error)
+          }
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":531
+ * 
+ *             # Allow upper layer to proceed only if the status is set
+ *             metadata_sent_observer()             # <<<<<<<<<<<<<<
+ */
+        __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata_sent_observer);
+        __pyx_t_5 = __pyx_cur_scope->__pyx_v_metadata_sent_observer; __pyx_t_12 = NULL;
+        __pyx_t_6 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_5))) {
+          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_5);
+          if (likely(__pyx_t_12)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+            __Pyx_INCREF(__pyx_t_12);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_5, function);
+            __pyx_t_6 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_12, NULL};
+          __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+          if (unlikely(!__pyx_t_4)) __PYX_ERR(34, 531, __pyx_L18_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":526
+ *                 await _receive_initial_metadata(self, self._loop)
+ *             )
+ *         except ExecuteBatchError as batch_error:             # <<<<<<<<<<<<<<
+ *             # Core should explain why this batch failed
+ *             await status_task
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_batch_error);
+          __Pyx_DECREF(__pyx_cur_scope->__pyx_v_batch_error); __pyx_cur_scope->__pyx_v_batch_error = 0;
+          goto __pyx_L19;
+        }
+        __pyx_L18_error:;
+        /*exception exit:*/{
+          __Pyx_PyThreadState_assign
+          __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0;
+          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+          if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20);
+          if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17) < 0)) __Pyx_ErrFetch(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17);
+          __Pyx_XGOTREF(__pyx_t_15);
+          __Pyx_XGOTREF(__pyx_t_16);
+          __Pyx_XGOTREF(__pyx_t_17);
+          __Pyx_XGOTREF(__pyx_t_18);
+          __Pyx_XGOTREF(__pyx_t_19);
+          __Pyx_XGOTREF(__pyx_t_20);
+          __pyx_t_11 = __pyx_lineno; __pyx_t_13 = __pyx_clineno; __pyx_t_14 = __pyx_filename;
+          {
+            __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_batch_error);
+            __Pyx_DECREF(__pyx_cur_scope->__pyx_v_batch_error); __pyx_cur_scope->__pyx_v_batch_error = 0;
+          }
+          if (PY_MAJOR_VERSION >= 3) {
+            __Pyx_XGIVEREF(__pyx_t_18);
+            __Pyx_XGIVEREF(__pyx_t_19);
+            __Pyx_XGIVEREF(__pyx_t_20);
+            __Pyx_ExceptionReset(__pyx_t_18, __pyx_t_19, __pyx_t_20);
+          }
+          __Pyx_XGIVEREF(__pyx_t_15);
+          __Pyx_XGIVEREF(__pyx_t_16);
+          __Pyx_XGIVEREF(__pyx_t_17);
+          __Pyx_ErrRestore(__pyx_t_15, __pyx_t_16, __pyx_t_17);
+          __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0;
+          __pyx_lineno = __pyx_t_11; __pyx_clineno = __pyx_t_13; __pyx_filename = __pyx_t_14;
+          goto __pyx_L7_except_error;
+        }
+        __pyx_L19:;
+      }
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L6_exception_handled;
+    }
+    goto __pyx_L7_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":513
+ *             set_instrumentation_context_on_call_aio(self, context)
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             # Sends out initial_metadata ASAP.
+ *             await _send_initial_metadata(self,
+ */
+    __pyx_L7_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_L6_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_L10_try_end:;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":496
+ *             return None
+ * 
+ *     async def initiate_stream_stream(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __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_12);
+  __Pyx_AddTraceback("initiate_stream_stream", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pxd.pxi":18
+ * cdef class _AioCall(GrpcCallWrapper):
+ *     cdef:
+ *         readonly AioChannel _channel             # <<<<<<<<<<<<<<
+ *         list _references
+ *         object _deadline
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_8_channel_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_8_channel_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_8_channel___get__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_8_channel___get__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->_channel);
+  __pyx_r = ((PyObject *)__pyx_v_self->_channel);
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pxd.pxi":38
+ *         # tasks that are asking for one of the field when they are not yet
+ *         # available.
+ *         readonly AioRpcStatus _status             # <<<<<<<<<<<<<<
+ *         readonly tuple _initial_metadata
+ *         list _waiters_status
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_7_status_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_7_status_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_7_status___get__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_7_status___get__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->_status);
+  __pyx_r = ((PyObject *)__pyx_v_self->_status);
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pxd.pxi":39
+ *         # available.
+ *         readonly AioRpcStatus _status
+ *         readonly tuple _initial_metadata             # <<<<<<<<<<<<<<
+ *         list _waiters_status
+ *         list _waiters_initial_metadata
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_17_initial_metadata_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_17_initial_metadata_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_17_initial_metadata___get__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_17_initial_metadata___get__(struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_initial_metadata);
+  __pyx_r = __pyx_v_self->_initial_metadata;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_57__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_57__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_57__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_57__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_56__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_56__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_59__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8_AioCall_59__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_59__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8_AioCall_59__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8_AioCall_58__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__AioCall *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8_AioCall_58__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__AioCall *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._AioCall.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":29
+ * 
+ * cdef class AioChannel:
+ *     def __cinit__(self, bytes target, tuple options, ChannelCredentials credentials, object loop):             # <<<<<<<<<<<<<<
+ *         init_grpc_aio()
+ *         if options is None:
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_10AioChannel_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_10AioChannel_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_target = 0;
+  PyObject *__pyx_v_options = 0;
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_credentials = 0;
+  PyObject *__pyx_v_loop = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[4] = {0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_target,&__pyx_n_s_options,&__pyx_n_s_credentials,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_target)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 29, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_options)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 29, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 1); __PYX_ERR(8, 29, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 29, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 2); __PYX_ERR(8, 29, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 29, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 3); __PYX_ERR(8, 29, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(8, 29, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 4)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+      values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+    }
+    __pyx_v_target = ((PyObject*)values[0]);
+    __pyx_v_options = ((PyObject*)values[1]);
+    __pyx_v_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)values[2]);
+    __pyx_v_loop = values[3];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, __pyx_nargs); __PYX_ERR(8, 29, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_target), (&PyBytes_Type), 1, "target", 1))) __PYX_ERR(8, 29, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_options), (&PyTuple_Type), 1, "options", 1))) __PYX_ERR(8, 29, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_credentials), __pyx_ptype_7_cython_6cygrpc_ChannelCredentials, 1, "credentials", 0))) __PYX_ERR(8, 29, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel___cinit__(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self), __pyx_v_target, __pyx_v_options, __pyx_v_credentials, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_10AioChannel___cinit__(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, PyObject *__pyx_v_target, PyObject *__pyx_v_options, struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v_credentials, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *__pyx_v_channel_args = 0;
+  grpc_channel_credentials *__pyx_v_creds;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  char *__pyx_t_3;
+  grpc_channel_args *__pyx_t_4;
+  grpc_channel_credentials *__pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_INCREF(__pyx_v_options);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":30
+ * cdef class AioChannel:
+ *     def __cinit__(self, bytes target, tuple options, ChannelCredentials credentials, object loop):
+ *         init_grpc_aio()             # <<<<<<<<<<<<<<
+ *         if options is None:
+ *             options = ()
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_init_grpc_aio(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 30, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":31
+ *     def __cinit__(self, bytes target, tuple options, ChannelCredentials credentials, object loop):
+ *         init_grpc_aio()
+ *         if options is None:             # <<<<<<<<<<<<<<
+ *             options = ()
+ *         cdef _ChannelArgs channel_args = _ChannelArgs(options)
+ */
+  __pyx_t_2 = (__pyx_v_options == ((PyObject*)Py_None));
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":32
+ *         init_grpc_aio()
+ *         if options is None:
+ *             options = ()             # <<<<<<<<<<<<<<
+ *         cdef _ChannelArgs channel_args = _ChannelArgs(options)
+ *         self._target = target
+ */
+    __Pyx_INCREF(__pyx_empty_tuple);
+    __Pyx_DECREF_SET(__pyx_v_options, __pyx_empty_tuple);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":31
+ *     def __cinit__(self, bytes target, tuple options, ChannelCredentials credentials, object loop):
+ *         init_grpc_aio()
+ *         if options is None:             # <<<<<<<<<<<<<<
+ *             options = ()
+ *         cdef _ChannelArgs channel_args = _ChannelArgs(options)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":33
+ *         if options is None:
+ *             options = ()
+ *         cdef _ChannelArgs channel_args = _ChannelArgs(options)             # <<<<<<<<<<<<<<
+ *         self._target = target
+ *         self.loop = loop
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ChannelArgs), __pyx_v_options); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 33, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_channel_args = ((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":34
+ *             options = ()
+ *         cdef _ChannelArgs channel_args = _ChannelArgs(options)
+ *         self._target = target             # <<<<<<<<<<<<<<
+ *         self.loop = loop
+ *         self._status = AIO_CHANNEL_STATUS_READY
+ */
+  __Pyx_INCREF(__pyx_v_target);
+  __Pyx_GIVEREF(__pyx_v_target);
+  __Pyx_GOTREF(__pyx_v_self->_target);
+  __Pyx_DECREF(__pyx_v_self->_target);
+  __pyx_v_self->_target = __pyx_v_target;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":35
+ *         cdef _ChannelArgs channel_args = _ChannelArgs(options)
+ *         self._target = target
+ *         self.loop = loop             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_READY
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_v_loop);
+  __Pyx_GOTREF(__pyx_v_self->loop);
+  __Pyx_DECREF(__pyx_v_self->loop);
+  __pyx_v_self->loop = __pyx_v_loop;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":36
+ *         self._target = target
+ *         self.loop = loop
+ *         self._status = AIO_CHANNEL_STATUS_READY             # <<<<<<<<<<<<<<
+ * 
+ *         if credentials is None:
+ */
+  __pyx_v_self->_status = __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_READY;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":38
+ *         self._status = AIO_CHANNEL_STATUS_READY
+ * 
+ *         if credentials is None:             # <<<<<<<<<<<<<<
+ *             self._is_secure = False
+ *             creds = grpc_insecure_credentials_create();
+ */
+  __pyx_t_2 = (((PyObject *)__pyx_v_credentials) == Py_None);
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":39
+ * 
+ *         if credentials is None:
+ *             self._is_secure = False             # <<<<<<<<<<<<<<
+ *             creds = grpc_insecure_credentials_create();
+ *             self.channel = grpc_channel_create(<char *>target,
+ */
+    __pyx_v_self->_is_secure = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":40
+ *         if credentials is None:
+ *             self._is_secure = False
+ *             creds = grpc_insecure_credentials_create();             # <<<<<<<<<<<<<<
+ *             self.channel = grpc_channel_create(<char *>target,
+ *                 creds,
+ */
+    __pyx_v_creds = grpc_insecure_credentials_create();
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":41
+ *             self._is_secure = False
+ *             creds = grpc_insecure_credentials_create();
+ *             self.channel = grpc_channel_create(<char *>target,             # <<<<<<<<<<<<<<
+ *                 creds,
+ *                 channel_args.c_args())
+ */
+    if (unlikely(__pyx_v_target == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+      __PYX_ERR(8, 41, __pyx_L1_error)
+    }
+    __pyx_t_3 = __Pyx_PyBytes_AsWritableString(__pyx_v_target); if (unlikely((!__pyx_t_3) && PyErr_Occurred())) __PYX_ERR(8, 41, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":43
+ *             self.channel = grpc_channel_create(<char *>target,
+ *                 creds,
+ *                 channel_args.c_args())             # <<<<<<<<<<<<<<
+ *             grpc_channel_credentials_release(creds)
+ *         else:
+ */
+    __pyx_t_4 = ((struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs *)__pyx_v_channel_args->__pyx_vtab)->c_args(__pyx_v_channel_args); if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 43, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":41
+ *             self._is_secure = False
+ *             creds = grpc_insecure_credentials_create();
+ *             self.channel = grpc_channel_create(<char *>target,             # <<<<<<<<<<<<<<
+ *                 creds,
+ *                 channel_args.c_args())
+ */
+    __pyx_v_self->channel = grpc_channel_create(((char *)__pyx_t_3), __pyx_v_creds, __pyx_t_4);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":44
+ *                 creds,
+ *                 channel_args.c_args())
+ *             grpc_channel_credentials_release(creds)             # <<<<<<<<<<<<<<
+ *         else:
+ *             self._is_secure = True
+ */
+    grpc_channel_credentials_release(__pyx_v_creds);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":38
+ *         self._status = AIO_CHANNEL_STATUS_READY
+ * 
+ *         if credentials is None:             # <<<<<<<<<<<<<<
+ *             self._is_secure = False
+ *             creds = grpc_insecure_credentials_create();
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":46
+ *             grpc_channel_credentials_release(creds)
+ *         else:
+ *             self._is_secure = True             # <<<<<<<<<<<<<<
+ *             creds = <grpc_channel_credentials *> credentials.c()
+ *             self.channel = grpc_channel_create(<char *>target,
+ */
+  /*else*/ {
+    __pyx_v_self->_is_secure = 1;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":47
+ *         else:
+ *             self._is_secure = True
+ *             creds = <grpc_channel_credentials *> credentials.c()             # <<<<<<<<<<<<<<
+ *             self.channel = grpc_channel_create(<char *>target,
+ *                 creds,
+ */
+    __pyx_t_5 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials *)__pyx_v_credentials->__pyx_vtab)->c(__pyx_v_credentials); if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 47, __pyx_L1_error)
+    __pyx_v_creds = ((grpc_channel_credentials *)__pyx_t_5);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":48
+ *             self._is_secure = True
+ *             creds = <grpc_channel_credentials *> credentials.c()
+ *             self.channel = grpc_channel_create(<char *>target,             # <<<<<<<<<<<<<<
+ *                 creds,
+ *                 channel_args.c_args())
+ */
+    if (unlikely(__pyx_v_target == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found");
+      __PYX_ERR(8, 48, __pyx_L1_error)
+    }
+    __pyx_t_3 = __Pyx_PyBytes_AsWritableString(__pyx_v_target); if (unlikely((!__pyx_t_3) && PyErr_Occurred())) __PYX_ERR(8, 48, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":50
+ *             self.channel = grpc_channel_create(<char *>target,
+ *                 creds,
+ *                 channel_args.c_args())             # <<<<<<<<<<<<<<
+ *             grpc_channel_credentials_release(creds)
+ * 
+ */
+    __pyx_t_4 = ((struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs *)__pyx_v_channel_args->__pyx_vtab)->c_args(__pyx_v_channel_args); if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 50, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":48
+ *             self._is_secure = True
+ *             creds = <grpc_channel_credentials *> credentials.c()
+ *             self.channel = grpc_channel_create(<char *>target,             # <<<<<<<<<<<<<<
+ *                 creds,
+ *                 channel_args.c_args())
+ */
+    __pyx_v_self->channel = grpc_channel_create(((char *)__pyx_t_3), __pyx_v_creds, __pyx_t_4);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":51
+ *                 creds,
+ *                 channel_args.c_args())
+ *             grpc_channel_credentials_release(creds)             # <<<<<<<<<<<<<<
+ * 
+ *     def __dealloc__(self):
+ */
+    grpc_channel_credentials_release(__pyx_v_creds);
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":29
+ * 
+ * cdef class AioChannel:
+ *     def __cinit__(self, bytes target, tuple options, ChannelCredentials credentials, object loop):             # <<<<<<<<<<<<<<
+ *         init_grpc_aio()
+ *         if options is None:
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_channel_args);
+  __Pyx_XDECREF(__pyx_v_options);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":53
+ *             grpc_channel_credentials_release(creds)
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         shutdown_grpc_aio()
+ * 
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_10AioChannel_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_10AioChannel_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_10AioChannel_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_10AioChannel_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__dealloc__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":54
+ * 
+ *     def __dealloc__(self):
+ *         shutdown_grpc_aio()             # <<<<<<<<<<<<<<
+ * 
+ *     def __repr__(self):
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_shutdown_grpc_aio(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 54, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":53
+ *             grpc_channel_credentials_release(creds)
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         shutdown_grpc_aio()
+ * 
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_WriteUnraisable("_cython.cygrpc.AioChannel.__dealloc__", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":56
+ *         shutdown_grpc_aio()
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         class_name = self.__class__.__name__
+ *         id_ = id(self)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_5__repr__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_5__repr__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_4__repr__(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_4__repr__(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self) {
+  PyObject *__pyx_v_class_name = NULL;
+  PyObject *__pyx_v_id_ = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  Py_UCS4 __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__repr__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":57
+ * 
+ *     def __repr__(self):
+ *         class_name = self.__class__.__name__             # <<<<<<<<<<<<<<
+ *         id_ = id(self)
+ *         return f"<{class_name} {id_}>"
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_class); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_name_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_class_name = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":58
+ *     def __repr__(self):
+ *         class_name = self.__class__.__name__
+ *         id_ = id(self)             # <<<<<<<<<<<<<<
+ *         return f"<{class_name} {id_}>"
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 58, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_v_id_ = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":59
+ *         class_name = self.__class__.__name__
+ *         id_ = id(self)
+ *         return f"<{class_name} {id_}>"             # <<<<<<<<<<<<<<
+ * 
+ *     def check_connectivity_state(self, bint try_to_connect):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = 0;
+  __pyx_t_4 = 127;
+  __Pyx_INCREF(__pyx_kp_u__69);
+  __pyx_t_3 += 1;
+  __Pyx_GIVEREF(__pyx_kp_u__69);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_u__69);
+  __pyx_t_1 = __Pyx_PyObject_FormatSimple(__pyx_v_class_name, __pyx_empty_unicode); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_4 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_1) > __pyx_t_4) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_1) : __pyx_t_4;
+  __pyx_t_3 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
+  __pyx_t_1 = 0;
+  __Pyx_INCREF(__pyx_kp_u__70);
+  __pyx_t_3 += 1;
+  __Pyx_GIVEREF(__pyx_kp_u__70);
+  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_kp_u__70);
+  __pyx_t_1 = __Pyx_PyObject_FormatSimple(__pyx_v_id_, __pyx_empty_unicode); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_4 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_1) > __pyx_t_4) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_1) : __pyx_t_4;
+  __pyx_t_3 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_1);
+  __pyx_t_1 = 0;
+  __Pyx_INCREF(__pyx_kp_u__71);
+  __pyx_t_3 += 1;
+  __Pyx_GIVEREF(__pyx_kp_u__71);
+  PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_kp_u__71);
+  __pyx_t_1 = __Pyx_PyUnicode_Join(__pyx_t_2, 5, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 59, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":56
+ *         shutdown_grpc_aio()
+ * 
+ *     def __repr__(self):             # <<<<<<<<<<<<<<
+ *         class_name = self.__class__.__name__
+ *         id_ = id(self)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_class_name);
+  __Pyx_XDECREF(__pyx_v_id_);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":61
+ *         return f"<{class_name} {id_}>"
+ * 
+ *     def check_connectivity_state(self, bint try_to_connect):             # <<<<<<<<<<<<<<
+ *         """A Cython wrapper for Core's check connectivity state API."""
+ *         if self._status == AIO_CHANNEL_STATUS_DESTROYED:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_7check_connectivity_state(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_10AioChannel_6check_connectivity_state, "A Cython wrapper for Core's check connectivity state API.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10AioChannel_7check_connectivity_state = {"check_connectivity_state", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_7check_connectivity_state, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_10AioChannel_6check_connectivity_state};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_7check_connectivity_state(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  int __pyx_v_try_to_connect;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("check_connectivity_state (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_try_to_connect,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_try_to_connect)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 61, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "check_connectivity_state") < 0)) __PYX_ERR(8, 61, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_try_to_connect = __Pyx_PyObject_IsTrue(values[0]); if (unlikely((__pyx_v_try_to_connect == (int)-1) && PyErr_Occurred())) __PYX_ERR(8, 61, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("check_connectivity_state", 1, 1, 1, __pyx_nargs); __PYX_ERR(8, 61, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.check_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_6check_connectivity_state(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self), __pyx_v_try_to_connect);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_6check_connectivity_state(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, int __pyx_v_try_to_connect) {
+  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("check_connectivity_state", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":63
+ *     def check_connectivity_state(self, bint try_to_connect):
+ *         """A Cython wrapper for Core's check connectivity state API."""
+ *         if self._status == AIO_CHANNEL_STATUS_DESTROYED:             # <<<<<<<<<<<<<<
+ *             return ConnectivityState.shutdown
+ *         else:
+ */
+  __pyx_t_1 = (__pyx_v_self->_status == __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_DESTROYED);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":64
+ *         """A Cython wrapper for Core's check connectivity state API."""
+ *         if self._status == AIO_CHANNEL_STATUS_DESTROYED:
+ *             return ConnectivityState.shutdown             # <<<<<<<<<<<<<<
+ *         else:
+ *             return grpc_channel_check_connectivity_state(
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ConnectivityState); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 64, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_shutdown); if (unlikely(!__pyx_t_3)) __PYX_ERR(8, 64, __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;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":63
+ *     def check_connectivity_state(self, bint try_to_connect):
+ *         """A Cython wrapper for Core's check connectivity state API."""
+ *         if self._status == AIO_CHANNEL_STATUS_DESTROYED:             # <<<<<<<<<<<<<<
+ *             return ConnectivityState.shutdown
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":66
+ *             return ConnectivityState.shutdown
+ *         else:
+ *             return grpc_channel_check_connectivity_state(             # <<<<<<<<<<<<<<
+ *                 self.channel,
+ *                 try_to_connect,
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":68
+ *             return grpc_channel_check_connectivity_state(
+ *                 self.channel,
+ *                 try_to_connect,             # <<<<<<<<<<<<<<
+ *             )
+ * 
+ */
+    __pyx_t_3 = __Pyx_PyInt_From_grpc_connectivity_state(grpc_channel_check_connectivity_state(__pyx_v_self->channel, __pyx_v_try_to_connect)); if (unlikely(!__pyx_t_3)) __PYX_ERR(8, 66, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_r = __pyx_t_3;
+    __pyx_t_3 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":61
+ *         return f"<{class_name} {id_}>"
+ * 
+ *     def check_connectivity_state(self, bint try_to_connect):             # <<<<<<<<<<<<<<
+ *         """A Cython wrapper for Core's check connectivity state API."""
+ *         if self._status == AIO_CHANNEL_STATUS_DESTROYED:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.check_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_10AioChannel_10generator18(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":71
+ *             )
+ * 
+ *     async def watch_connectivity_state(self,             # <<<<<<<<<<<<<<
+ *                                        grpc_connectivity_state last_observed_state,
+ *                                        object deadline):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_9watch_connectivity_state(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_10AioChannel_8watch_connectivity_state, "Watch for one connectivity state change.\n\n        Keeps mirroring the behavior from Core, so we can easily switch to\n        other design of API if necessary.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10AioChannel_9watch_connectivity_state = {"watch_connectivity_state", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_9watch_connectivity_state, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_10AioChannel_8watch_connectivity_state};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_9watch_connectivity_state(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  grpc_connectivity_state __pyx_v_last_observed_state;
+  PyObject *__pyx_v_deadline = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("watch_connectivity_state (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_last_observed_state,&__pyx_n_s_deadline,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_last_observed_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 71, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_deadline)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 71, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("watch_connectivity_state", 1, 2, 2, 1); __PYX_ERR(8, 71, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "watch_connectivity_state") < 0)) __PYX_ERR(8, 71, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_last_observed_state = ((grpc_connectivity_state)__Pyx_PyInt_As_grpc_connectivity_state(values[0])); if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 72, __pyx_L3_error)
+    __pyx_v_deadline = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("watch_connectivity_state", 1, 2, 2, __pyx_nargs); __PYX_ERR(8, 71, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.watch_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_8watch_connectivity_state(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self), __pyx_v_last_observed_state, __pyx_v_deadline);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_8watch_connectivity_state(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, grpc_connectivity_state __pyx_v_last_observed_state, PyObject *__pyx_v_deadline) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("watch_connectivity_state", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(8, 71, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_last_observed_state = __pyx_v_last_observed_state;
+  __pyx_cur_scope->__pyx_v_deadline = __pyx_v_deadline;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_deadline);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_deadline);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_10AioChannel_10generator18, __pyx_codeobj__72, (PyObject *) __pyx_cur_scope, __pyx_n_s_watch_connectivity_state, __pyx_n_s_AioChannel_watch_connectivity_st, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(8, 71, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.watch_connectivity_state", __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_7_cython_6cygrpc_10AioChannel_10generator18(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  gpr_timespec __pyx_t_5;
+  grpc_completion_queue *__pyx_t_6;
+  grpc_completion_queue_functor *__pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("watch_connectivity_state", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L10_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(8, 71, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":79
+ *         other design of API if necessary.
+ *         """
+ *         if self._status in (AIO_CHANNEL_STATUS_DESTROYED, AIO_CHANNEL_STATUS_CLOSING):             # <<<<<<<<<<<<<<
+ *             raise UsageError('Channel is closed.')
+ * 
+ */
+  switch (__pyx_cur_scope->__pyx_v_self->_status) {
+    case __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_DESTROYED:
+    case __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_CLOSING:
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":80
+ *         """
+ *         if self._status in (AIO_CHANNEL_STATUS_DESTROYED, AIO_CHANNEL_STATUS_CLOSING):
+ *             raise UsageError('Channel is closed.')             # <<<<<<<<<<<<<<
+ * 
+ *         cdef gpr_timespec c_deadline = _timespec_from_time(deadline)
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_UsageError); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 80, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_kp_s_Channel_is_closed};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 80, __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_ERR(8, 80, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":79
+ *         other design of API if necessary.
+ *         """
+ *         if self._status in (AIO_CHANNEL_STATUS_DESTROYED, AIO_CHANNEL_STATUS_CLOSING):             # <<<<<<<<<<<<<<
+ *             raise UsageError('Channel is closed.')
+ * 
+ */
+    break;
+    default: break;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":82
+ *             raise UsageError('Channel is closed.')
+ * 
+ *         cdef gpr_timespec c_deadline = _timespec_from_time(deadline)             # <<<<<<<<<<<<<<
+ * 
+ *         cdef object future = self.loop.create_future()
+ */
+  __pyx_t_5 = __pyx_f_7_cython_6cygrpc__timespec_from_time(__pyx_cur_scope->__pyx_v_deadline); if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 82, __pyx_L1_error)
+  __pyx_cur_scope->__pyx_v_c_deadline = __pyx_t_5;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":84
+ *         cdef gpr_timespec c_deadline = _timespec_from_time(deadline)
+ * 
+ *         cdef object future = self.loop.create_future()             # <<<<<<<<<<<<<<
+ *         cdef CallbackWrapper wrapper = CallbackWrapper(
+ *             future,
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->loop, __pyx_n_s_create_future); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 84, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 84, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_future = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":85
+ * 
+ *         cdef object future = self.loop.create_future()
+ *         cdef CallbackWrapper wrapper = CallbackWrapper(             # <<<<<<<<<<<<<<
+ *             future,
+ *             self.loop,
+ */
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_future);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_future);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_v_future)) __PYX_ERR(8, 85, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_v_self->loop)) __PYX_ERR(8, 85, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_7_cython_6cygrpc__WATCH_CONNECTIVITY_FAILURE_HANDLER);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_7_cython_6cygrpc__WATCH_CONNECTIVITY_FAILURE_HANDLER);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_v_7_cython_6cygrpc__WATCH_CONNECTIVITY_FAILURE_HANDLER))) __PYX_ERR(8, 85, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackWrapper), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":93
+ *             last_observed_state,
+ *             c_deadline,
+ *             global_completion_queue(),             # <<<<<<<<<<<<<<
+ *             wrapper.c_functor())
+ * 
+ */
+  __pyx_t_6 = __pyx_f_7_cython_6cygrpc_global_completion_queue(); if (unlikely(__pyx_t_6 == ((grpc_completion_queue *)NULL) && PyErr_Occurred())) __PYX_ERR(8, 93, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":94
+ *             c_deadline,
+ *             global_completion_queue(),
+ *             wrapper.c_functor())             # <<<<<<<<<<<<<<
+ * 
+ *         try:
+ */
+  __pyx_t_7 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper *)__pyx_cur_scope->__pyx_v_wrapper->__pyx_vtab)->c_functor(__pyx_cur_scope->__pyx_v_wrapper); if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 94, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":89
+ *             self.loop,
+ *             _WATCH_CONNECTIVITY_FAILURE_HANDLER)
+ *         grpc_channel_watch_connectivity_state(             # <<<<<<<<<<<<<<
+ *             self.channel,
+ *             last_observed_state,
+ */
+  grpc_channel_watch_connectivity_state(__pyx_cur_scope->__pyx_v_self->channel, __pyx_cur_scope->__pyx_v_last_observed_state, __pyx_cur_scope->__pyx_v_c_deadline, __pyx_t_6, __pyx_t_7);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":96
+ *             wrapper.c_functor())
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             await future
+ *         except _WatchConnectivityFailed:
+ */
+  {
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":97
+ * 
+ *         try:
+ *             await future             # <<<<<<<<<<<<<<
+ *         except _WatchConnectivityFailed:
+ *             return False
+ */
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_future);
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_8;
+        __Pyx_XGIVEREF(__pyx_t_9);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_9;
+        __Pyx_XGIVEREF(__pyx_t_10);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_10;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 1;
+        return __pyx_r;
+        __pyx_L10_resume_from_await:;
+        __pyx_t_8 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_8);
+        __pyx_t_9 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_9);
+        __pyx_t_10 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_10);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(8, 97, __pyx_L4_error)
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+          else __PYX_ERR(8, 97, __pyx_L4_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":96
+ *             wrapper.c_functor())
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             await future
+ *         except _WatchConnectivityFailed:
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":101
+ *             return False
+ *         else:
+ *             return True             # <<<<<<<<<<<<<<
+ * 
+ *     def closing(self):
+ */
+    /*else:*/ {
+      __Pyx_XDECREF(__pyx_r);
+      __pyx_r = NULL; __Pyx_ReturnWithStopIteration(Py_True);
+      goto __pyx_L7_except_return;
+    }
+    __pyx_L4_error:;
+    __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;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":98
+ *         try:
+ *             await future
+ *         except _WatchConnectivityFailed:             # <<<<<<<<<<<<<<
+ *             return False
+ *         else:
+ */
+    __Pyx_ErrFetch(&__pyx_t_2, &__pyx_t_1, &__pyx_t_3);
+    __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_WatchConnectivityFailed); if (unlikely(!__pyx_t_11)) __PYX_ERR(8, 98, __pyx_L6_except_error)
+    __Pyx_GOTREF(__pyx_t_11);
+    __pyx_t_12 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_2, __pyx_t_11);
+    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+    __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_3);
+    __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_3 = 0;
+    if (__pyx_t_12) {
+      __Pyx_AddTraceback("_cython.cygrpc.AioChannel.watch_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_1, &__pyx_t_2) < 0) __PYX_ERR(8, 98, __pyx_L6_except_error)
+      __Pyx_XGOTREF(__pyx_t_3);
+      __Pyx_XGOTREF(__pyx_t_1);
+      __Pyx_XGOTREF(__pyx_t_2);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":99
+ *             await future
+ *         except _WatchConnectivityFailed:
+ *             return False             # <<<<<<<<<<<<<<
+ *         else:
+ *             return True
+ */
+      __Pyx_XDECREF(__pyx_r);
+      __pyx_r = NULL; __Pyx_ReturnWithStopIteration(Py_False);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      goto __pyx_L7_except_return;
+    }
+    goto __pyx_L6_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":96
+ *             wrapper.c_functor())
+ * 
+ *         try:             # <<<<<<<<<<<<<<
+ *             await future
+ *         except _WatchConnectivityFailed:
+ */
+    __pyx_L6_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_L7_except_return:;
+    __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_L0;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":71
+ *             )
+ * 
+ *     async def watch_connectivity_state(self,             # <<<<<<<<<<<<<<
+ *                                        grpc_connectivity_state last_observed_state,
+ *                                        object deadline):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_AddTraceback("watch_connectivity_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":103
+ *             return True
+ * 
+ *     def closing(self):             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_12closing(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10AioChannel_12closing = {"closing", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_12closing, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_12closing(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("closing (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("closing", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "closing", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_11closing(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_11closing(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("closing", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":104
+ * 
+ *     def closing(self):
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING             # <<<<<<<<<<<<<<
+ * 
+ *     def close(self):
+ */
+  __pyx_v_self->_status = __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_CLOSING;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":103
+ *             return True
+ * 
+ *     def closing(self):             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":106
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_DESTROYED
+ *         grpc_channel_destroy(self.channel)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_14close(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10AioChannel_14close = {"close", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_14close, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_14close(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("close (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("close", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "close", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_13close(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_13close(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("close", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":107
+ * 
+ *     def close(self):
+ *         self._status = AIO_CHANNEL_STATUS_DESTROYED             # <<<<<<<<<<<<<<
+ *         grpc_channel_destroy(self.channel)
+ * 
+ */
+  __pyx_v_self->_status = __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_DESTROYED;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":108
+ *     def close(self):
+ *         self._status = AIO_CHANNEL_STATUS_DESTROYED
+ *         grpc_channel_destroy(self.channel)             # <<<<<<<<<<<<<<
+ * 
+ *     def closed(self):
+ */
+  grpc_channel_destroy(__pyx_v_self->channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":106
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_DESTROYED
+ *         grpc_channel_destroy(self.channel)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":110
+ *         grpc_channel_destroy(self.channel)
+ * 
+ *     def closed(self):             # <<<<<<<<<<<<<<
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_16closed(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10AioChannel_16closed = {"closed", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_16closed, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_16closed(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("closed (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("closed", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "closed", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_15closed(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_15closed(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("closed", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":111
+ * 
+ *     def closed(self):
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)             # <<<<<<<<<<<<<<
+ * 
+ *     def call(self,
+ */
+  __Pyx_XDECREF(__pyx_r);
+  switch (__pyx_v_self->_status) {
+    case __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_CLOSING:
+    case __pyx_e_7_cython_6cygrpc_AIO_CHANNEL_STATUS_DESTROYED:
+    __pyx_t_1 = 1;
+    break;
+    default:
+    __pyx_t_1 = 0;
+    break;
+  }
+  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 111, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":110
+ *         grpc_channel_destroy(self.channel)
+ * 
+ *     def closed(self):             # <<<<<<<<<<<<<<
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.closed", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":113
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)
+ * 
+ *     def call(self,             # <<<<<<<<<<<<<<
+ *              bytes method,
+ *              object deadline,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_18call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_10AioChannel_17call, "Assembles a Cython Call object.\n\n        Returns:\n          An _AioCall object.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10AioChannel_18call = {"call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_18call, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_10AioChannel_17call};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_18call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_method = 0;
+  PyObject *__pyx_v_deadline = 0;
+  PyObject *__pyx_v_python_call_credentials = 0;
+  PyObject *__pyx_v_wait_for_ready = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[4] = {0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("call (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method,&__pyx_n_s_deadline,&__pyx_n_s_python_call_credentials,&__pyx_n_s_wait_for_ready,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 113, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_deadline)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 113, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("call", 1, 4, 4, 1); __PYX_ERR(8, 113, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_python_call_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 113, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("call", 1, 4, 4, 2); __PYX_ERR(8, 113, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_wait_for_ready)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(8, 113, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("call", 1, 4, 4, 3); __PYX_ERR(8, 113, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "call") < 0)) __PYX_ERR(8, 113, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 4)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+    }
+    __pyx_v_method = ((PyObject*)values[0]);
+    __pyx_v_deadline = values[1];
+    __pyx_v_python_call_credentials = values[2];
+    __pyx_v_wait_for_ready = values[3];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("call", 1, 4, 4, __pyx_nargs); __PYX_ERR(8, 113, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_method), (&PyBytes_Type), 1, "method", 1))) __PYX_ERR(8, 114, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_17call(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self), __pyx_v_method, __pyx_v_deadline, __pyx_v_python_call_credentials, __pyx_v_wait_for_ready);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_17call(struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, PyObject *__pyx_v_method, PyObject *__pyx_v_deadline, PyObject *__pyx_v_python_call_credentials, PyObject *__pyx_v_wait_for_ready) {
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *__pyx_v_cython_call_credentials = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":123
+ *           An _AioCall object.
+ *         """
+ *         if self.closed():             # <<<<<<<<<<<<<<
+ *             raise UsageError('Channel is closed.')
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_closed); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 123, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(8, 123, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(__pyx_t_5)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":124
+ *         """
+ *         if self.closed():
+ *             raise UsageError('Channel is closed.')             # <<<<<<<<<<<<<<
+ * 
+ *         cdef CallCredentials cython_call_credentials
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_UsageError); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 124, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_kp_s_Channel_is_closed};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 124, __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_ERR(8, 124, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":123
+ *           An _AioCall object.
+ *         """
+ *         if self.closed():             # <<<<<<<<<<<<<<
+ *             raise UsageError('Channel is closed.')
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":127
+ * 
+ *         cdef CallCredentials cython_call_credentials
+ *         if python_call_credentials is not None:             # <<<<<<<<<<<<<<
+ *             if not self._is_secure:
+ *                 raise UsageError("Call credentials are only valid on secure channels")
+ */
+  __pyx_t_5 = (__pyx_v_python_call_credentials != Py_None);
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":128
+ *         cdef CallCredentials cython_call_credentials
+ *         if python_call_credentials is not None:
+ *             if not self._is_secure:             # <<<<<<<<<<<<<<
+ *                 raise UsageError("Call credentials are only valid on secure channels")
+ * 
+ */
+    __pyx_t_5 = (!__pyx_v_self->_is_secure);
+    if (unlikely(__pyx_t_5)) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":129
+ *         if python_call_credentials is not None:
+ *             if not self._is_secure:
+ *                 raise UsageError("Call credentials are only valid on secure channels")             # <<<<<<<<<<<<<<
+ * 
+ *             cython_call_credentials = python_call_credentials._credentials
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_UsageError); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 129, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_kp_s_Call_credentials_are_only_valid};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 129, __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_ERR(8, 129, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":128
+ *         cdef CallCredentials cython_call_credentials
+ *         if python_call_credentials is not None:
+ *             if not self._is_secure:             # <<<<<<<<<<<<<<
+ *                 raise UsageError("Call credentials are only valid on secure channels")
+ * 
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":131
+ *                 raise UsageError("Call credentials are only valid on secure channels")
+ * 
+ *             cython_call_credentials = python_call_credentials._credentials             # <<<<<<<<<<<<<<
+ *         else:
+ *             cython_call_credentials = None
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_python_call_credentials, __pyx_n_s_credentials_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 131, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7_cython_6cygrpc_CallCredentials))))) __PYX_ERR(8, 131, __pyx_L1_error)
+    __pyx_v_cython_call_credentials = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":127
+ * 
+ *         cdef CallCredentials cython_call_credentials
+ *         if python_call_credentials is not None:             # <<<<<<<<<<<<<<
+ *             if not self._is_secure:
+ *                 raise UsageError("Call credentials are only valid on secure channels")
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":133
+ *             cython_call_credentials = python_call_credentials._credentials
+ *         else:
+ *             cython_call_credentials = None             # <<<<<<<<<<<<<<
+ * 
+ *         return _AioCall(self, deadline, method, cython_call_credentials, wait_for_ready)
+ */
+  /*else*/ {
+    __Pyx_INCREF(Py_None);
+    __pyx_v_cython_call_credentials = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)Py_None);
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":135
+ *             cython_call_credentials = None
+ * 
+ *         return _AioCall(self, deadline, method, cython_call_credentials, wait_for_ready)             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 135, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_self);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self))) __PYX_ERR(8, 135, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_deadline);
+  __Pyx_GIVEREF(__pyx_v_deadline);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_deadline)) __PYX_ERR(8, 135, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_method);
+  __Pyx_GIVEREF(__pyx_v_method);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_method)) __PYX_ERR(8, 135, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_cython_call_credentials);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_cython_call_credentials);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, ((PyObject *)__pyx_v_cython_call_credentials))) __PYX_ERR(8, 135, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_wait_for_ready);
+  __Pyx_GIVEREF(__pyx_v_wait_for_ready);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_wait_for_ready)) __PYX_ERR(8, 135, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 135, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":113
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)
+ * 
+ *     def call(self,             # <<<<<<<<<<<<<<
+ *              bytes method,
+ *              object deadline,
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_cython_call_credentials);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_20__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10AioChannel_20__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_20__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_20__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_19__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_19__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_22__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_10AioChannel_22__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_22__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_10AioChannel_22__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_10AioChannel_21__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_10AioChannel_21__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_AioChannel *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioChannel.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":25
+ * cdef str _SERVER_STOPPED_DETAILS = 'Server already stopped.'
+ * 
+ * cdef _augment_metadata(tuple metadata, object compression):             # <<<<<<<<<<<<<<
+ *     if compression is None:
+ *         return metadata
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__augment_metadata(PyObject *__pyx_v_metadata, PyObject *__pyx_v_compression) {
+  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("_augment_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":26
+ * 
+ * cdef _augment_metadata(tuple metadata, object compression):
+ *     if compression is None:             # <<<<<<<<<<<<<<
+ *         return metadata
+ *     else:
+ */
+  __pyx_t_1 = (__pyx_v_compression == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":27
+ * cdef _augment_metadata(tuple metadata, object compression):
+ *     if compression is None:
+ *         return metadata             # <<<<<<<<<<<<<<
+ *     else:
+ *         return ((
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(__pyx_v_metadata);
+    __pyx_r = __pyx_v_metadata;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":26
+ * 
+ * cdef _augment_metadata(tuple metadata, object compression):
+ *     if compression is None:             # <<<<<<<<<<<<<<
+ *         return metadata
+ *     else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":29
+ *         return metadata
+ *     else:
+ *         return ((             # <<<<<<<<<<<<<<
+ *             GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY,
+ *             _COMPRESSION_METADATA_STRING_MAPPING[compression]
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":30
+ *     else:
+ *         return ((
+ *             GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY,             # <<<<<<<<<<<<<<
+ *             _COMPRESSION_METADATA_STRING_MAPPING[compression]
+ *         ),) + metadata
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_GRPC_COMPRESSION_REQUEST_ALGORIT); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 30, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":31
+ *         return ((
+ *             GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY,
+ *             _COMPRESSION_METADATA_STRING_MAPPING[compression]             # <<<<<<<<<<<<<<
+ *         ),) + metadata
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_COMPRESSION_METADATA_STRING_MAP); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 31, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetItem(__pyx_t_3, __pyx_v_compression); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 31, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":30
+ *     else:
+ *         return ((
+ *             GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY,             # <<<<<<<<<<<<<<
+ *             _COMPRESSION_METADATA_STRING_MAPPING[compression]
+ *         ),) + metadata
+ */
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 30, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_2);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2)) __PYX_ERR(9, 30, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_4);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4)) __PYX_ERR(9, 30, __pyx_L1_error);
+    __pyx_t_2 = 0;
+    __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":29
+ *         return metadata
+ *     else:
+ *         return ((             # <<<<<<<<<<<<<<
+ *             GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY,
+ *             _COMPRESSION_METADATA_STRING_MAPPING[compression]
+ */
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 29, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_3);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(9, 29, __pyx_L1_error);
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":32
+ *             GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY,
+ *             _COMPRESSION_METADATA_STRING_MAPPING[compression]
+ *         ),) + metadata             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __pyx_t_3 = PyNumber_Add(__pyx_t_4, __pyx_v_metadata); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 32, __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;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":25
+ * cdef str _SERVER_STOPPED_DETAILS = 'Server already stopped.'
+ * 
+ * cdef _augment_metadata(tuple metadata, object compression):             # <<<<<<<<<<<<<<
+ *     if compression is None:
+ *         return metadata
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._augment_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":36
+ * 
+ * cdef class _HandlerCallDetails:
+ *     def __cinit__(self, str method, tuple invocation_metadata):             # <<<<<<<<<<<<<<
+ *         self.method = method
+ *         self.invocation_metadata = invocation_metadata
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_method = 0;
+  PyObject *__pyx_v_invocation_metadata = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method,&__pyx_n_s_invocation_metadata,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 36, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_invocation_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 36, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(9, 36, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(9, 36, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+    }
+    __pyx_v_method = ((PyObject*)values[0]);
+    __pyx_v_invocation_metadata = ((PyObject*)values[1]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(9, 36, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._HandlerCallDetails.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_method), (&PyString_Type), 1, "method", 1))) __PYX_ERR(9, 36, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_invocation_metadata), (&PyTuple_Type), 1, "invocation_metadata", 1))) __PYX_ERR(9, 36, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails___cinit__(((struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)__pyx_v_self), __pyx_v_method, __pyx_v_invocation_metadata);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails___cinit__(struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self, PyObject *__pyx_v_method, PyObject *__pyx_v_invocation_metadata) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":37
+ * cdef class _HandlerCallDetails:
+ *     def __cinit__(self, str method, tuple invocation_metadata):
+ *         self.method = method             # <<<<<<<<<<<<<<
+ *         self.invocation_metadata = invocation_metadata
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_method);
+  __Pyx_GIVEREF(__pyx_v_method);
+  __Pyx_GOTREF(__pyx_v_self->method);
+  __Pyx_DECREF(__pyx_v_self->method);
+  __pyx_v_self->method = __pyx_v_method;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":38
+ *     def __cinit__(self, str method, tuple invocation_metadata):
+ *         self.method = method
+ *         self.invocation_metadata = invocation_metadata             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_invocation_metadata);
+  __Pyx_GIVEREF(__pyx_v_invocation_metadata);
+  __Pyx_GOTREF(__pyx_v_self->invocation_metadata);
+  __Pyx_DECREF(__pyx_v_self->invocation_metadata);
+  __pyx_v_self->invocation_metadata = __pyx_v_invocation_metadata;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":36
+ * 
+ * cdef class _HandlerCallDetails:
+ *     def __cinit__(self, str method, tuple invocation_metadata):             # <<<<<<<<<<<<<<
+ *         self.method = method
+ *         self.invocation_metadata = invocation_metadata
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":16
+ * 
+ * cdef class _HandlerCallDetails:
+ *     cdef readonly str method             # <<<<<<<<<<<<<<
+ *     cdef readonly tuple invocation_metadata
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_6method_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_6method_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_6method___get__(((struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_6method___get__(struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->method);
+  __pyx_r = __pyx_v_self->method;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi":17
+ * cdef class _HandlerCallDetails:
+ *     cdef readonly str method
+ *     cdef readonly tuple invocation_metadata             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_19invocation_metadata_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_19invocation_metadata_1__get__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_19invocation_metadata___get__(((struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_19invocation_metadata___get__(struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 1);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->invocation_metadata);
+  __pyx_r = __pyx_v_self->invocation_metadata;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19_HandlerCallDetails_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_3__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_2__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._HandlerCallDetails.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_19_HandlerCallDetails_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_5__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._HandlerCallDetails.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_4__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_19_HandlerCallDetails_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._HandlerCallDetails.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":47
+ * cdef class RPCState:
+ * 
+ *     def __cinit__(self, AioServer server):             # <<<<<<<<<<<<<<
+ *         init_grpc_aio()
+ *         self.call = NULL
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_8RPCState_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_8RPCState_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_server = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_server,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_server)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 47, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(9, 47, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_server = ((struct __pyx_obj_7_cython_6cygrpc_AioServer *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 47, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_server), __pyx_ptype_7_cython_6cygrpc_AioServer, 1, "server", 0))) __PYX_ERR(9, 47, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8RPCState___cinit__(((struct __pyx_obj_7_cython_6cygrpc_RPCState *)__pyx_v_self), __pyx_v_server);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_8RPCState___cinit__(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_server) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  grpc_status_code __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":48
+ * 
+ *     def __cinit__(self, AioServer server):
+ *         init_grpc_aio()             # <<<<<<<<<<<<<<
+ *         self.call = NULL
+ *         self.server = server
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_init_grpc_aio(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 48, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":49
+ *     def __cinit__(self, AioServer server):
+ *         init_grpc_aio()
+ *         self.call = NULL             # <<<<<<<<<<<<<<
+ *         self.server = server
+ *         grpc_metadata_array_init(&self.request_metadata)
+ */
+  __pyx_v_self->__pyx_base.call = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":50
+ *         init_grpc_aio()
+ *         self.call = NULL
+ *         self.server = server             # <<<<<<<<<<<<<<
+ *         grpc_metadata_array_init(&self.request_metadata)
+ *         grpc_call_details_init(&self.details)
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_server);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_server);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->server);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->server);
+  __pyx_v_self->server = __pyx_v_server;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":51
+ *         self.call = NULL
+ *         self.server = server
+ *         grpc_metadata_array_init(&self.request_metadata)             # <<<<<<<<<<<<<<
+ *         grpc_call_details_init(&self.details)
+ *         self.client_closed = False
+ */
+  grpc_metadata_array_init((&__pyx_v_self->request_metadata));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":52
+ *         self.server = server
+ *         grpc_metadata_array_init(&self.request_metadata)
+ *         grpc_call_details_init(&self.details)             # <<<<<<<<<<<<<<
+ *         self.client_closed = False
+ *         self.abort_exception = None
+ */
+  grpc_call_details_init((&__pyx_v_self->details));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":53
+ *         grpc_metadata_array_init(&self.request_metadata)
+ *         grpc_call_details_init(&self.details)
+ *         self.client_closed = False             # <<<<<<<<<<<<<<
+ *         self.abort_exception = None
+ *         self.metadata_sent = False
+ */
+  __pyx_v_self->client_closed = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":54
+ *         grpc_call_details_init(&self.details)
+ *         self.client_closed = False
+ *         self.abort_exception = None             # <<<<<<<<<<<<<<
+ *         self.metadata_sent = False
+ *         self.status_sent = False
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->abort_exception);
+  __Pyx_DECREF(__pyx_v_self->abort_exception);
+  __pyx_v_self->abort_exception = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":55
+ *         self.client_closed = False
+ *         self.abort_exception = None
+ *         self.metadata_sent = False             # <<<<<<<<<<<<<<
+ *         self.status_sent = False
+ *         self.status_code = StatusCode.ok
+ */
+  __pyx_v_self->metadata_sent = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":56
+ *         self.abort_exception = None
+ *         self.metadata_sent = False
+ *         self.status_sent = False             # <<<<<<<<<<<<<<
+ *         self.status_code = StatusCode.ok
+ *         self.py_status_code = None
+ */
+  __pyx_v_self->status_sent = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":57
+ *         self.metadata_sent = False
+ *         self.status_sent = False
+ *         self.status_code = StatusCode.ok             # <<<<<<<<<<<<<<
+ *         self.py_status_code = None
+ *         self.status_details = ''
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ok); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_3 = ((grpc_status_code)__Pyx_PyInt_As_grpc_status_code(__pyx_t_2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 57, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_self->status_code = __pyx_t_3;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":58
+ *         self.status_sent = False
+ *         self.status_code = StatusCode.ok
+ *         self.py_status_code = None             # <<<<<<<<<<<<<<
+ *         self.status_details = ''
+ *         self.trailing_metadata = _IMMUTABLE_EMPTY_METADATA
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->py_status_code);
+  __Pyx_DECREF(__pyx_v_self->py_status_code);
+  __pyx_v_self->py_status_code = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":59
+ *         self.status_code = StatusCode.ok
+ *         self.py_status_code = None
+ *         self.status_details = ''             # <<<<<<<<<<<<<<
+ *         self.trailing_metadata = _IMMUTABLE_EMPTY_METADATA
+ *         self.compression_algorithm = None
+ */
+  __Pyx_INCREF(__pyx_kp_s__7);
+  __Pyx_GIVEREF(__pyx_kp_s__7);
+  __Pyx_GOTREF(__pyx_v_self->status_details);
+  __Pyx_DECREF(__pyx_v_self->status_details);
+  __pyx_v_self->status_details = __pyx_kp_s__7;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":60
+ *         self.py_status_code = None
+ *         self.status_details = ''
+ *         self.trailing_metadata = _IMMUTABLE_EMPTY_METADATA             # <<<<<<<<<<<<<<
+ *         self.compression_algorithm = None
+ *         self.disable_next_compression = False
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 60, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(9, 60, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->trailing_metadata);
+  __Pyx_DECREF(__pyx_v_self->trailing_metadata);
+  __pyx_v_self->trailing_metadata = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":61
+ *         self.status_details = ''
+ *         self.trailing_metadata = _IMMUTABLE_EMPTY_METADATA
+ *         self.compression_algorithm = None             # <<<<<<<<<<<<<<
+ *         self.disable_next_compression = False
+ *         self.callbacks = []
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->compression_algorithm);
+  __Pyx_DECREF(__pyx_v_self->compression_algorithm);
+  __pyx_v_self->compression_algorithm = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":62
+ *         self.trailing_metadata = _IMMUTABLE_EMPTY_METADATA
+ *         self.compression_algorithm = None
+ *         self.disable_next_compression = False             # <<<<<<<<<<<<<<
+ *         self.callbacks = []
+ * 
+ */
+  __pyx_v_self->disable_next_compression = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":63
+ *         self.compression_algorithm = None
+ *         self.disable_next_compression = False
+ *         self.callbacks = []             # <<<<<<<<<<<<<<
+ * 
+ *     cdef bytes method(self):
+ */
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 63, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->callbacks);
+  __Pyx_DECREF(__pyx_v_self->callbacks);
+  __pyx_v_self->callbacks = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":47
+ * cdef class RPCState:
+ * 
+ *     def __cinit__(self, AioServer server):             # <<<<<<<<<<<<<<
+ *         init_grpc_aio()
+ *         self.call = NULL
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":65
+ *         self.callbacks = []
+ * 
+ *     cdef bytes method(self):             # <<<<<<<<<<<<<<
+ *         return _slice_bytes(self.details.method)
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_8RPCState_method(struct __pyx_obj_7_cython_6cygrpc_RPCState *__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("method", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":66
+ * 
+ *     cdef bytes method(self):
+ *         return _slice_bytes(self.details.method)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef tuple invocation_metadata(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__slice_bytes(__pyx_v_self->details.method); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 66, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":65
+ *         self.callbacks = []
+ * 
+ *     cdef bytes method(self):             # <<<<<<<<<<<<<<
+ *         return _slice_bytes(self.details.method)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.method", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":68
+ *         return _slice_bytes(self.details.method)
+ * 
+ *     cdef tuple invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return _metadata(&self.request_metadata)
+ * 
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_8RPCState_invocation_metadata(struct __pyx_obj_7_cython_6cygrpc_RPCState *__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("invocation_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":69
+ * 
+ *     cdef tuple invocation_metadata(self):
+ *         return _metadata(&self.request_metadata)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef void raise_for_termination(self) except *:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__metadata((&__pyx_v_self->request_metadata)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":68
+ *         return _slice_bytes(self.details.method)
+ * 
+ *     cdef tuple invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return _metadata(&self.request_metadata)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.invocation_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":71
+ *         return _metadata(&self.request_metadata)
+ * 
+ *     cdef void raise_for_termination(self) except *:             # <<<<<<<<<<<<<<
+ *         """Raise exceptions if RPC is not running.
+ * 
+ */
+
+static void __pyx_f_7_cython_6cygrpc_8RPCState_raise_for_termination(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("raise_for_termination", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":81
+ *         into Core functions, otherwise, segfault.
+ *         """
+ *         if self.abort_exception is not None:             # <<<<<<<<<<<<<<
+ *             raise self.abort_exception
+ *         if self.status_sent:
+ */
+  __pyx_t_1 = (__pyx_v_self->abort_exception != Py_None);
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":82
+ *         """
+ *         if self.abort_exception is not None:
+ *             raise self.abort_exception             # <<<<<<<<<<<<<<
+ *         if self.status_sent:
+ *             raise UsageError(_RPC_FINISHED_DETAILS)
+ */
+    __Pyx_Raise(__pyx_v_self->abort_exception, 0, 0, 0);
+    __PYX_ERR(9, 82, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":81
+ *         into Core functions, otherwise, segfault.
+ *         """
+ *         if self.abort_exception is not None:             # <<<<<<<<<<<<<<
+ *             raise self.abort_exception
+ *         if self.status_sent:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":83
+ *         if self.abort_exception is not None:
+ *             raise self.abort_exception
+ *         if self.status_sent:             # <<<<<<<<<<<<<<
+ *             raise UsageError(_RPC_FINISHED_DETAILS)
+ *         if self.server._status == AIO_SERVER_STATUS_STOPPED:
+ */
+  if (unlikely(__pyx_v_self->status_sent)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":84
+ *             raise self.abort_exception
+ *         if self.status_sent:
+ *             raise UsageError(_RPC_FINISHED_DETAILS)             # <<<<<<<<<<<<<<
+ *         if self.server._status == AIO_SERVER_STATUS_STOPPED:
+ *             raise _ServerStoppedError(_SERVER_STOPPED_DETAILS)
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_UsageError); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 84, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_7_cython_6cygrpc__RPC_FINISHED_DETAILS};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 84, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(9, 84, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":83
+ *         if self.abort_exception is not None:
+ *             raise self.abort_exception
+ *         if self.status_sent:             # <<<<<<<<<<<<<<
+ *             raise UsageError(_RPC_FINISHED_DETAILS)
+ *         if self.server._status == AIO_SERVER_STATUS_STOPPED:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":85
+ *         if self.status_sent:
+ *             raise UsageError(_RPC_FINISHED_DETAILS)
+ *         if self.server._status == AIO_SERVER_STATUS_STOPPED:             # <<<<<<<<<<<<<<
+ *             raise _ServerStoppedError(_SERVER_STOPPED_DETAILS)
+ * 
+ */
+  __pyx_t_1 = (__pyx_v_self->server->_status == __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPED);
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":86
+ *             raise UsageError(_RPC_FINISHED_DETAILS)
+ *         if self.server._status == AIO_SERVER_STATUS_STOPPED:
+ *             raise _ServerStoppedError(_SERVER_STOPPED_DETAILS)             # <<<<<<<<<<<<<<
+ * 
+ *     cdef int get_write_flag(self):
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_ServerStoppedError); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 86, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_7_cython_6cygrpc__SERVER_STOPPED_DETAILS};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 86, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(9, 86, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":85
+ *         if self.status_sent:
+ *             raise UsageError(_RPC_FINISHED_DETAILS)
+ *         if self.server._status == AIO_SERVER_STATUS_STOPPED:             # <<<<<<<<<<<<<<
+ *             raise _ServerStoppedError(_SERVER_STOPPED_DETAILS)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":71
+ *         return _metadata(&self.request_metadata)
+ * 
+ *     cdef void raise_for_termination(self) except *:             # <<<<<<<<<<<<<<
+ *         """Raise exceptions if RPC is not running.
+ * 
+ */
+
+  /* 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("_cython.cygrpc.RPCState.raise_for_termination", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":88
+ *             raise _ServerStoppedError(_SERVER_STOPPED_DETAILS)
+ * 
+ *     cdef int get_write_flag(self):             # <<<<<<<<<<<<<<
+ *         if self.disable_next_compression:
+ *             self.disable_next_compression = False
+ */
+
+static int __pyx_f_7_cython_6cygrpc_8RPCState_get_write_flag(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_write_flag", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":89
+ * 
+ *     cdef int get_write_flag(self):
+ *         if self.disable_next_compression:             # <<<<<<<<<<<<<<
+ *             self.disable_next_compression = False
+ *             return WriteFlag.no_compress
+ */
+  if (__pyx_v_self->disable_next_compression) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":90
+ *     cdef int get_write_flag(self):
+ *         if self.disable_next_compression:
+ *             self.disable_next_compression = False             # <<<<<<<<<<<<<<
+ *             return WriteFlag.no_compress
+ *         else:
+ */
+    __pyx_v_self->disable_next_compression = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":91
+ *         if self.disable_next_compression:
+ *             self.disable_next_compression = False
+ *             return WriteFlag.no_compress             # <<<<<<<<<<<<<<
+ *         else:
+ *             return _EMPTY_FLAG
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_WriteFlag); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 91, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_no_compress); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 91, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(9, 91, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_r = __pyx_t_3;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":89
+ * 
+ *     cdef int get_write_flag(self):
+ *         if self.disable_next_compression:             # <<<<<<<<<<<<<<
+ *             self.disable_next_compression = False
+ *             return WriteFlag.no_compress
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":93
+ *             return WriteFlag.no_compress
+ *         else:
+ *             return _EMPTY_FLAG             # <<<<<<<<<<<<<<
+ * 
+ *     cdef Operation create_send_initial_metadata_op_if_not_sent(self):
+ */
+  /*else*/ {
+    __pyx_r = __pyx_v_7_cython_6cygrpc__EMPTY_FLAG;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":88
+ *             raise _ServerStoppedError(_SERVER_STOPPED_DETAILS)
+ * 
+ *     cdef int get_write_flag(self):             # <<<<<<<<<<<<<<
+ *         if self.disable_next_compression:
+ *             self.disable_next_compression = False
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.get_write_flag", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":95
+ *             return _EMPTY_FLAG
+ * 
+ *     cdef Operation create_send_initial_metadata_op_if_not_sent(self):             # <<<<<<<<<<<<<<
+ *         cdef SendInitialMetadataOperation op
+ *         if self.metadata_sent:
+ */
+
+static struct __pyx_obj_7_cython_6cygrpc_Operation *__pyx_f_7_cython_6cygrpc_8RPCState_create_send_initial_metadata_op_if_not_sent(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *__pyx_v_op = 0;
+  struct __pyx_obj_7_cython_6cygrpc_Operation *__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("create_send_initial_metadata_op_if_not_sent", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":97
+ *     cdef Operation create_send_initial_metadata_op_if_not_sent(self):
+ *         cdef SendInitialMetadataOperation op
+ *         if self.metadata_sent:             # <<<<<<<<<<<<<<
+ *             return None
+ *         else:
+ */
+  if (__pyx_v_self->metadata_sent) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":98
+ *         cdef SendInitialMetadataOperation op
+ *         if self.metadata_sent:
+ *             return None             # <<<<<<<<<<<<<<
+ *         else:
+ *             op = SendInitialMetadataOperation(
+ */
+    __Pyx_XDECREF((PyObject *)__pyx_r);
+    __pyx_r = ((struct __pyx_obj_7_cython_6cygrpc_Operation *)Py_None); __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":97
+ *     cdef Operation create_send_initial_metadata_op_if_not_sent(self):
+ *         cdef SendInitialMetadataOperation op
+ *         if self.metadata_sent:             # <<<<<<<<<<<<<<
+ *             return None
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":100
+ *             return None
+ *         else:
+ *             op = SendInitialMetadataOperation(             # <<<<<<<<<<<<<<
+ *                 _augment_metadata(_IMMUTABLE_EMPTY_METADATA, self.compression_algorithm),
+ *                 _EMPTY_FLAG
+ */
+  /*else*/ {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":101
+ *         else:
+ *             op = SendInitialMetadataOperation(
+ *                 _augment_metadata(_IMMUTABLE_EMPTY_METADATA, self.compression_algorithm),             # <<<<<<<<<<<<<<
+ *                 _EMPTY_FLAG
+ *             )
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 101, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(9, 101, __pyx_L1_error)
+    __pyx_t_2 = __pyx_v_self->compression_algorithm;
+    __Pyx_INCREF(__pyx_t_2);
+    __pyx_t_3 = __pyx_f_7_cython_6cygrpc__augment_metadata(((PyObject*)__pyx_t_1), __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 101, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":102
+ *             op = SendInitialMetadataOperation(
+ *                 _augment_metadata(_IMMUTABLE_EMPTY_METADATA, self.compression_algorithm),
+ *                 _EMPTY_FLAG             # <<<<<<<<<<<<<<
+ *             )
+ *             return op
+ */
+    __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_7_cython_6cygrpc__EMPTY_FLAG); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 102, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":100
+ *             return None
+ *         else:
+ *             op = SendInitialMetadataOperation(             # <<<<<<<<<<<<<<
+ *                 _augment_metadata(_IMMUTABLE_EMPTY_METADATA, self.compression_algorithm),
+ *                 _EMPTY_FLAG
+ */
+    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 100, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_3);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3)) __PYX_ERR(9, 100, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_2);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2)) __PYX_ERR(9, 100, __pyx_L1_error);
+    __pyx_t_3 = 0;
+    __pyx_t_2 = 0;
+    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 100, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)__pyx_t_2);
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":104
+ *                 _EMPTY_FLAG
+ *             )
+ *             return op             # <<<<<<<<<<<<<<
+ * 
+ *     def __dealloc__(self):
+ */
+    __Pyx_XDECREF((PyObject *)__pyx_r);
+    __Pyx_INCREF((PyObject *)__pyx_v_op);
+    __pyx_r = ((struct __pyx_obj_7_cython_6cygrpc_Operation *)__pyx_v_op);
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":95
+ *             return _EMPTY_FLAG
+ * 
+ *     cdef Operation create_send_initial_metadata_op_if_not_sent(self):             # <<<<<<<<<<<<<<
+ *         cdef SendInitialMetadataOperation op
+ *         if self.metadata_sent:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.create_send_initial_metadata_op_if_not_sent", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_op);
+  __Pyx_XGIVEREF((PyObject *)__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":106
+ *             return op
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         """Cleans the Core objects."""
+ *         grpc_call_details_destroy(&self.details)
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_8RPCState_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_8RPCState_3__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_8RPCState_2__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_RPCState *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_8RPCState_2__dealloc__(struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__dealloc__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":108
+ *     def __dealloc__(self):
+ *         """Cleans the Core objects."""
+ *         grpc_call_details_destroy(&self.details)             # <<<<<<<<<<<<<<
+ *         grpc_metadata_array_destroy(&self.request_metadata)
+ *         if self.call:
+ */
+  grpc_call_details_destroy((&__pyx_v_self->details));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":109
+ *         """Cleans the Core objects."""
+ *         grpc_call_details_destroy(&self.details)
+ *         grpc_metadata_array_destroy(&self.request_metadata)             # <<<<<<<<<<<<<<
+ *         if self.call:
+ *             grpc_call_unref(self.call)
+ */
+  grpc_metadata_array_destroy((&__pyx_v_self->request_metadata));
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":110
+ *         grpc_call_details_destroy(&self.details)
+ *         grpc_metadata_array_destroy(&self.request_metadata)
+ *         if self.call:             # <<<<<<<<<<<<<<
+ *             grpc_call_unref(self.call)
+ *         shutdown_grpc_aio()
+ */
+  __pyx_t_1 = (__pyx_v_self->__pyx_base.call != 0);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":111
+ *         grpc_metadata_array_destroy(&self.request_metadata)
+ *         if self.call:
+ *             grpc_call_unref(self.call)             # <<<<<<<<<<<<<<
+ *         shutdown_grpc_aio()
+ * 
+ */
+    grpc_call_unref(__pyx_v_self->__pyx_base.call);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":110
+ *         grpc_call_details_destroy(&self.details)
+ *         grpc_metadata_array_destroy(&self.request_metadata)
+ *         if self.call:             # <<<<<<<<<<<<<<
+ *             grpc_call_unref(self.call)
+ *         shutdown_grpc_aio()
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":112
+ *         if self.call:
+ *             grpc_call_unref(self.call)
+ *         shutdown_grpc_aio()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc_shutdown_grpc_aio(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 112, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":106
+ *             return op
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         """Cleans the Core objects."""
+ *         grpc_call_details_destroy(&self.details)
+ */
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_WriteUnraisable("_cython.cygrpc.RPCState.__dealloc__", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8RPCState_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8RPCState_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8RPCState_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8RPCState_5__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8RPCState_4__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_RPCState *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8RPCState_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_8RPCState_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_8RPCState_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8RPCState_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_8RPCState_7__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_8RPCState_6__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_RPCState *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_8RPCState_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.RPCState.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":117
+ * cdef class _ServicerContext:
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *                   RPCState rpc_state,
+ *                   object request_deserializer,
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_16_ServicerContext_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_16_ServicerContext_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_request_deserializer = 0;
+  PyObject *__pyx_v_response_serializer = 0;
+  PyObject *__pyx_v_loop = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[4] = {0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rpc_state,&__pyx_n_s_request_deserializer,&__pyx_n_s_response_serializer,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 117, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_request_deserializer)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 117, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 1); __PYX_ERR(9, 117, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_response_serializer)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 117, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 2); __PYX_ERR(9, 117, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 117, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, 3); __PYX_ERR(9, 117, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(9, 117, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 4)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+      values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+    }
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[0]);
+    __pyx_v_request_deserializer = values[1];
+    __pyx_v_response_serializer = values[2];
+    __pyx_v_loop = values[3];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 4, 4, __pyx_nargs); __PYX_ERR(9, 117, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 118, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext___cinit__(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_rpc_state, __pyx_v_request_deserializer, __pyx_v_response_serializer, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_16_ServicerContext___cinit__(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_request_deserializer, PyObject *__pyx_v_response_serializer, PyObject *__pyx_v_loop) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":122
+ *                   object response_serializer,
+ *                   object loop):
+ *         self._rpc_state = rpc_state             # <<<<<<<<<<<<<<
+ *         self._request_deserializer = request_deserializer
+ *         self._response_serializer = response_serializer
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_rpc_state);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_rpc_state);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_rpc_state);
+  __pyx_v_self->_rpc_state = __pyx_v_rpc_state;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":123
+ *                   object loop):
+ *         self._rpc_state = rpc_state
+ *         self._request_deserializer = request_deserializer             # <<<<<<<<<<<<<<
+ *         self._response_serializer = response_serializer
+ *         self._loop = loop
+ */
+  __Pyx_INCREF(__pyx_v_request_deserializer);
+  __Pyx_GIVEREF(__pyx_v_request_deserializer);
+  __Pyx_GOTREF(__pyx_v_self->_request_deserializer);
+  __Pyx_DECREF(__pyx_v_self->_request_deserializer);
+  __pyx_v_self->_request_deserializer = __pyx_v_request_deserializer;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":124
+ *         self._rpc_state = rpc_state
+ *         self._request_deserializer = request_deserializer
+ *         self._response_serializer = response_serializer             # <<<<<<<<<<<<<<
+ *         self._loop = loop
+ * 
+ */
+  __Pyx_INCREF(__pyx_v_response_serializer);
+  __Pyx_GIVEREF(__pyx_v_response_serializer);
+  __Pyx_GOTREF(__pyx_v_self->_response_serializer);
+  __Pyx_DECREF(__pyx_v_self->_response_serializer);
+  __pyx_v_self->_response_serializer = __pyx_v_response_serializer;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":125
+ *         self._request_deserializer = request_deserializer
+ *         self._response_serializer = response_serializer
+ *         self._loop = loop             # <<<<<<<<<<<<<<
+ * 
+ *     async def read(self):
+ */
+  __Pyx_INCREF(__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_v_loop);
+  __Pyx_GOTREF(__pyx_v_self->_loop);
+  __Pyx_DECREF(__pyx_v_self->_loop);
+  __pyx_v_self->_loop = __pyx_v_loop;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":117
+ * cdef class _ServicerContext:
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *                   RPCState rpc_state,
+ *                   object request_deserializer,
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_16_ServicerContext_4generator19(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":127
+ *         self._loop = loop
+ * 
+ *     async def read(self):             # <<<<<<<<<<<<<<
+ *         cdef bytes raw_message
+ *         self._rpc_state.raise_for_termination()
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_3read(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_3read = {"read", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_3read, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_3read(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("read", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "read", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_2read(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_2read(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_29_read(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 127, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_16_ServicerContext_4generator19, __pyx_codeobj__73, (PyObject *) __pyx_cur_scope, __pyx_n_s_read, __pyx_n_s_ServicerContext_read, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 127, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.read", __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_7_cython_6cygrpc_16_ServicerContext_4generator19(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 127, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":129
+ *     async def read(self):
+ *         cdef bytes raw_message
+ *         self._rpc_state.raise_for_termination()             # <<<<<<<<<<<<<<
+ * 
+ *         raw_message = await _receive_message(self._rpc_state, self._loop)
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_self->_rpc_state->__pyx_vtab)->raise_for_termination(__pyx_cur_scope->__pyx_v_self->_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 129, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":131
+ *         self._rpc_state.raise_for_termination()
+ * 
+ *         raw_message = await _receive_message(self._rpc_state, self._loop)             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_receive_message); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 131, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self->_rpc_state), __pyx_cur_scope->__pyx_v_self->_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 131, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 131, __pyx_L1_error)
+    __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+  } else {
+    __pyx_t_1 = NULL;
+    if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 131, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+  }
+  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_1))) __PYX_ERR(9, 131, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_raw_message = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":132
+ * 
+ *         raw_message = await _receive_message(self._rpc_state, self._loop)
+ *         self._rpc_state.raise_for_termination()             # <<<<<<<<<<<<<<
+ * 
+ *         if raw_message is None:
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_self->_rpc_state->__pyx_vtab)->raise_for_termination(__pyx_cur_scope->__pyx_v_self->_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 132, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":134
+ *         self._rpc_state.raise_for_termination()
+ * 
+ *         if raw_message is None:             # <<<<<<<<<<<<<<
+ *             return EOF
+ *         else:
+ */
+  __pyx_t_5 = (__pyx_cur_scope->__pyx_v_raw_message == ((PyObject*)Py_None));
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":135
+ * 
+ *         if raw_message is None:
+ *             return EOF             # <<<<<<<<<<<<<<
+ *         else:
+ *             return deserialize(self._request_deserializer,
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EOF); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 135, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":134
+ *         self._rpc_state.raise_for_termination()
+ * 
+ *         if raw_message is None:             # <<<<<<<<<<<<<<
+ *             return EOF
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":137
+ *             return EOF
+ *         else:
+ *             return deserialize(self._request_deserializer,             # <<<<<<<<<<<<<<
+ *                             raw_message)
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->_request_deserializer;
+    __Pyx_INCREF(__pyx_t_1);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":138
+ *         else:
+ *             return deserialize(self._request_deserializer,
+ *                             raw_message)             # <<<<<<<<<<<<<<
+ * 
+ *     async def write(self, object message):
+ */
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc_deserialize(__pyx_t_1, __pyx_cur_scope->__pyx_v_raw_message); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 137, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L0;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":127
+ *         self._loop = loop
+ * 
+ *     async def read(self):             # <<<<<<<<<<<<<<
+ *         cdef bytes raw_message
+ *         self._rpc_state.raise_for_termination()
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("read", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_16_ServicerContext_7generator20(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":140
+ *                             raw_message)
+ * 
+ *     async def write(self, object message):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_6write(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_6write = {"write", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_6write, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_6write(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_message = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_message,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_message)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 140, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "write") < 0)) __PYX_ERR(9, 140, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_message = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("write", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 140, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_5write(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_message);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_5write(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_message) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_30_write(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 140, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_message = __pyx_v_message;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_message);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_message);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_16_ServicerContext_7generator20, __pyx_codeobj__74, (PyObject *) __pyx_cur_scope, __pyx_n_s_write, __pyx_n_s_ServicerContext_write, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 140, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.write", __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_7_cython_6cygrpc_16_ServicerContext_7generator20(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  unsigned int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 140, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":141
+ * 
+ *     async def write(self, object message):
+ *         self._rpc_state.raise_for_termination()             # <<<<<<<<<<<<<<
+ * 
+ *         await _send_message(self._rpc_state,
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_self->_rpc_state->__pyx_vtab)->raise_for_termination(__pyx_cur_scope->__pyx_v_self->_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 141, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":143
+ *         self._rpc_state.raise_for_termination()
+ * 
+ *         await _send_message(self._rpc_state,             # <<<<<<<<<<<<<<
+ *                             serialize(self._response_serializer, message),
+ *                             self._rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_send_message); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 143, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":144
+ * 
+ *         await _send_message(self._rpc_state,
+ *                             serialize(self._response_serializer, message),             # <<<<<<<<<<<<<<
+ *                             self._rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *                             self._rpc_state.get_write_flag(),
+ */
+  __pyx_t_3 = __pyx_cur_scope->__pyx_v_self->_response_serializer;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_4 = __pyx_f_7_cython_6cygrpc_serialize(__pyx_t_3, __pyx_cur_scope->__pyx_v_message); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 144, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":145
+ *         await _send_message(self._rpc_state,
+ *                             serialize(self._response_serializer, message),
+ *                             self._rpc_state.create_send_initial_metadata_op_if_not_sent(),             # <<<<<<<<<<<<<<
+ *                             self._rpc_state.get_write_flag(),
+ *                             self._loop)
+ */
+  __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_self->_rpc_state->__pyx_vtab)->create_send_initial_metadata_op_if_not_sent(__pyx_cur_scope->__pyx_v_self->_rpc_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 145, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":146
+ *                             serialize(self._response_serializer, message),
+ *                             self._rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *                             self._rpc_state.get_write_flag(),             # <<<<<<<<<<<<<<
+ *                             self._loop)
+ *         self._rpc_state.metadata_sent = True
+ */
+  __pyx_t_5 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_self->_rpc_state->__pyx_vtab)->get_write_flag(__pyx_cur_scope->__pyx_v_self->_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 146, __pyx_L1_error)
+  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 146, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":147
+ *                             self._rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *                             self._rpc_state.get_write_flag(),
+ *                             self._loop)             # <<<<<<<<<<<<<<
+ *         self._rpc_state.metadata_sent = True
+ * 
+ */
+  __pyx_t_7 = NULL;
+  __pyx_t_8 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_7)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_7);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_8 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[6] = {__pyx_t_7, ((PyObject *)__pyx_cur_scope->__pyx_v_self->_rpc_state), __pyx_t_4, __pyx_t_3, __pyx_t_6, __pyx_cur_scope->__pyx_v_self->_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_8, 5+__pyx_t_8);
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 143, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 143, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 143, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":148
+ *                             self._rpc_state.get_write_flag(),
+ *                             self._loop)
+ *         self._rpc_state.metadata_sent = True             # <<<<<<<<<<<<<<
+ * 
+ *     async def send_initial_metadata(self, object metadata):
+ */
+  __pyx_cur_scope->__pyx_v_self->_rpc_state->metadata_sent = 1;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":140
+ *                             raw_message)
+ * 
+ *     async def write(self, object message):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("write", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_16_ServicerContext_10generator21(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":150
+ *         self._rpc_state.metadata_sent = True
+ * 
+ *     async def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_9send_initial_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_9send_initial_metadata = {"send_initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_9send_initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_9send_initial_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_metadata = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("send_initial_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_metadata,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 150, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "send_initial_metadata") < 0)) __PYX_ERR(9, 150, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_metadata = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("send_initial_metadata", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 150, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.send_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_8send_initial_metadata(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_metadata);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_8send_initial_metadata(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_metadata) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("send_initial_metadata", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 150, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_metadata = __pyx_v_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_metadata);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_16_ServicerContext_10generator21, __pyx_codeobj__75, (PyObject *) __pyx_cur_scope, __pyx_n_s_send_initial_metadata_2, __pyx_n_s_ServicerContext_send_initial_me, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 150, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.send_initial_metadata", __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_7_cython_6cygrpc_16_ServicerContext_10generator21(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("send_initial_metadata", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 150, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":151
+ * 
+ *     async def send_initial_metadata(self, object metadata):
+ *         self._rpc_state.raise_for_termination()             # <<<<<<<<<<<<<<
+ * 
+ *         if self._rpc_state.metadata_sent:
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_self->_rpc_state->__pyx_vtab)->raise_for_termination(__pyx_cur_scope->__pyx_v_self->_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 151, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":153
+ *         self._rpc_state.raise_for_termination()
+ * 
+ *         if self._rpc_state.metadata_sent:             # <<<<<<<<<<<<<<
+ *             raise UsageError('Send initial metadata failed: already sent')
+ *         else:
+ */
+  if (unlikely(__pyx_cur_scope->__pyx_v_self->_rpc_state->metadata_sent)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":154
+ * 
+ *         if self._rpc_state.metadata_sent:
+ *             raise UsageError('Send initial metadata failed: already sent')             # <<<<<<<<<<<<<<
+ *         else:
+ *             await _send_initial_metadata(
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_UsageError); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 154, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_kp_s_Send_initial_metadata_failed_alr};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 154, __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_ERR(9, 154, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":153
+ *         self._rpc_state.raise_for_termination()
+ * 
+ *         if self._rpc_state.metadata_sent:             # <<<<<<<<<<<<<<
+ *             raise UsageError('Send initial metadata failed: already sent')
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":156
+ *             raise UsageError('Send initial metadata failed: already sent')
+ *         else:
+ *             await _send_initial_metadata(             # <<<<<<<<<<<<<<
+ *                 self._rpc_state,
+ *                 _augment_metadata(tuple(metadata), self._rpc_state.compression_algorithm),
+ */
+  /*else*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_send_initial_metadata); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 156, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":158
+ *             await _send_initial_metadata(
+ *                 self._rpc_state,
+ *                 _augment_metadata(tuple(metadata), self._rpc_state.compression_algorithm),             # <<<<<<<<<<<<<<
+ *                 _EMPTY_FLAG,
+ *                 self._loop
+ */
+    __pyx_t_3 = __Pyx_PySequence_Tuple(__pyx_cur_scope->__pyx_v_metadata); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 158, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = __pyx_cur_scope->__pyx_v_self->_rpc_state->compression_algorithm;
+    __Pyx_INCREF(__pyx_t_5);
+    __pyx_t_6 = __pyx_f_7_cython_6cygrpc__augment_metadata(((PyObject*)__pyx_t_3), __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 158, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":159
+ *                 self._rpc_state,
+ *                 _augment_metadata(tuple(metadata), self._rpc_state.compression_algorithm),
+ *                 _EMPTY_FLAG,             # <<<<<<<<<<<<<<
+ *                 self._loop
+ *             )
+ */
+    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_7_cython_6cygrpc__EMPTY_FLAG); if (unlikely(!__pyx_t_5)) __PYX_ERR(9, 159, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":160
+ *                 _augment_metadata(tuple(metadata), self._rpc_state.compression_algorithm),
+ *                 _EMPTY_FLAG,
+ *                 self._loop             # <<<<<<<<<<<<<<
+ *             )
+ *             self._rpc_state.metadata_sent = True
+ */
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[5] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_self->_rpc_state), __pyx_t_6, __pyx_t_5, __pyx_cur_scope->__pyx_v_self->_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 4+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 156, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L5_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 156, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 156, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":162
+ *                 self._loop
+ *             )
+ *             self._rpc_state.metadata_sent = True             # <<<<<<<<<<<<<<
+ * 
+ *     async def abort(self,
+ */
+    __pyx_cur_scope->__pyx_v_self->_rpc_state->metadata_sent = 1;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":150
+ *         self._rpc_state.metadata_sent = True
+ * 
+ *     async def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("send_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_16_ServicerContext_13generator22(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":164
+ *             self._rpc_state.metadata_sent = True
+ * 
+ *     async def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_12abort(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_12abort = {"abort", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_12abort, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_12abort(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_code = 0;
+  PyObject *__pyx_v_details = 0;
+  PyObject *__pyx_v_trailing_metadata = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("abort (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,&__pyx_n_s_details,&__pyx_n_s_trailing_metadata,0};
+    values[1] = __Pyx_Arg_NewRef_FASTCALL(((PyObject*)__pyx_kp_s__7));
+    values[2] = __Pyx_Arg_NewRef_FASTCALL(__pyx_k__76);
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 164, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details);
+          if (value) { values[1] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 164, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_trailing_metadata);
+          if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 164, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "abort") < 0)) __PYX_ERR(9, 164, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_code = values[0];
+    __pyx_v_details = ((PyObject*)values[1]);
+    __pyx_v_trailing_metadata = ((PyObject*)values[2]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("abort", 0, 1, 3, __pyx_nargs); __PYX_ERR(9, 164, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.abort", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_details), (&PyString_Type), 1, "details", 1))) __PYX_ERR(9, 166, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_trailing_metadata), (&PyTuple_Type), 1, "trailing_metadata", 1))) __PYX_ERR(9, 167, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_11abort(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_code, __pyx_v_details, __pyx_v_trailing_metadata);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_11abort(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_trailing_metadata) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("abort", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_32_abort(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 164, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_code = __pyx_v_code;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_code);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_code);
+  __pyx_cur_scope->__pyx_v_details = __pyx_v_details;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_details);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_details);
+  __pyx_cur_scope->__pyx_v_trailing_metadata = __pyx_v_trailing_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_16_ServicerContext_13generator22, __pyx_codeobj__77, (PyObject *) __pyx_cur_scope, __pyx_n_s_abort, __pyx_n_s_ServicerContext_abort, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 164, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.abort", __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_7_cython_6cygrpc_16_ServicerContext_13generator22(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  grpc_status_code __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("abort", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L11_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 164, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":168
+ *               str details='',
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):
+ *         if self._rpc_state.abort_exception is not None:             # <<<<<<<<<<<<<<
+ *             raise UsageError('Abort already called!')
+ *         else:
+ */
+  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_self->_rpc_state->abort_exception != Py_None);
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":169
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):
+ *         if self._rpc_state.abort_exception is not None:
+ *             raise UsageError('Abort already called!')             # <<<<<<<<<<<<<<
+ *         else:
+ *             # Keeps track of the exception object. After abort happen, the RPC
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_UsageError); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 169, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_s_Abort_already_called};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 169, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(9, 169, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":168
+ *               str details='',
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):
+ *         if self._rpc_state.abort_exception is not None:             # <<<<<<<<<<<<<<
+ *             raise UsageError('Abort already called!')
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":174
+ *             # should stop execution. However, if users decided to suppress it, it
+ *             # could lead to undefined behavior.
+ *             self._rpc_state.abort_exception = AbortError('Locally aborted.')             # <<<<<<<<<<<<<<
+ * 
+ *             if trailing_metadata == _IMMUTABLE_EMPTY_METADATA and self._rpc_state.trailing_metadata:
+ */
+  /*else*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_AbortError); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 174, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_s_Locally_aborted};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 174, __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_cur_scope->__pyx_v_self->_rpc_state->abort_exception);
+    __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->_rpc_state->abort_exception);
+    __pyx_cur_scope->__pyx_v_self->_rpc_state->abort_exception = __pyx_t_2;
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":176
+ *             self._rpc_state.abort_exception = AbortError('Locally aborted.')
+ * 
+ *             if trailing_metadata == _IMMUTABLE_EMPTY_METADATA and self._rpc_state.trailing_metadata:             # <<<<<<<<<<<<<<
+ *                 trailing_metadata = self._rpc_state.trailing_metadata
+ *             else:
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 176, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_trailing_metadata, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 176, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 176, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (__pyx_t_6) {
+    } else {
+      __pyx_t_1 = __pyx_t_6;
+      goto __pyx_L6_bool_binop_done;
+    }
+    __pyx_t_6 = (__pyx_cur_scope->__pyx_v_self->_rpc_state->trailing_metadata != Py_None)&&(PyTuple_GET_SIZE(__pyx_cur_scope->__pyx_v_self->_rpc_state->trailing_metadata) != 0);
+    __pyx_t_1 = __pyx_t_6;
+    __pyx_L6_bool_binop_done:;
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":177
+ * 
+ *             if trailing_metadata == _IMMUTABLE_EMPTY_METADATA and self._rpc_state.trailing_metadata:
+ *                 trailing_metadata = self._rpc_state.trailing_metadata             # <<<<<<<<<<<<<<
+ *             else:
+ *                 raise_if_not_valid_trailing_metadata(trailing_metadata)
+ */
+      __pyx_t_3 = __pyx_cur_scope->__pyx_v_self->_rpc_state->trailing_metadata;
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+      __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_trailing_metadata, ((PyObject*)__pyx_t_3));
+      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":176
+ *             self._rpc_state.abort_exception = AbortError('Locally aborted.')
+ * 
+ *             if trailing_metadata == _IMMUTABLE_EMPTY_METADATA and self._rpc_state.trailing_metadata:             # <<<<<<<<<<<<<<
+ *                 trailing_metadata = self._rpc_state.trailing_metadata
+ *             else:
+ */
+      goto __pyx_L5;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":179
+ *                 trailing_metadata = self._rpc_state.trailing_metadata
+ *             else:
+ *                 raise_if_not_valid_trailing_metadata(trailing_metadata)             # <<<<<<<<<<<<<<
+ *                 self._rpc_state.trailing_metadata = trailing_metadata
+ * 
+ */
+    /*else*/ {
+      __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_raise_if_not_valid_trailing_meta); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 179, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_4 = NULL;
+      __pyx_t_5 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_2))) {
+        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+        if (likely(__pyx_t_4)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_2, function);
+          __pyx_t_5 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_cur_scope->__pyx_v_trailing_metadata};
+        __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 179, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":180
+ *             else:
+ *                 raise_if_not_valid_trailing_metadata(trailing_metadata)
+ *                 self._rpc_state.trailing_metadata = trailing_metadata             # <<<<<<<<<<<<<<
+ * 
+ *             if details == '' and self._rpc_state.status_details:
+ */
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+      __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_trailing_metadata);
+      __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_self->_rpc_state->trailing_metadata);
+      __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->_rpc_state->trailing_metadata);
+      __pyx_cur_scope->__pyx_v_self->_rpc_state->trailing_metadata = __pyx_cur_scope->__pyx_v_trailing_metadata;
+    }
+    __pyx_L5:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":182
+ *                 self._rpc_state.trailing_metadata = trailing_metadata
+ * 
+ *             if details == '' and self._rpc_state.status_details:             # <<<<<<<<<<<<<<
+ *                 details = self._rpc_state.status_details
+ *             else:
+ */
+    __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_cur_scope->__pyx_v_details, __pyx_kp_s__7, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 182, __pyx_L1_error)
+    if (__pyx_t_6) {
+    } else {
+      __pyx_t_1 = __pyx_t_6;
+      goto __pyx_L9_bool_binop_done;
+    }
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_self->_rpc_state->status_details); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 182, __pyx_L1_error)
+    __pyx_t_1 = __pyx_t_6;
+    __pyx_L9_bool_binop_done:;
+    if (__pyx_t_1) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":183
+ * 
+ *             if details == '' and self._rpc_state.status_details:
+ *                 details = self._rpc_state.status_details             # <<<<<<<<<<<<<<
+ *             else:
+ *                 self._rpc_state.status_details = details
+ */
+      __pyx_t_3 = __pyx_cur_scope->__pyx_v_self->_rpc_state->status_details;
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_details);
+      __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_details, ((PyObject*)__pyx_t_3));
+      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":182
+ *                 self._rpc_state.trailing_metadata = trailing_metadata
+ * 
+ *             if details == '' and self._rpc_state.status_details:             # <<<<<<<<<<<<<<
+ *                 details = self._rpc_state.status_details
+ *             else:
+ */
+      goto __pyx_L8;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":185
+ *                 details = self._rpc_state.status_details
+ *             else:
+ *                 self._rpc_state.status_details = details             # <<<<<<<<<<<<<<
+ * 
+ *             actual_code = get_status_code(code)
+ */
+    /*else*/ {
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_details);
+      __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_details);
+      __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_self->_rpc_state->status_details);
+      __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->_rpc_state->status_details);
+      __pyx_cur_scope->__pyx_v_self->_rpc_state->status_details = __pyx_cur_scope->__pyx_v_details;
+    }
+    __pyx_L8:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":187
+ *                 self._rpc_state.status_details = details
+ * 
+ *             actual_code = get_status_code(code)             # <<<<<<<<<<<<<<
+ *             self._rpc_state.py_status_code = code
+ *             self._rpc_state.status_code = actual_code
+ */
+    __pyx_t_7 = __pyx_f_7_cython_6cygrpc_get_status_code(__pyx_cur_scope->__pyx_v_code); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 187, __pyx_L1_error)
+    __pyx_cur_scope->__pyx_v_actual_code = __pyx_t_7;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":188
+ * 
+ *             actual_code = get_status_code(code)
+ *             self._rpc_state.py_status_code = code             # <<<<<<<<<<<<<<
+ *             self._rpc_state.status_code = actual_code
+ * 
+ */
+    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_code);
+    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_code);
+    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_self->_rpc_state->py_status_code);
+    __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->_rpc_state->py_status_code);
+    __pyx_cur_scope->__pyx_v_self->_rpc_state->py_status_code = __pyx_cur_scope->__pyx_v_code;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":189
+ *             actual_code = get_status_code(code)
+ *             self._rpc_state.py_status_code = code
+ *             self._rpc_state.status_code = actual_code             # <<<<<<<<<<<<<<
+ * 
+ *             self._rpc_state.status_sent = True
+ */
+    __pyx_cur_scope->__pyx_v_self->_rpc_state->status_code = __pyx_cur_scope->__pyx_v_actual_code;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":191
+ *             self._rpc_state.status_code = actual_code
+ * 
+ *             self._rpc_state.status_sent = True             # <<<<<<<<<<<<<<
+ *             await _send_error_status_from_server(
+ *                 self._rpc_state,
+ */
+    __pyx_cur_scope->__pyx_v_self->_rpc_state->status_sent = 1;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":192
+ * 
+ *             self._rpc_state.status_sent = True
+ *             await _send_error_status_from_server(             # <<<<<<<<<<<<<<
+ *                 self._rpc_state,
+ *                 actual_code,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_send_error_status_from_server); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 192, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":194
+ *             await _send_error_status_from_server(
+ *                 self._rpc_state,
+ *                 actual_code,             # <<<<<<<<<<<<<<
+ *                 details,
+ *                 trailing_metadata,
+ */
+    __pyx_t_4 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_actual_code); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 194, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":197
+ *                 details,
+ *                 trailing_metadata,
+ *                 self._rpc_state.create_send_initial_metadata_op_if_not_sent(),             # <<<<<<<<<<<<<<
+ *                 self._loop
+ *             )
+ */
+    __pyx_t_8 = ((PyObject *)((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_self->_rpc_state->__pyx_vtab)->create_send_initial_metadata_op_if_not_sent(__pyx_cur_scope->__pyx_v_self->_rpc_state)); if (unlikely(!__pyx_t_8)) __PYX_ERR(9, 197, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":198
+ *                 trailing_metadata,
+ *                 self._rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *                 self._loop             # <<<<<<<<<<<<<<
+ *             )
+ * 
+ */
+    __pyx_t_9 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_9)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_9);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[7] = {__pyx_t_9, ((PyObject *)__pyx_cur_scope->__pyx_v_self->_rpc_state), __pyx_t_4, __pyx_cur_scope->__pyx_v_details, __pyx_cur_scope->__pyx_v_trailing_metadata, __pyx_t_8, __pyx_cur_scope->__pyx_v_self->_loop};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 6+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 192, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_3);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L11_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 192, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 192, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":201
+ *             )
+ * 
+ *             raise self._rpc_state.abort_exception             # <<<<<<<<<<<<<<
+ * 
+ *     async def abort_with_status(self, object status):
+ */
+    __Pyx_Raise(__pyx_cur_scope->__pyx_v_self->_rpc_state->abort_exception, 0, 0, 0);
+    __PYX_ERR(9, 201, __pyx_L1_error)
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":164
+ *             self._rpc_state.metadata_sent = True
+ * 
+ *     async def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("abort", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_16_ServicerContext_16generator23(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":203
+ *             raise self._rpc_state.abort_exception
+ * 
+ *     async def abort_with_status(self, object status):             # <<<<<<<<<<<<<<
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_15abort_with_status(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_15abort_with_status = {"abort_with_status", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_15abort_with_status, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_15abort_with_status(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_status = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("abort_with_status (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_status,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_status)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 203, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "abort_with_status") < 0)) __PYX_ERR(9, 203, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_status = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("abort_with_status", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 203, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.abort_with_status", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_14abort_with_status(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_status);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_14abort_with_status(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_status) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("abort_with_status", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 203, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_status = __pyx_v_status;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_status);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_status);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_16_ServicerContext_16generator23, __pyx_codeobj__78, (PyObject *) __pyx_cur_scope, __pyx_n_s_abort_with_status, __pyx_n_s_ServicerContext_abort_with_stat, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 203, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.abort_with_status", __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_7_cython_6cygrpc_16_ServicerContext_16generator23(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  unsigned int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("abort_with_status", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 203, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":204
+ * 
+ *     async def abort_with_status(self, object status):
+ *         await self.abort(status.code, status.details, status.trailing_metadata)             # <<<<<<<<<<<<<<
+ * 
+ *     def set_trailing_metadata(self, object metadata):
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_abort); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 204, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_status, __pyx_n_s_code); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 204, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_status, __pyx_n_s_details); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 204, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_status, __pyx_n_s_trailing_metadata); if (unlikely(!__pyx_t_5)) __PYX_ERR(9, 204, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = NULL;
+  __pyx_t_7 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_7 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_6, __pyx_t_3, __pyx_t_4, __pyx_t_5};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_7, 3+__pyx_t_7);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 204, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 204, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 204, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":203
+ *             raise self._rpc_state.abort_exception
+ * 
+ *     async def abort_with_status(self, object status):             # <<<<<<<<<<<<<<
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __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_AddTraceback("abort_with_status", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":206
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ *     def set_trailing_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         raise_if_not_valid_trailing_metadata(metadata)
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_18set_trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_18set_trailing_metadata = {"set_trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_18set_trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_18set_trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_metadata = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_trailing_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_metadata,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 206, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_trailing_metadata") < 0)) __PYX_ERR(9, 206, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_metadata = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_trailing_metadata", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 206, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.set_trailing_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_17set_trailing_metadata(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_metadata);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_17set_trailing_metadata(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_metadata) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("set_trailing_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":207
+ * 
+ *     def set_trailing_metadata(self, object metadata):
+ *         raise_if_not_valid_trailing_metadata(metadata)             # <<<<<<<<<<<<<<
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_raise_if_not_valid_trailing_meta); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 207, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_metadata};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 207, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":208
+ *     def set_trailing_metadata(self, object metadata):
+ *         raise_if_not_valid_trailing_metadata(metadata)
+ *         self._rpc_state.trailing_metadata = tuple(metadata)             # <<<<<<<<<<<<<<
+ * 
+ *     def trailing_metadata(self):
+ */
+  __pyx_t_1 = __Pyx_PySequence_Tuple(__pyx_v_metadata); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 208, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_rpc_state->trailing_metadata);
+  __Pyx_DECREF(__pyx_v_self->_rpc_state->trailing_metadata);
+  __pyx_v_self->_rpc_state->trailing_metadata = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":206
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ *     def set_trailing_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         raise_if_not_valid_trailing_metadata(metadata)
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ */
+
+  /* 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("_cython.cygrpc._ServicerContext.set_trailing_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":210
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ * 
+ *     def trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.trailing_metadata
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_20trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_20trailing_metadata = {"trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_20trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_20trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("trailing_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("trailing_metadata", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "trailing_metadata", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_19trailing_metadata(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_19trailing_metadata(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("trailing_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":211
+ * 
+ *     def trailing_metadata(self):
+ *         return self._rpc_state.trailing_metadata             # <<<<<<<<<<<<<<
+ * 
+ *     def invocation_metadata(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_rpc_state->trailing_metadata);
+  __pyx_r = __pyx_v_self->_rpc_state->trailing_metadata;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":210
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ * 
+ *     def trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.trailing_metadata
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":213
+ *         return self._rpc_state.trailing_metadata
+ * 
+ *     def invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.invocation_metadata()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_22invocation_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_22invocation_metadata = {"invocation_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_22invocation_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_22invocation_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("invocation_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("invocation_metadata", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "invocation_metadata", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_21invocation_metadata(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_21invocation_metadata(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__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("invocation_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":214
+ * 
+ *     def invocation_metadata(self):
+ *         return self._rpc_state.invocation_metadata()             # <<<<<<<<<<<<<<
+ * 
+ *     def set_code(self, object code):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_v_self->_rpc_state->__pyx_vtab)->invocation_metadata(__pyx_v_self->_rpc_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 214, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":213
+ *         return self._rpc_state.trailing_metadata
+ * 
+ *     def invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.invocation_metadata()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.invocation_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":216
+ *         return self._rpc_state.invocation_metadata()
+ * 
+ *     def set_code(self, object code):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.status_code = get_status_code(code)
+ *         self._rpc_state.py_status_code = code
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_24set_code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_24set_code = {"set_code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_24set_code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_24set_code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_code = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_code (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 216, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_code") < 0)) __PYX_ERR(9, 216, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_code = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_code", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 216, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.set_code", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_23set_code(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_code);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_23set_code(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_code) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  grpc_status_code __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("set_code", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":217
+ * 
+ *     def set_code(self, object code):
+ *         self._rpc_state.status_code = get_status_code(code)             # <<<<<<<<<<<<<<
+ *         self._rpc_state.py_status_code = code
+ * 
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_get_status_code(__pyx_v_code); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 217, __pyx_L1_error)
+  __pyx_v_self->_rpc_state->status_code = __pyx_t_1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":218
+ *     def set_code(self, object code):
+ *         self._rpc_state.status_code = get_status_code(code)
+ *         self._rpc_state.py_status_code = code             # <<<<<<<<<<<<<<
+ * 
+ *     def code(self):
+ */
+  __Pyx_INCREF(__pyx_v_code);
+  __Pyx_GIVEREF(__pyx_v_code);
+  __Pyx_GOTREF(__pyx_v_self->_rpc_state->py_status_code);
+  __Pyx_DECREF(__pyx_v_self->_rpc_state->py_status_code);
+  __pyx_v_self->_rpc_state->py_status_code = __pyx_v_code;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":216
+ *         return self._rpc_state.invocation_metadata()
+ * 
+ *     def set_code(self, object code):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.status_code = get_status_code(code)
+ *         self._rpc_state.py_status_code = code
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.set_code", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":220
+ *         self._rpc_state.py_status_code = code
+ * 
+ *     def code(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.py_status_code
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_26code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_26code = {"code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_26code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_26code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("code (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("code", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "code", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_25code(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_25code(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("code", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":221
+ * 
+ *     def code(self):
+ *         return self._rpc_state.py_status_code             # <<<<<<<<<<<<<<
+ * 
+ *     def set_details(self, str details):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_rpc_state->py_status_code);
+  __pyx_r = __pyx_v_self->_rpc_state->py_status_code;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":220
+ *         self._rpc_state.py_status_code = code
+ * 
+ *     def code(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.py_status_code
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":223
+ *         return self._rpc_state.py_status_code
+ * 
+ *     def set_details(self, str details):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.status_details = details
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_28set_details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_28set_details = {"set_details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_28set_details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_28set_details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_details (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 223, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_details") < 0)) __PYX_ERR(9, 223, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_details = ((PyObject*)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_details", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 223, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.set_details", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_details), (&PyString_Type), 1, "details", 1))) __PYX_ERR(9, 223, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_27set_details(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_details);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_27set_details(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_details) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_details", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":224
+ * 
+ *     def set_details(self, str details):
+ *         self._rpc_state.status_details = details             # <<<<<<<<<<<<<<
+ * 
+ *     def details(self):
+ */
+  __Pyx_INCREF(__pyx_v_details);
+  __Pyx_GIVEREF(__pyx_v_details);
+  __Pyx_GOTREF(__pyx_v_self->_rpc_state->status_details);
+  __Pyx_DECREF(__pyx_v_self->_rpc_state->status_details);
+  __pyx_v_self->_rpc_state->status_details = __pyx_v_details;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":223
+ *         return self._rpc_state.py_status_code
+ * 
+ *     def set_details(self, str details):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.status_details = details
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":226
+ *         self._rpc_state.status_details = details
+ * 
+ *     def details(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_details
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_30details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_30details = {"details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_30details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_30details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("details (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("details", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "details", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_29details(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_29details(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("details", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":227
+ * 
+ *     def details(self):
+ *         return self._rpc_state.status_details             # <<<<<<<<<<<<<<
+ * 
+ *     def set_compression(self, object compression):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_rpc_state->status_details);
+  __pyx_r = __pyx_v_self->_rpc_state->status_details;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":226
+ *         self._rpc_state.status_details = details
+ * 
+ *     def details(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_details
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":229
+ *         return self._rpc_state.status_details
+ * 
+ *     def set_compression(self, object compression):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.metadata_sent:
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_32set_compression(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_32set_compression = {"set_compression", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_32set_compression, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_32set_compression(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_compression = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_compression (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_compression,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_compression)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 229, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_compression") < 0)) __PYX_ERR(9, 229, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_compression = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_compression", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 229, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.set_compression", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_31set_compression(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_compression);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_31set_compression(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_compression) {
+  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("set_compression", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":230
+ * 
+ *     def set_compression(self, object compression):
+ *         if self._rpc_state.metadata_sent:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')
+ *         else:
+ */
+  if (unlikely(__pyx_v_self->_rpc_state->metadata_sent)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":231
+ *     def set_compression(self, object compression):
+ *         if self._rpc_state.metadata_sent:
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')             # <<<<<<<<<<<<<<
+ *         else:
+ *             self._rpc_state.compression_algorithm = compression
+ */
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__79, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 231, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(9, 231, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":230
+ * 
+ *     def set_compression(self, object compression):
+ *         if self._rpc_state.metadata_sent:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":233
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')
+ *         else:
+ *             self._rpc_state.compression_algorithm = compression             # <<<<<<<<<<<<<<
+ * 
+ *     def disable_next_message_compression(self):
+ */
+  /*else*/ {
+    __Pyx_INCREF(__pyx_v_compression);
+    __Pyx_GIVEREF(__pyx_v_compression);
+    __Pyx_GOTREF(__pyx_v_self->_rpc_state->compression_algorithm);
+    __Pyx_DECREF(__pyx_v_self->_rpc_state->compression_algorithm);
+    __pyx_v_self->_rpc_state->compression_algorithm = __pyx_v_compression;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":229
+ *         return self._rpc_state.status_details
+ * 
+ *     def set_compression(self, object compression):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.metadata_sent:
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.set_compression", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":235
+ *             self._rpc_state.compression_algorithm = compression
+ * 
+ *     def disable_next_message_compression(self):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.disable_next_compression = True
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_34disable_next_message_compression(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_34disable_next_message_compression = {"disable_next_message_compression", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_34disable_next_message_compression, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_34disable_next_message_compression(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("disable_next_message_compression (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("disable_next_message_compression", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "disable_next_message_compression", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_33disable_next_message_compression(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_33disable_next_message_compression(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("disable_next_message_compression", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":236
+ * 
+ *     def disable_next_message_compression(self):
+ *         self._rpc_state.disable_next_compression = True             # <<<<<<<<<<<<<<
+ * 
+ *     def peer(self):
+ */
+  __pyx_v_self->_rpc_state->disable_next_compression = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":235
+ *             self._rpc_state.compression_algorithm = compression
+ * 
+ *     def disable_next_message_compression(self):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.disable_next_compression = True
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":238
+ *         self._rpc_state.disable_next_compression = True
+ * 
+ *     def peer(self):             # <<<<<<<<<<<<<<
+ *         cdef char *c_peer = NULL
+ *         c_peer = grpc_call_get_peer(self._rpc_state.call)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_36peer(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_36peer = {"peer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_36peer, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_36peer(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("peer", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "peer", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_35peer(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_35peer(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  char *__pyx_v_c_peer;
+  PyObject *__pyx_v_peer = 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("peer", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":239
+ * 
+ *     def peer(self):
+ *         cdef char *c_peer = NULL             # <<<<<<<<<<<<<<
+ *         c_peer = grpc_call_get_peer(self._rpc_state.call)
+ *         peer = (<bytes>c_peer).decode('utf8')
+ */
+  __pyx_v_c_peer = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":240
+ *     def peer(self):
+ *         cdef char *c_peer = NULL
+ *         c_peer = grpc_call_get_peer(self._rpc_state.call)             # <<<<<<<<<<<<<<
+ *         peer = (<bytes>c_peer).decode('utf8')
+ *         gpr_free(c_peer)
+ */
+  __pyx_v_c_peer = grpc_call_get_peer(__pyx_v_self->_rpc_state->__pyx_base.call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":241
+ *         cdef char *c_peer = NULL
+ *         c_peer = grpc_call_get_peer(self._rpc_state.call)
+ *         peer = (<bytes>c_peer).decode('utf8')             # <<<<<<<<<<<<<<
+ *         gpr_free(c_peer)
+ *         return peer
+ */
+  __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_c_peer); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 241, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (unlikely(__pyx_t_1 == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode");
+    __PYX_ERR(9, 241, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_decode_bytes(((PyObject*)__pyx_t_1), 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 241, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v_peer = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":242
+ *         c_peer = grpc_call_get_peer(self._rpc_state.call)
+ *         peer = (<bytes>c_peer).decode('utf8')
+ *         gpr_free(c_peer)             # <<<<<<<<<<<<<<
+ *         return peer
+ * 
+ */
+  gpr_free(__pyx_v_c_peer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":243
+ *         peer = (<bytes>c_peer).decode('utf8')
+ *         gpr_free(c_peer)
+ *         return peer             # <<<<<<<<<<<<<<
+ * 
+ *     def peer_identities(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_peer);
+  __pyx_r = __pyx_v_peer;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":238
+ *         self._rpc_state.disable_next_compression = True
+ * 
+ *     def peer(self):             # <<<<<<<<<<<<<<
+ *         cdef char *c_peer = NULL
+ *         c_peer = grpc_call_get_peer(self._rpc_state.call)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.peer", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_peer);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":245
+ *         return peer
+ * 
+ *     def peer_identities(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_38peer_identities(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_38peer_identities = {"peer_identities", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_38peer_identities, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_38peer_identities(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer_identities (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("peer_identities", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "peer_identities", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_37peer_identities(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_37peer_identities(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_query_call = 0;
+  PyObject *__pyx_v_identities = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  grpc_call *__pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("peer_identities", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":246
+ * 
+ *     def peer_identities(self):
+ *         cdef Call query_call = Call()             # <<<<<<<<<<<<<<
+ *         query_call.c_call = self._rpc_state.call
+ *         identities = peer_identities(query_call)
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 246, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_query_call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":247
+ *     def peer_identities(self):
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call             # <<<<<<<<<<<<<<
+ *         identities = peer_identities(query_call)
+ *         query_call.c_call = NULL
+ */
+  __pyx_t_2 = __pyx_v_self->_rpc_state->__pyx_base.call;
+  __pyx_v_query_call->c_call = __pyx_t_2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":248
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ *         identities = peer_identities(query_call)             # <<<<<<<<<<<<<<
+ *         query_call.c_call = NULL
+ *         return identities
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_peer_identities); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 248, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, ((PyObject *)__pyx_v_query_call)};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 248, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v_identities = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":249
+ *         query_call.c_call = self._rpc_state.call
+ *         identities = peer_identities(query_call)
+ *         query_call.c_call = NULL             # <<<<<<<<<<<<<<
+ *         return identities
+ * 
+ */
+  __pyx_v_query_call->c_call = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":250
+ *         identities = peer_identities(query_call)
+ *         query_call.c_call = NULL
+ *         return identities             # <<<<<<<<<<<<<<
+ * 
+ *     def peer_identity_key(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_identities);
+  __pyx_r = __pyx_v_identities;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":245
+ *         return peer
+ * 
+ *     def peer_identities(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.peer_identities", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_query_call);
+  __Pyx_XDECREF(__pyx_v_identities);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":252
+ *         return identities
+ * 
+ *     def peer_identity_key(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_40peer_identity_key(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_40peer_identity_key = {"peer_identity_key", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_40peer_identity_key, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_40peer_identity_key(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer_identity_key (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("peer_identity_key", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "peer_identity_key", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_39peer_identity_key(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_39peer_identity_key(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_query_call = 0;
+  PyObject *__pyx_v_identity_key = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  grpc_call *__pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("peer_identity_key", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":253
+ * 
+ *     def peer_identity_key(self):
+ *         cdef Call query_call = Call()             # <<<<<<<<<<<<<<
+ *         query_call.c_call = self._rpc_state.call
+ *         identity_key = peer_identity_key(query_call)
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 253, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_query_call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":254
+ *     def peer_identity_key(self):
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call             # <<<<<<<<<<<<<<
+ *         identity_key = peer_identity_key(query_call)
+ *         query_call.c_call = NULL
+ */
+  __pyx_t_2 = __pyx_v_self->_rpc_state->__pyx_base.call;
+  __pyx_v_query_call->c_call = __pyx_t_2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":255
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ *         identity_key = peer_identity_key(query_call)             # <<<<<<<<<<<<<<
+ *         query_call.c_call = NULL
+ *         if identity_key:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_peer_identity_key); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 255, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, ((PyObject *)__pyx_v_query_call)};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 255, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v_identity_key = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":256
+ *         query_call.c_call = self._rpc_state.call
+ *         identity_key = peer_identity_key(query_call)
+ *         query_call.c_call = NULL             # <<<<<<<<<<<<<<
+ *         if identity_key:
+ *             return identity_key.decode('utf8')
+ */
+  __pyx_v_query_call->c_call = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":257
+ *         identity_key = peer_identity_key(query_call)
+ *         query_call.c_call = NULL
+ *         if identity_key:             # <<<<<<<<<<<<<<
+ *             return identity_key.decode('utf8')
+ *         else:
+ */
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_identity_key); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 257, __pyx_L1_error)
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":258
+ *         query_call.c_call = NULL
+ *         if identity_key:
+ *             return identity_key.decode('utf8')             # <<<<<<<<<<<<<<
+ *         else:
+ *             return None
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_identity_key, __pyx_n_s_decode); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 258, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_n_s_utf8};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 258, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":257
+ *         identity_key = peer_identity_key(query_call)
+ *         query_call.c_call = NULL
+ *         if identity_key:             # <<<<<<<<<<<<<<
+ *             return identity_key.decode('utf8')
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":260
+ *             return identity_key.decode('utf8')
+ *         else:
+ *             return None             # <<<<<<<<<<<<<<
+ * 
+ *     def auth_context(self):
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":252
+ *         return identities
+ * 
+ *     def peer_identity_key(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.peer_identity_key", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_query_call);
+  __Pyx_XDECREF(__pyx_v_identity_key);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":262
+ *             return None
+ * 
+ *     def auth_context(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_42auth_context(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_42auth_context = {"auth_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_42auth_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_42auth_context(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("auth_context (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("auth_context", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "auth_context", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_41auth_context(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_41auth_context(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc_Call *__pyx_v_query_call = 0;
+  PyObject *__pyx_v_bytes_ctx = NULL;
+  PyObject *__pyx_v_ctx = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  grpc_call *__pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("auth_context", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":263
+ * 
+ *     def auth_context(self):
+ *         cdef Call query_call = Call()             # <<<<<<<<<<<<<<
+ *         query_call.c_call = self._rpc_state.call
+ *         bytes_ctx = auth_context(query_call)
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 263, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_query_call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":264
+ *     def auth_context(self):
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call             # <<<<<<<<<<<<<<
+ *         bytes_ctx = auth_context(query_call)
+ *         query_call.c_call = NULL
+ */
+  __pyx_t_2 = __pyx_v_self->_rpc_state->__pyx_base.call;
+  __pyx_v_query_call->c_call = __pyx_t_2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":265
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ *         bytes_ctx = auth_context(query_call)             # <<<<<<<<<<<<<<
+ *         query_call.c_call = NULL
+ *         if bytes_ctx:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_auth_context); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 265, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, ((PyObject *)__pyx_v_query_call)};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 265, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v_bytes_ctx = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":266
+ *         query_call.c_call = self._rpc_state.call
+ *         bytes_ctx = auth_context(query_call)
+ *         query_call.c_call = NULL             # <<<<<<<<<<<<<<
+ *         if bytes_ctx:
+ *             ctx = {}
+ */
+  __pyx_v_query_call->c_call = NULL;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":267
+ *         bytes_ctx = auth_context(query_call)
+ *         query_call.c_call = NULL
+ *         if bytes_ctx:             # <<<<<<<<<<<<<<
+ *             ctx = {}
+ *             for key in bytes_ctx:
+ */
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_bytes_ctx); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 267, __pyx_L1_error)
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":268
+ *         query_call.c_call = NULL
+ *         if bytes_ctx:
+ *             ctx = {}             # <<<<<<<<<<<<<<
+ *             for key in bytes_ctx:
+ *                 ctx[key.decode('utf8')] = bytes_ctx[key]
+ */
+    __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 268, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_v_ctx = ((PyObject*)__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":269
+ *         if bytes_ctx:
+ *             ctx = {}
+ *             for key in bytes_ctx:             # <<<<<<<<<<<<<<
+ *                 ctx[key.decode('utf8')] = bytes_ctx[key]
+ *             return ctx
+ */
+    if (likely(PyList_CheckExact(__pyx_v_bytes_ctx)) || PyTuple_CheckExact(__pyx_v_bytes_ctx)) {
+      __pyx_t_1 = __pyx_v_bytes_ctx; __Pyx_INCREF(__pyx_t_1);
+      __pyx_t_7 = 0;
+      __pyx_t_8 = NULL;
+    } else {
+      __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_bytes_ctx); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 269, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_8 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_8)) __PYX_ERR(9, 269, __pyx_L1_error)
+    }
+    for (;;) {
+      if (likely(!__pyx_t_8)) {
+        if (likely(PyList_CheckExact(__pyx_t_1))) {
+          {
+            Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+            #if !CYTHON_ASSUME_SAFE_MACROS
+            if (unlikely((__pyx_temp < 0))) __PYX_ERR(9, 269, __pyx_L1_error)
+            #endif
+            if (__pyx_t_7 >= __pyx_temp) break;
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_3); __pyx_t_7++; if (unlikely((0 < 0))) __PYX_ERR(9, 269, __pyx_L1_error)
+          #else
+          __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 269, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          #endif
+        } else {
+          {
+            Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1);
+            #if !CYTHON_ASSUME_SAFE_MACROS
+            if (unlikely((__pyx_temp < 0))) __PYX_ERR(9, 269, __pyx_L1_error)
+            #endif
+            if (__pyx_t_7 >= __pyx_temp) break;
+          }
+          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_3); __pyx_t_7++; if (unlikely((0 < 0))) __PYX_ERR(9, 269, __pyx_L1_error)
+          #else
+          __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 269, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          #endif
+        }
+      } else {
+        __pyx_t_3 = __pyx_t_8(__pyx_t_1);
+        if (unlikely(!__pyx_t_3)) {
+          PyObject* exc_type = PyErr_Occurred();
+          if (exc_type) {
+            if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+            else __PYX_ERR(9, 269, __pyx_L1_error)
+          }
+          break;
+        }
+        __Pyx_GOTREF(__pyx_t_3);
+      }
+      __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_3);
+      __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":270
+ *             ctx = {}
+ *             for key in bytes_ctx:
+ *                 ctx[key.decode('utf8')] = bytes_ctx[key]             # <<<<<<<<<<<<<<
+ *             return ctx
+ *         else:
+ */
+      __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_bytes_ctx, __pyx_v_key); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 270, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_key, __pyx_n_s_decode); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 270, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_10 = NULL;
+      __pyx_t_5 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (likely(PyMethod_Check(__pyx_t_9))) {
+        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9);
+        if (likely(__pyx_t_10)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+          __Pyx_INCREF(__pyx_t_10);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_9, function);
+          __pyx_t_5 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_10, __pyx_n_s_utf8};
+        __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+        if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 270, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      }
+      if (unlikely((PyDict_SetItem(__pyx_v_ctx, __pyx_t_4, __pyx_t_3) < 0))) __PYX_ERR(9, 270, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":269
+ *         if bytes_ctx:
+ *             ctx = {}
+ *             for key in bytes_ctx:             # <<<<<<<<<<<<<<
+ *                 ctx[key.decode('utf8')] = bytes_ctx[key]
+ *             return ctx
+ */
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":271
+ *             for key in bytes_ctx:
+ *                 ctx[key.decode('utf8')] = bytes_ctx[key]
+ *             return ctx             # <<<<<<<<<<<<<<
+ *         else:
+ *             return {}
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(__pyx_v_ctx);
+    __pyx_r = __pyx_v_ctx;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":267
+ *         bytes_ctx = auth_context(query_call)
+ *         query_call.c_call = NULL
+ *         if bytes_ctx:             # <<<<<<<<<<<<<<
+ *             ctx = {}
+ *             for key in bytes_ctx:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":273
+ *             return ctx
+ *         else:
+ *             return {}             # <<<<<<<<<<<<<<
+ * 
+ *     def time_remaining(self):
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 273, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":262
+ *             return None
+ * 
+ *     def auth_context(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.auth_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_query_call);
+  __Pyx_XDECREF(__pyx_v_bytes_ctx);
+  __Pyx_XDECREF(__pyx_v_ctx);
+  __Pyx_XDECREF(__pyx_v_key);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":275
+ *             return {}
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.details.deadline.seconds == _GPR_INF_FUTURE.seconds:
+ *             return None
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_44time_remaining(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_44time_remaining = {"time_remaining", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_44time_remaining, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_44time_remaining(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("time_remaining (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("time_remaining", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "time_remaining", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_43time_remaining(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_43time_remaining(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  long __pyx_t_2;
+  double __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  unsigned int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("time_remaining", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":276
+ * 
+ *     def time_remaining(self):
+ *         if self._rpc_state.details.deadline.seconds == _GPR_INF_FUTURE.seconds:             # <<<<<<<<<<<<<<
+ *             return None
+ *         else:
+ */
+  __pyx_t_1 = (__pyx_v_self->_rpc_state->details.deadline.tv_sec == __pyx_v_7_cython_6cygrpc__GPR_INF_FUTURE.tv_sec);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":277
+ *     def time_remaining(self):
+ *         if self._rpc_state.details.deadline.seconds == _GPR_INF_FUTURE.seconds:
+ *             return None             # <<<<<<<<<<<<<<
+ *         else:
+ *             return max(_time_from_timespec(self._rpc_state.details.deadline) - time.time(), 0)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":276
+ * 
+ *     def time_remaining(self):
+ *         if self._rpc_state.details.deadline.seconds == _GPR_INF_FUTURE.seconds:             # <<<<<<<<<<<<<<
+ *             return None
+ *         else:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":279
+ *             return None
+ *         else:
+ *             return max(_time_from_timespec(self._rpc_state.details.deadline) - time.time(), 0)             # <<<<<<<<<<<<<<
+ * 
+ *     def add_done_callback(self, callback):
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_2 = 0;
+    __pyx_t_3 = __pyx_f_7_cython_6cygrpc__time_from_timespec(__pyx_v_self->_rpc_state->details.deadline); if (unlikely(__pyx_t_3 == ((double)-1) && PyErr_Occurred())) __PYX_ERR(9, 279, __pyx_L1_error)
+    __pyx_t_4 = PyFloat_FromDouble(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 279, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_time); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 279, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_time); if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 279, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_6 = NULL;
+    __pyx_t_8 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_7))) {
+      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7);
+      if (likely(__pyx_t_6)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+        __Pyx_INCREF(__pyx_t_6);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_7, function);
+        __pyx_t_8 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+      __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_8, 0+__pyx_t_8);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_5)) __PYX_ERR(9, 279, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    }
+    __pyx_t_7 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 279, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_4 = __Pyx_PyInt_From_long(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 279, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_4, __pyx_t_7, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 279, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(9, 279, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (__pyx_t_1) {
+      __pyx_t_6 = __Pyx_PyInt_From_long(__pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 279, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_5 = __pyx_t_6;
+      __pyx_t_6 = 0;
+    } else {
+      __Pyx_INCREF(__pyx_t_7);
+      __pyx_t_5 = __pyx_t_7;
+    }
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_INCREF(__pyx_t_5);
+    __pyx_r = __pyx_t_5;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":275
+ *             return {}
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.details.deadline.seconds == _GPR_INF_FUTURE.seconds:
+ *             return None
+ */
+
+  /* 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("_cython.cygrpc._ServicerContext.time_remaining", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":281
+ *             return max(_time_from_timespec(self._rpc_state.details.deadline) - time.time(), 0)
+ * 
+ *     def add_done_callback(self, callback):             # <<<<<<<<<<<<<<
+ *         cb = functools.partial(callback, self)
+ *         self._rpc_state.callbacks.append(cb)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_46add_done_callback(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_46add_done_callback = {"add_done_callback", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_46add_done_callback, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_46add_done_callback(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_callback = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("add_done_callback (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_callback,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_callback)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 281, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_done_callback") < 0)) __PYX_ERR(9, 281, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_callback = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("add_done_callback", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 281, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.add_done_callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_45add_done_callback(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v_callback);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_45add_done_callback(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, PyObject *__pyx_v_callback) {
+  PyObject *__pyx_v_cb = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("add_done_callback", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":282
+ * 
+ *     def add_done_callback(self, callback):
+ *         cb = functools.partial(callback, self)             # <<<<<<<<<<<<<<
+ *         self._rpc_state.callbacks.append(cb)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_functools); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 282, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_partial); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 282, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_v_callback, ((PyObject *)__pyx_v_self)};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 282, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v_cb = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":283
+ *     def add_done_callback(self, callback):
+ *         cb = functools.partial(callback, self)
+ *         self._rpc_state.callbacks.append(cb)             # <<<<<<<<<<<<<<
+ * 
+ *     def done(self):
+ */
+  __pyx_t_5 = __Pyx_PyObject_Append(__pyx_v_self->_rpc_state->callbacks, __pyx_v_cb); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(9, 283, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":281
+ *             return max(_time_from_timespec(self._rpc_state.details.deadline) - time.time(), 0)
+ * 
+ *     def add_done_callback(self, callback):             # <<<<<<<<<<<<<<
+ *         cb = functools.partial(callback, self)
+ *         self._rpc_state.callbacks.append(cb)
+ */
+
+  /* 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("_cython.cygrpc._ServicerContext.add_done_callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_cb);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":285
+ *         self._rpc_state.callbacks.append(cb)
+ * 
+ *     def done(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_sent
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_48done(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_48done = {"done", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_48done, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_48done(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("done (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("done", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "done", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_47done(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_47done(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__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("done", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":286
+ * 
+ *     def done(self):
+ *         return self._rpc_state.status_sent             # <<<<<<<<<<<<<<
+ * 
+ *     def cancelled(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->_rpc_state->status_sent); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 286, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":285
+ *         self._rpc_state.callbacks.append(cb)
+ * 
+ *     def done(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_sent
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.done", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":288
+ *         return self._rpc_state.status_sent
+ * 
+ *     def cancelled(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_code == StatusCode.cancelled
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_50cancelled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_50cancelled = {"cancelled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_50cancelled, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_50cancelled(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cancelled (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("cancelled", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "cancelled", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_49cancelled(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_49cancelled(struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  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("cancelled", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":289
+ * 
+ *     def cancelled(self):
+ *         return self._rpc_state.status_code == StatusCode.cancelled             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_status_code(__pyx_v_self->_rpc_state->status_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 289, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 289, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_cancelled); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 289, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 289, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":288
+ *         return self._rpc_state.status_sent
+ * 
+ *     def cancelled(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_code == StatusCode.cancelled
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.cancelled", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_52__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_52__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_52__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_52__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_51__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_51__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_54__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_ServicerContext_54__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_54__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_ServicerContext_54__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_ServicerContext_53__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_ServicerContext_53__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ServicerContext.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":295
+ *     """Sync servicer context for sync handler compatibility."""
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *                   _ServicerContext context):
+ *         self._context = context
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_context = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_context,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_context)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 295, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(9, 295, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 295, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_context), __pyx_ptype_7_cython_6cygrpc__ServicerContext, 1, "context", 0))) __PYX_ERR(9, 296, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext___cinit__(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v_context);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext___cinit__(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_context) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":297
+ *     def __cinit__(self,
+ *                   _ServicerContext context):
+ *         self._context = context             # <<<<<<<<<<<<<<
+ *         self._callbacks = []
+ *         self._loop = context._loop
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_context);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_context);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_context);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_context);
+  __pyx_v_self->_context = __pyx_v_context;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":298
+ *                   _ServicerContext context):
+ *         self._context = context
+ *         self._callbacks = []             # <<<<<<<<<<<<<<
+ *         self._loop = context._loop
+ * 
+ */
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 298, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_callbacks);
+  __Pyx_DECREF(__pyx_v_self->_callbacks);
+  __pyx_v_self->_callbacks = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":299
+ *         self._context = context
+ *         self._callbacks = []
+ *         self._loop = context._loop             # <<<<<<<<<<<<<<
+ * 
+ *     def abort(self,
+ */
+  __pyx_t_1 = __pyx_v_context->_loop;
+  __Pyx_INCREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->_loop);
+  __Pyx_DECREF(__pyx_v_self->_loop);
+  __pyx_v_self->_loop = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":295
+ *     """Sync servicer context for sync handler compatibility."""
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *                   _ServicerContext context):
+ *         self._context = context
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":301
+ *         self._loop = context._loop
+ * 
+ *     def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_3abort(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_3abort = {"abort", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_3abort, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_3abort(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_code = 0;
+  PyObject *__pyx_v_details = 0;
+  PyObject *__pyx_v_trailing_metadata = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("abort (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,&__pyx_n_s_details,&__pyx_n_s_trailing_metadata,0};
+    values[1] = __Pyx_Arg_NewRef_FASTCALL(((PyObject*)__pyx_kp_s__7));
+    values[2] = __Pyx_Arg_NewRef_FASTCALL(__pyx_k__80);
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 301, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details);
+          if (value) { values[1] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 301, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_trailing_metadata);
+          if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
+          else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 301, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "abort") < 0)) __PYX_ERR(9, 301, __pyx_L3_error)
+      }
+    } else {
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_code = values[0];
+    __pyx_v_details = ((PyObject*)values[1]);
+    __pyx_v_trailing_metadata = ((PyObject*)values[2]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("abort", 0, 1, 3, __pyx_nargs); __PYX_ERR(9, 301, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.abort", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_details), (&PyString_Type), 1, "details", 1))) __PYX_ERR(9, 303, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_trailing_metadata), (&PyTuple_Type), 1, "trailing_metadata", 1))) __PYX_ERR(9, 304, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_2abort(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v_code, __pyx_v_details, __pyx_v_trailing_metadata);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_2abort(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_code, PyObject *__pyx_v_details, PyObject *__pyx_v_trailing_metadata) {
+  PyObject *__pyx_v_future = 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;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("abort", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":305
+ *               str details='',
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):
+ *         future = asyncio.run_coroutine_threadsafe(             # <<<<<<<<<<<<<<
+ *             self._context.abort(code, details, trailing_metadata),
+ *             self._loop)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 305, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_run_coroutine_threadsafe); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 305, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":306
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.abort(code, details, trailing_metadata),             # <<<<<<<<<<<<<<
+ *             self._loop)
+ *         # Abort should raise an AbortError
+ */
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_abort); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 306, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_5, __pyx_v_code, __pyx_v_details, __pyx_v_trailing_metadata};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 306, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":307
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.abort(code, details, trailing_metadata),
+ *             self._loop)             # <<<<<<<<<<<<<<
+ *         # Abort should raise an AbortError
+ *         future.exception()
+ */
+  __pyx_t_4 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_2, __pyx_v_self->_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 305, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v_future = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":309
+ *             self._loop)
+ *         # Abort should raise an AbortError
+ *         future.exception()             # <<<<<<<<<<<<<<
+ * 
+ *     def send_initial_metadata(self, object metadata):
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_future, __pyx_n_s_exception); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 309, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 309, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":301
+ *         self._loop = context._loop
+ * 
+ *     def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+
+  /* 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_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.abort", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_future);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":311
+ *         future.exception()
+ * 
+ *     def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.send_initial_metadata(metadata),
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_5send_initial_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_5send_initial_metadata = {"send_initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_5send_initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_5send_initial_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_metadata = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("send_initial_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_metadata,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 311, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "send_initial_metadata") < 0)) __PYX_ERR(9, 311, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_metadata = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("send_initial_metadata", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 311, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.send_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_4send_initial_metadata(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v_metadata);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_4send_initial_metadata(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_metadata) {
+  PyObject *__pyx_v_future = 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;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("send_initial_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":312
+ * 
+ *     def send_initial_metadata(self, object metadata):
+ *         future = asyncio.run_coroutine_threadsafe(             # <<<<<<<<<<<<<<
+ *             self._context.send_initial_metadata(metadata),
+ *             self._loop)
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_run_coroutine_threadsafe); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":313
+ *     def send_initial_metadata(self, object metadata):
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.send_initial_metadata(metadata),             # <<<<<<<<<<<<<<
+ *             self._loop)
+ *         future.result()
+ */
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_send_initial_metadata_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 313, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_v_metadata};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 313, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":314
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.send_initial_metadata(metadata),
+ *             self._loop)             # <<<<<<<<<<<<<<
+ *         future.result()
+ * 
+ */
+  __pyx_t_4 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_2, __pyx_v_self->_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 312, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v_future = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":315
+ *             self._context.send_initial_metadata(metadata),
+ *             self._loop)
+ *         future.result()             # <<<<<<<<<<<<<<
+ * 
+ *     def set_trailing_metadata(self, object metadata):
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_future, __pyx_n_s_result); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 315, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 315, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":311
+ *         future.exception()
+ * 
+ *     def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.send_initial_metadata(metadata),
+ */
+
+  /* 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_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.send_initial_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_future);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":317
+ *         future.result()
+ * 
+ *     def set_trailing_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._context.set_trailing_metadata(metadata)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_7set_trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_7set_trailing_metadata = {"set_trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_7set_trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_7set_trailing_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_metadata = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_trailing_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_metadata,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 317, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_trailing_metadata") < 0)) __PYX_ERR(9, 317, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_metadata = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_trailing_metadata", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 317, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.set_trailing_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_6set_trailing_metadata(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v_metadata);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_6set_trailing_metadata(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_metadata) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("set_trailing_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":318
+ * 
+ *     def set_trailing_metadata(self, object metadata):
+ *         self._context.set_trailing_metadata(metadata)             # <<<<<<<<<<<<<<
+ * 
+ *     def invocation_metadata(self):
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_set_trailing_metadata); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 318, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_metadata};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 318, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":317
+ *         future.result()
+ * 
+ *     def set_trailing_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._context.set_trailing_metadata(metadata)
+ * 
+ */
+
+  /* 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("_cython.cygrpc._SyncServicerContext.set_trailing_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":320
+ *         self._context.set_trailing_metadata(metadata)
+ * 
+ *     def invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._context.invocation_metadata()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_9invocation_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_9invocation_metadata = {"invocation_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_9invocation_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_9invocation_metadata(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("invocation_metadata (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("invocation_metadata", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "invocation_metadata", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_8invocation_metadata(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_8invocation_metadata(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("invocation_metadata", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":321
+ * 
+ *     def invocation_metadata(self):
+ *         return self._context.invocation_metadata()             # <<<<<<<<<<<<<<
+ * 
+ *     def set_code(self, object code):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_invocation_metadata); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 321, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 321, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":320
+ *         self._context.set_trailing_metadata(metadata)
+ * 
+ *     def invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._context.invocation_metadata()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.invocation_metadata", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":323
+ *         return self._context.invocation_metadata()
+ * 
+ *     def set_code(self, object code):             # <<<<<<<<<<<<<<
+ *         self._context.set_code(code)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_11set_code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_11set_code = {"set_code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_11set_code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_11set_code(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_code = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_code (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_code,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 323, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_code") < 0)) __PYX_ERR(9, 323, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_code = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_code", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 323, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.set_code", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_10set_code(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v_code);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_10set_code(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_code) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("set_code", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":324
+ * 
+ *     def set_code(self, object code):
+ *         self._context.set_code(code)             # <<<<<<<<<<<<<<
+ * 
+ *     def set_details(self, str details):
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_set_code); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_code};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 324, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":323
+ *         return self._context.invocation_metadata()
+ * 
+ *     def set_code(self, object code):             # <<<<<<<<<<<<<<
+ *         self._context.set_code(code)
+ * 
+ */
+
+  /* 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("_cython.cygrpc._SyncServicerContext.set_code", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":326
+ *         self._context.set_code(code)
+ * 
+ *     def set_details(self, str details):             # <<<<<<<<<<<<<<
+ *         self._context.set_details(details)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_13set_details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_13set_details = {"set_details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_13set_details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_13set_details(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_details (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 326, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_details") < 0)) __PYX_ERR(9, 326, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_details = ((PyObject*)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_details", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 326, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.set_details", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_details), (&PyString_Type), 1, "details", 1))) __PYX_ERR(9, 326, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_12set_details(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v_details);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_12set_details(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_details) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("set_details", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":327
+ * 
+ *     def set_details(self, str details):
+ *         self._context.set_details(details)             # <<<<<<<<<<<<<<
+ * 
+ *     def set_compression(self, object compression):
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_set_details); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_details};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 327, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":326
+ *         self._context.set_code(code)
+ * 
+ *     def set_details(self, str details):             # <<<<<<<<<<<<<<
+ *         self._context.set_details(details)
+ * 
+ */
+
+  /* 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("_cython.cygrpc._SyncServicerContext.set_details", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":329
+ *         self._context.set_details(details)
+ * 
+ *     def set_compression(self, object compression):             # <<<<<<<<<<<<<<
+ *         self._context.set_compression(compression)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_15set_compression(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_15set_compression = {"set_compression", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_15set_compression, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_15set_compression(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_compression = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("set_compression (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_compression,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_compression)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 329, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_compression") < 0)) __PYX_ERR(9, 329, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_compression = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("set_compression", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 329, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.set_compression", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_14set_compression(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v_compression);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_14set_compression(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_compression) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("set_compression", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":330
+ * 
+ *     def set_compression(self, object compression):
+ *         self._context.set_compression(compression)             # <<<<<<<<<<<<<<
+ * 
+ *     def disable_next_message_compression(self):
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_set_compression); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 330, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_compression};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 330, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":329
+ *         self._context.set_details(details)
+ * 
+ *     def set_compression(self, object compression):             # <<<<<<<<<<<<<<
+ *         self._context.set_compression(compression)
+ * 
+ */
+
+  /* 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("_cython.cygrpc._SyncServicerContext.set_compression", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":332
+ *         self._context.set_compression(compression)
+ * 
+ *     def disable_next_message_compression(self):             # <<<<<<<<<<<<<<
+ *         self._context.disable_next_message_compression()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_17disable_next_message_compression(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_17disable_next_message_compression = {"disable_next_message_compression", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_17disable_next_message_compression, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_17disable_next_message_compression(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("disable_next_message_compression (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("disable_next_message_compression", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "disable_next_message_compression", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_16disable_next_message_compression(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_16disable_next_message_compression(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("disable_next_message_compression", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":333
+ * 
+ *     def disable_next_message_compression(self):
+ *         self._context.disable_next_message_compression()             # <<<<<<<<<<<<<<
+ * 
+ *     def add_callback(self, object callback):
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_disable_next_message_compression); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 333, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 333, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":332
+ *         self._context.set_compression(compression)
+ * 
+ *     def disable_next_message_compression(self):             # <<<<<<<<<<<<<<
+ *         self._context.disable_next_message_compression()
+ * 
+ */
+
+  /* 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("_cython.cygrpc._SyncServicerContext.disable_next_message_compression", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":335
+ *         self._context.disable_next_message_compression()
+ * 
+ *     def add_callback(self, object callback):             # <<<<<<<<<<<<<<
+ *         self._callbacks.append(callback)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_19add_callback(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_19add_callback = {"add_callback", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_19add_callback, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_19add_callback(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_callback = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("add_callback (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_callback,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_callback)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 335, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_callback") < 0)) __PYX_ERR(9, 335, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_callback = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("add_callback", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 335, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.add_callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_18add_callback(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v_callback);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_18add_callback(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, PyObject *__pyx_v_callback) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("add_callback", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":336
+ * 
+ *     def add_callback(self, object callback):
+ *         self._callbacks.append(callback)             # <<<<<<<<<<<<<<
+ * 
+ *     def peer(self):
+ */
+  if (unlikely(__pyx_v_self->_callbacks == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
+    __PYX_ERR(9, 336, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_PyList_Append(__pyx_v_self->_callbacks, __pyx_v_callback); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(9, 336, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":335
+ *         self._context.disable_next_message_compression()
+ * 
+ *     def add_callback(self, object callback):             # <<<<<<<<<<<<<<
+ *         self._callbacks.append(callback)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.add_callback", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":338
+ *         self._callbacks.append(callback)
+ * 
+ *     def peer(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_21peer(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_21peer = {"peer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_21peer, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_21peer(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("peer", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "peer", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_20peer(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_20peer(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("peer", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":339
+ * 
+ *     def peer(self):
+ *         return self._context.peer()             # <<<<<<<<<<<<<<
+ * 
+ *     def peer_identities(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_peer); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 339, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 339, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":338
+ *         self._callbacks.append(callback)
+ * 
+ *     def peer(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.peer", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":341
+ *         return self._context.peer()
+ * 
+ *     def peer_identities(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer_identities()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_23peer_identities(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_23peer_identities = {"peer_identities", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_23peer_identities, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_23peer_identities(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer_identities (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("peer_identities", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "peer_identities", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_22peer_identities(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_22peer_identities(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("peer_identities", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":342
+ * 
+ *     def peer_identities(self):
+ *         return self._context.peer_identities()             # <<<<<<<<<<<<<<
+ * 
+ *     def peer_identity_key(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_peer_identities); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 342, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 342, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":341
+ *         return self._context.peer()
+ * 
+ *     def peer_identities(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer_identities()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.peer_identities", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":344
+ *         return self._context.peer_identities()
+ * 
+ *     def peer_identity_key(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer_identity_key()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_25peer_identity_key(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_25peer_identity_key = {"peer_identity_key", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_25peer_identity_key, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_25peer_identity_key(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("peer_identity_key (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("peer_identity_key", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "peer_identity_key", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_24peer_identity_key(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_24peer_identity_key(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("peer_identity_key", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":345
+ * 
+ *     def peer_identity_key(self):
+ *         return self._context.peer_identity_key()             # <<<<<<<<<<<<<<
+ * 
+ *     def auth_context(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_peer_identity_key); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 345, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 345, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":344
+ *         return self._context.peer_identities()
+ * 
+ *     def peer_identity_key(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer_identity_key()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.peer_identity_key", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":347
+ *         return self._context.peer_identity_key()
+ * 
+ *     def auth_context(self):             # <<<<<<<<<<<<<<
+ *         return self._context.auth_context()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_27auth_context(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_27auth_context = {"auth_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_27auth_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_27auth_context(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("auth_context (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("auth_context", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "auth_context", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_26auth_context(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_26auth_context(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("auth_context", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":348
+ * 
+ *     def auth_context(self):
+ *         return self._context.auth_context()             # <<<<<<<<<<<<<<
+ * 
+ *     def time_remaining(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_auth_context); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 348, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 348, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":347
+ *         return self._context.peer_identity_key()
+ * 
+ *     def auth_context(self):             # <<<<<<<<<<<<<<
+ *         return self._context.auth_context()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.auth_context", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":350
+ *         return self._context.auth_context()
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         return self._context.time_remaining()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_29time_remaining(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_29time_remaining = {"time_remaining", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_29time_remaining, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_29time_remaining(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("time_remaining (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("time_remaining", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "time_remaining", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_28time_remaining(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_28time_remaining(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("time_remaining", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":351
+ * 
+ *     def time_remaining(self):
+ *         return self._context.time_remaining()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_context), __pyx_n_s_time_remaining); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 351, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 351, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":350
+ *         return self._context.auth_context()
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         return self._context.time_remaining()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.time_remaining", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_31__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_31__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_31__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_31__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_30__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_30__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_33__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_33__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_33__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_33__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_32__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_SyncServicerContext_32__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._SyncServicerContext.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_152generator24(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":354
+ * 
+ * 
+ * async def _run_interceptor(object interceptors, object query_handler,             # <<<<<<<<<<<<<<
+ *                            object handler_call_details):
+ *     interceptor = next(interceptors, None)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_151_run_interceptor(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_151_run_interceptor = {"_run_interceptor", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_151_run_interceptor, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_151_run_interceptor(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_interceptors = 0;
+  PyObject *__pyx_v_query_handler = 0;
+  PyObject *__pyx_v_handler_call_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_run_interceptor (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_interceptors,&__pyx_n_s_query_handler,&__pyx_n_s_handler_call_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_interceptors)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 354, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_query_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 354, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_run_interceptor", 1, 3, 3, 1); __PYX_ERR(9, 354, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_handler_call_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 354, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_run_interceptor", 1, 3, 3, 2); __PYX_ERR(9, 354, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_run_interceptor") < 0)) __PYX_ERR(9, 354, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_interceptors = values[0];
+    __pyx_v_query_handler = values[1];
+    __pyx_v_handler_call_details = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_run_interceptor", 1, 3, 3, __pyx_nargs); __PYX_ERR(9, 354, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._run_interceptor", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_150_run_interceptor(__pyx_self, __pyx_v_interceptors, __pyx_v_query_handler, __pyx_v_handler_call_details);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_150_run_interceptor(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_interceptors, PyObject *__pyx_v_query_handler, PyObject *__pyx_v_handler_call_details) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_run_interceptor", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 354, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_interceptors = __pyx_v_interceptors;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_interceptors);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_interceptors);
+  __pyx_cur_scope->__pyx_v_query_handler = __pyx_v_query_handler;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_query_handler);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_query_handler);
+  __pyx_cur_scope->__pyx_v_handler_call_details = __pyx_v_handler_call_details;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_handler_call_details);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_handler_call_details);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_152generator24, __pyx_codeobj__81, (PyObject *) __pyx_cur_scope, __pyx_n_s_run_interceptor, __pyx_n_s_run_interceptor, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 354, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._run_interceptor", __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_7_cython_6cygrpc_152generator24(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_run_interceptor", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 354, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":356
+ * async def _run_interceptor(object interceptors, object query_handler,
+ *                            object handler_call_details):
+ *     interceptor = next(interceptors, None)             # <<<<<<<<<<<<<<
+ *     if interceptor:
+ *         continuation = functools.partial(_run_interceptor, interceptors,
+ */
+  __pyx_t_1 = __Pyx_PyIter_Next2(__pyx_cur_scope->__pyx_v_interceptors, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_interceptor = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":357
+ *                            object handler_call_details):
+ *     interceptor = next(interceptors, None)
+ *     if interceptor:             # <<<<<<<<<<<<<<
+ *         continuation = functools.partial(_run_interceptor, interceptors,
+ *                                          query_handler)
+ */
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_interceptor); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(9, 357, __pyx_L1_error)
+  if (__pyx_t_2) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":358
+ *     interceptor = next(interceptors, None)
+ *     if interceptor:
+ *         continuation = functools.partial(_run_interceptor, interceptors,             # <<<<<<<<<<<<<<
+ *                                          query_handler)
+ *         return await interceptor.intercept_service(continuation, handler_call_details)
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_functools); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 358, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_partial); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 358, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_run_interceptor); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 358, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":359
+ *     if interceptor:
+ *         continuation = functools.partial(_run_interceptor, interceptors,
+ *                                          query_handler)             # <<<<<<<<<<<<<<
+ *         return await interceptor.intercept_service(continuation, handler_call_details)
+ *     else:
+ */
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_5, __pyx_t_3, __pyx_cur_scope->__pyx_v_interceptors, __pyx_cur_scope->__pyx_v_query_handler};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 358, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_v_continuation = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":360
+ *         continuation = functools.partial(_run_interceptor, interceptors,
+ *                                          query_handler)
+ *         return await interceptor.intercept_service(continuation, handler_call_details)             # <<<<<<<<<<<<<<
+ *     else:
+ *         return query_handler(handler_call_details)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_interceptor, __pyx_n_s_intercept_service); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 360, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_3)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_3);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_continuation, __pyx_cur_scope->__pyx_v_handler_call_details};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 360, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L5_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 360, __pyx_L1_error)
+      __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+    } else {
+      __pyx_t_1 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 360, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+    }
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":357
+ *                            object handler_call_details):
+ *     interceptor = next(interceptors, None)
+ *     if interceptor:             # <<<<<<<<<<<<<<
+ *         continuation = functools.partial(_run_interceptor, interceptors,
+ *                                          query_handler)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":362
+ *         return await interceptor.intercept_service(continuation, handler_call_details)
+ *     else:
+ *         return query_handler(handler_call_details)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_query_handler);
+    __pyx_t_4 = __pyx_cur_scope->__pyx_v_query_handler; __pyx_t_3 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_4))) {
+      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
+      if (likely(__pyx_t_3)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+        __Pyx_INCREF(__pyx_t_3);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_4, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_handler_call_details};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 362, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L0;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":354
+ * 
+ * 
+ * async def _run_interceptor(object interceptors, object query_handler,             # <<<<<<<<<<<<<<
+ *                            object handler_call_details):
+ *     interceptor = next(interceptors, None)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_run_interceptor", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":365
+ * 
+ * 
+ * def _is_async_handler(object handler):             # <<<<<<<<<<<<<<
+ *     """Inspect if a method handler is async or sync."""
+ *     return inspect.isawaitable(handler) or inspect.iscoroutinefunction(handler) or inspect.isasyncgenfunction(handler)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_154_is_async_handler(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_153_is_async_handler, "Inspect if a method handler is async or sync.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_154_is_async_handler = {"_is_async_handler", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_154_is_async_handler, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_153_is_async_handler};
+static PyObject *__pyx_pw_7_cython_6cygrpc_154_is_async_handler(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_handler = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_is_async_handler (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_handler,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 365, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_is_async_handler") < 0)) __PYX_ERR(9, 365, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_handler = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_is_async_handler", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 365, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._is_async_handler", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_153_is_async_handler(__pyx_self, __pyx_v_handler);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_153_is_async_handler(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_handler) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_is_async_handler", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":367
+ * def _is_async_handler(object handler):
+ *     """Inspect if a method handler is async or sync."""
+ *     return inspect.isawaitable(handler) or inspect.iscoroutinefunction(handler) or inspect.isasyncgenfunction(handler)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_inspect); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 367, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_isawaitable); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 367, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_4))) {
+    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
+    if (likely(__pyx_t_3)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_4, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_handler};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 367, __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_ERR(9, 367, __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_L3_bool_binop_done;
+  }
+  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_inspect); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 367, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_iscoroutinefunction); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 367, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_handler};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 367, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 367, __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_L3_bool_binop_done;
+  }
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_inspect); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 367, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_isasyncgenfunction); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 367, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_4))) {
+    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
+    if (likely(__pyx_t_3)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_4, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_handler};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 367, __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_L3_bool_binop_done:;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":365
+ * 
+ * 
+ * def _is_async_handler(object handler):             # <<<<<<<<<<<<<<
+ *     """Inspect if a method handler is async or sync."""
+ *     return inspect.isawaitable(handler) or inspect.iscoroutinefunction(handler) or inspect.isasyncgenfunction(handler)
+ */
+
+  /* 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("_cython.cygrpc._is_async_handler", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_157generator25(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":370
+ * 
+ * 
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,             # <<<<<<<<<<<<<<
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_156_find_method_handler(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_156_find_method_handler = {"_find_method_handler", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_156_find_method_handler, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_156_find_method_handler(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_method = 0;
+  PyObject *__pyx_v_metadata = 0;
+  PyObject *__pyx_v_generic_handlers = 0;
+  PyObject *__pyx_v_interceptors = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[4] = {0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_find_method_handler (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method,&__pyx_n_s_metadata,&__pyx_n_s_generic_handlers,&__pyx_n_s_interceptors,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 370, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_metadata)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 370, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_find_method_handler", 1, 4, 4, 1); __PYX_ERR(9, 370, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_generic_handlers)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 370, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_find_method_handler", 1, 4, 4, 2); __PYX_ERR(9, 370, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_interceptors)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 370, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_find_method_handler", 1, 4, 4, 3); __PYX_ERR(9, 370, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_find_method_handler") < 0)) __PYX_ERR(9, 370, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 4)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+    }
+    __pyx_v_method = ((PyObject*)values[0]);
+    __pyx_v_metadata = ((PyObject*)values[1]);
+    __pyx_v_generic_handlers = ((PyObject*)values[2]);
+    __pyx_v_interceptors = ((PyObject*)values[3]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_find_method_handler", 1, 4, 4, __pyx_nargs); __PYX_ERR(9, 370, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._find_method_handler", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_method), (&PyString_Type), 1, "method", 1))) __PYX_ERR(9, 370, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_metadata), (&PyTuple_Type), 1, "metadata", 1))) __PYX_ERR(9, 370, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_generic_handlers), (&PyList_Type), 1, "generic_handlers", 1))) __PYX_ERR(9, 370, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_interceptors), (&PyTuple_Type), 1, "interceptors", 1))) __PYX_ERR(9, 371, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_155_find_method_handler(__pyx_self, __pyx_v_method, __pyx_v_metadata, __pyx_v_generic_handlers, __pyx_v_interceptors);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_155_find_method_handler(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method, PyObject *__pyx_v_metadata, PyObject *__pyx_v_generic_handlers, PyObject *__pyx_v_interceptors) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_find_method_handler", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 370, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_method = __pyx_v_method;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_method);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_method);
+  __pyx_cur_scope->__pyx_v_metadata = __pyx_v_metadata;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_metadata);
+  __pyx_cur_scope->__pyx_v_generic_handlers = __pyx_v_generic_handlers;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_generic_handlers);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_generic_handlers);
+  __pyx_cur_scope->__pyx_v_interceptors = __pyx_v_interceptors;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_interceptors);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_interceptors);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_157generator25, __pyx_codeobj__82, (PyObject *) __pyx_cur_scope, __pyx_n_s_find_method_handler, __pyx_n_s_find_method_handler, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 370, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._find_method_handler", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":372
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):             # <<<<<<<<<<<<<<
+ *         for generic_handler in generic_handlers:
+ *             method_handler = generic_handler.service(handler_call_details)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_find_method_handler_1query_handlers(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_20_find_method_handler_1query_handlers = {"query_handlers", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_find_method_handler_1query_handlers, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_20_find_method_handler_1query_handlers(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_handler_call_details = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("query_handlers (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_handler_call_details,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_handler_call_details)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 372, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "query_handlers") < 0)) __PYX_ERR(9, 372, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_handler_call_details = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("query_handlers", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 372, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._find_method_handler.query_handlers", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_20_find_method_handler_query_handlers(__pyx_self, __pyx_v_handler_call_details);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_20_find_method_handler_query_handlers(PyObject *__pyx_self, PyObject *__pyx_v_handler_call_details) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *__pyx_outer_scope;
+  PyObject *__pyx_v_generic_handler = NULL;
+  PyObject *__pyx_v_method_handler = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  unsigned int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("query_handlers", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":373
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):
+ *         for generic_handler in generic_handlers:             # <<<<<<<<<<<<<<
+ *             method_handler = generic_handler.service(handler_call_details)
+ *             if method_handler is not None:
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_generic_handlers)) { __Pyx_RaiseClosureNameError("generic_handlers"); __PYX_ERR(9, 373, __pyx_L1_error) }
+  if (unlikely(__pyx_cur_scope->__pyx_v_generic_handlers == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+    __PYX_ERR(9, 373, __pyx_L1_error)
+  }
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_generic_handlers; __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_2 = 0;
+  for (;;) {
+    {
+      Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+      #if !CYTHON_ASSUME_SAFE_MACROS
+      if (unlikely((__pyx_temp < 0))) __PYX_ERR(9, 373, __pyx_L1_error)
+      #endif
+      if (__pyx_t_2 >= __pyx_temp) break;
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(9, 373, __pyx_L1_error)
+    #else
+    __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 373, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    #endif
+    __Pyx_XDECREF_SET(__pyx_v_generic_handler, __pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":374
+ *     def query_handlers(handler_call_details):
+ *         for generic_handler in generic_handlers:
+ *             method_handler = generic_handler.service(handler_call_details)             # <<<<<<<<<<<<<<
+ *             if method_handler is not None:
+ *                 return method_handler
+ */
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_generic_handler, __pyx_n_s_service); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 374, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_v_handler_call_details};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 374, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __Pyx_XDECREF_SET(__pyx_v_method_handler, __pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":375
+ *         for generic_handler in generic_handlers:
+ *             method_handler = generic_handler.service(handler_call_details)
+ *             if method_handler is not None:             # <<<<<<<<<<<<<<
+ *                 return method_handler
+ *         return None
+ */
+    __pyx_t_7 = (__pyx_v_method_handler != Py_None);
+    if (__pyx_t_7) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":376
+ *             method_handler = generic_handler.service(handler_call_details)
+ *             if method_handler is not None:
+ *                 return method_handler             # <<<<<<<<<<<<<<
+ *         return None
+ * 
+ */
+      __Pyx_XDECREF(__pyx_r);
+      __Pyx_INCREF(__pyx_v_method_handler);
+      __pyx_r = __pyx_v_method_handler;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      goto __pyx_L0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":375
+ *         for generic_handler in generic_handlers:
+ *             method_handler = generic_handler.service(handler_call_details)
+ *             if method_handler is not None:             # <<<<<<<<<<<<<<
+ *                 return method_handler
+ *         return None
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":373
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):
+ *         for generic_handler in generic_handlers:             # <<<<<<<<<<<<<<
+ *             method_handler = generic_handler.service(handler_call_details)
+ *             if method_handler is not None:
+ */
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":377
+ *             if method_handler is not None:
+ *                 return method_handler
+ *         return None             # <<<<<<<<<<<<<<
+ * 
+ *     cdef _HandlerCallDetails handler_call_details = _HandlerCallDetails(method,
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":372
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):             # <<<<<<<<<<<<<<
+ *         for generic_handler in generic_handlers:
+ *             method_handler = generic_handler.service(handler_call_details)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc._find_method_handler.query_handlers", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_generic_handler);
+  __Pyx_XDECREF(__pyx_v_method_handler);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":370
+ * 
+ * 
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,             # <<<<<<<<<<<<<<
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):
+ */
+
+static PyObject *__pyx_gb_7_cython_6cygrpc_157generator25(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_find_method_handler", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 370, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":372
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):             # <<<<<<<<<<<<<<
+ *         for generic_handler in generic_handlers:
+ *             method_handler = generic_handler.service(handler_call_details)
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_find_method_handler_1query_handlers, 0, __pyx_n_s_find_method_handler_locals_quer, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__84)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 372, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_query_handlers = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":379
+ *         return None
+ * 
+ *     cdef _HandlerCallDetails handler_call_details = _HandlerCallDetails(method,             # <<<<<<<<<<<<<<
+ *                                                                         metadata)
+ *     # interceptor
+ */
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 379, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_method);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_method);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_v_method)) __PYX_ERR(9, 379, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_v_metadata)) __PYX_ERR(9, 379, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__HandlerCallDetails), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 379, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_handler_call_details = ((struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":382
+ *                                                                         metadata)
+ *     # interceptor
+ *     if interceptors:             # <<<<<<<<<<<<<<
+ *         return await _run_interceptor(iter(interceptors), query_handlers,
+ *                                       handler_call_details)
+ */
+  __pyx_t_3 = (__pyx_cur_scope->__pyx_v_interceptors != Py_None)&&(PyTuple_GET_SIZE(__pyx_cur_scope->__pyx_v_interceptors) != 0);
+  if (__pyx_t_3) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":383
+ *     # interceptor
+ *     if interceptors:
+ *         return await _run_interceptor(iter(interceptors), query_handlers,             # <<<<<<<<<<<<<<
+ *                                       handler_call_details)
+ *     else:
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_run_interceptor); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 383, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_interceptors); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 383, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":384
+ *     if interceptors:
+ *         return await _run_interceptor(iter(interceptors), query_handlers,
+ *                                       handler_call_details)             # <<<<<<<<<<<<<<
+ *     else:
+ *         return query_handlers(handler_call_details)
+ */
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_1))) {
+      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);
+      if (likely(__pyx_t_5)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+        __Pyx_INCREF(__pyx_t_5);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_1, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_5, __pyx_t_4, __pyx_cur_scope->__pyx_v_query_handlers, ((PyObject *)__pyx_cur_scope->__pyx_v_handler_call_details)};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 383, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L5_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 383, __pyx_L1_error)
+      __pyx_t_2 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_2);
+    } else {
+      __pyx_t_2 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_2) < 0) __PYX_ERR(9, 383, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+    }
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":382
+ *                                                                         metadata)
+ *     # interceptor
+ *     if interceptors:             # <<<<<<<<<<<<<<
+ *         return await _run_interceptor(iter(interceptors), query_handlers,
+ *                                       handler_call_details)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":386
+ *                                       handler_call_details)
+ *     else:
+ *         return query_handlers(handler_call_details)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_2 = __pyx_pf_7_cython_6cygrpc_20_find_method_handler_query_handlers(__pyx_cur_scope->__pyx_v_query_handlers, ((PyObject *)__pyx_cur_scope->__pyx_v_handler_call_details)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 386, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L0;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":370
+ * 
+ * 
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,             # <<<<<<<<<<<<<<
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_find_method_handler", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_160generator26(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":389
+ * 
+ * 
+ * async def _finish_handler_with_unary_response(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                               object unary_handler,
+ *                                               object request,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_159_finish_handler_with_unary_response(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_158_finish_handler_with_unary_response, "Finishes server method handler with a single response.\n\n    This function executes the application handler, and handles response\n    sending, as well as errors. It is shared between unary-unary and\n    stream-unary handlers.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_159_finish_handler_with_unary_response = {"_finish_handler_with_unary_response", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_159_finish_handler_with_unary_response, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_158_finish_handler_with_unary_response};
+static PyObject *__pyx_pw_7_cython_6cygrpc_159_finish_handler_with_unary_response(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_unary_handler = 0;
+  PyObject *__pyx_v_request = 0;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context = 0;
+  PyObject *__pyx_v_response_serializer = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[6] = {0,0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_finish_handler_with_unary_response (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rpc_state,&__pyx_n_s_unary_handler,&__pyx_n_s_request,&__pyx_n_s_servicer_context,&__pyx_n_s_response_serializer,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
+        CYTHON_FALLTHROUGH;
+        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 389, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_unary_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 389, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_unary_response", 1, 6, 6, 1); __PYX_ERR(9, 389, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_request)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 389, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_unary_response", 1, 6, 6, 2); __PYX_ERR(9, 389, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_servicer_context)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 389, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_unary_response", 1, 6, 6, 3); __PYX_ERR(9, 389, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_response_serializer)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 389, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_unary_response", 1, 6, 6, 4); __PYX_ERR(9, 389, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  5:
+        if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[5]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 389, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_unary_response", 1, 6, 6, 5); __PYX_ERR(9, 389, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_finish_handler_with_unary_response") < 0)) __PYX_ERR(9, 389, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 6)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+      values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+      values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
+    }
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[0]);
+    __pyx_v_unary_handler = values[1];
+    __pyx_v_request = values[2];
+    __pyx_v_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)values[3]);
+    __pyx_v_response_serializer = values[4];
+    __pyx_v_loop = values[5];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_finish_handler_with_unary_response", 1, 6, 6, __pyx_nargs); __PYX_ERR(9, 389, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._finish_handler_with_unary_response", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 389, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_servicer_context), __pyx_ptype_7_cython_6cygrpc__ServicerContext, 1, "servicer_context", 0))) __PYX_ERR(9, 392, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_158_finish_handler_with_unary_response(__pyx_self, __pyx_v_rpc_state, __pyx_v_unary_handler, __pyx_v_request, __pyx_v_servicer_context, __pyx_v_response_serializer, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_158_finish_handler_with_unary_response(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_unary_handler, PyObject *__pyx_v_request, struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context, PyObject *__pyx_v_response_serializer, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_finish_handler_with_unary_response", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 389, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_unary_handler = __pyx_v_unary_handler;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_unary_handler);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_unary_handler);
+  __pyx_cur_scope->__pyx_v_request = __pyx_v_request;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_request);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_request);
+  __pyx_cur_scope->__pyx_v_servicer_context = __pyx_v_servicer_context;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context);
+  __pyx_cur_scope->__pyx_v_response_serializer = __pyx_v_response_serializer;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_response_serializer);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_response_serializer);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_160generator26, __pyx_codeobj__85, (PyObject *) __pyx_cur_scope, __pyx_n_s_finish_handler_with_unary_respo, __pyx_n_s_finish_handler_with_unary_respo, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 389, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._finish_handler_with_unary_response", __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_7_cython_6cygrpc_160generator26(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  Py_ssize_t __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_finish_handler_with_unary_response", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    case 2: goto __pyx_L6_resume_from_await;
+    case 3: goto __pyx_L12_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 389, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":404
+ *     cdef object response_message
+ *     cdef _SyncServicerContext sync_servicer_context
+ *     install_context_from_request_call_event_aio(rpc_state)             # <<<<<<<<<<<<<<
+ * 
+ *     if _is_async_handler(unary_handler):
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_install_context_from_request_cal); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 404, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state)};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 404, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":406
+ *     install_context_from_request_call_event_aio(rpc_state)
+ * 
+ *     if _is_async_handler(unary_handler):             # <<<<<<<<<<<<<<
+ *         # Run async method handlers in this coroutine
+ *         response_message = await unary_handler(
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_is_async_handler); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 406, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_unary_handler};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 406, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(9, 406, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":410
+ *         response_message = await unary_handler(
+ *             request,
+ *             servicer_context,             # <<<<<<<<<<<<<<
+ *         )
+ *     else:
+ */
+    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_unary_handler);
+    __pyx_t_2 = __pyx_cur_scope->__pyx_v_unary_handler; __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_request, ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 408, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L5_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 408, __pyx_L1_error)
+      __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+    } else {
+      __pyx_t_1 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 408, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+    }
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_v_response_message = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":406
+ *     install_context_from_request_call_event_aio(rpc_state)
+ * 
+ *     if _is_async_handler(unary_handler):             # <<<<<<<<<<<<<<
+ *         # Run async method handlers in this coroutine
+ *         response_message = await unary_handler(
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":414
+ *     else:
+ *         # Run sync method handlers in the thread pool
+ *         sync_servicer_context = _SyncServicerContext(servicer_context)             # <<<<<<<<<<<<<<
+ *         response_message = await loop.run_in_executor(
+ *             rpc_state.server.thread_pool(),
+ */
+  /*else*/ {
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext), ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 414, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_v_sync_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":415
+ *         # Run sync method handlers in the thread pool
+ *         sync_servicer_context = _SyncServicerContext(servicer_context)
+ *         response_message = await loop.run_in_executor(             # <<<<<<<<<<<<<<
+ *             rpc_state.server.thread_pool(),
+ *             unary_handler,
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_loop, __pyx_n_s_run_in_executor); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 415, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":416
+ *         sync_servicer_context = _SyncServicerContext(servicer_context)
+ *         response_message = await loop.run_in_executor(
+ *             rpc_state.server.thread_pool(),             # <<<<<<<<<<<<<<
+ *             unary_handler,
+ *             request,
+ */
+    __pyx_t_3 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioServer *)__pyx_cur_scope->__pyx_v_rpc_state->server->__pyx_vtab)->thread_pool(__pyx_cur_scope->__pyx_v_rpc_state->server); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 416, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":419
+ *             unary_handler,
+ *             request,
+ *             sync_servicer_context,             # <<<<<<<<<<<<<<
+ *         )
+ *         # Support sync-stack callback
+ */
+    __pyx_t_6 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[5] = {__pyx_t_6, __pyx_t_3, __pyx_cur_scope->__pyx_v_unary_handler, __pyx_cur_scope->__pyx_v_request, ((PyObject *)__pyx_cur_scope->__pyx_v_sync_servicer_context)};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 4+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 415, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 2;
+      return __pyx_r;
+      __pyx_L6_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 415, __pyx_L1_error)
+      __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+    } else {
+      __pyx_t_1 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 415, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+    }
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_v_response_message = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":422
+ *         )
+ *         # Support sync-stack callback
+ *         for callback in sync_servicer_context._callbacks:             # <<<<<<<<<<<<<<
+ *             callback()
+ * 
+ */
+    if (unlikely(__pyx_cur_scope->__pyx_v_sync_servicer_context->_callbacks == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+      __PYX_ERR(9, 422, __pyx_L1_error)
+    }
+    __pyx_t_1 = __pyx_cur_scope->__pyx_v_sync_servicer_context->_callbacks; __Pyx_INCREF(__pyx_t_1);
+    __pyx_t_7 = 0;
+    for (;;) {
+      {
+        Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
+        #if !CYTHON_ASSUME_SAFE_MACROS
+        if (unlikely((__pyx_temp < 0))) __PYX_ERR(9, 422, __pyx_L1_error)
+        #endif
+        if (__pyx_t_7 >= __pyx_temp) break;
+      }
+      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely((0 < 0))) __PYX_ERR(9, 422, __pyx_L1_error)
+      #else
+      __pyx_t_2 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 422, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      #endif
+      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_callback);
+      __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_callback, __pyx_t_2);
+      __Pyx_GIVEREF(__pyx_t_2);
+      __pyx_t_2 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":423
+ *         # Support sync-stack callback
+ *         for callback in sync_servicer_context._callbacks:
+ *             callback()             # <<<<<<<<<<<<<<
+ * 
+ *     # Raises exception if aborted
+ */
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_callback);
+      __pyx_t_3 = __pyx_cur_scope->__pyx_v_callback; __pyx_t_6 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_6, NULL};
+        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 423, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":422
+ *         )
+ *         # Support sync-stack callback
+ *         for callback in sync_servicer_context._callbacks:             # <<<<<<<<<<<<<<
+ *             callback()
+ * 
+ */
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":426
+ * 
+ *     # Raises exception if aborted
+ *     rpc_state.raise_for_termination()             # <<<<<<<<<<<<<<
+ * 
+ *     # Serializes the response message
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->raise_for_termination(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 426, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":430
+ *     # Serializes the response message
+ *     cdef bytes response_raw
+ *     if rpc_state.status_code == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *         response_raw = serialize(
+ *             response_serializer,
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_rpc_state->status_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 430, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 430, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ok); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 430, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 430, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(9, 430, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":431
+ *     cdef bytes response_raw
+ *     if rpc_state.status_code == StatusCode.ok:
+ *         response_raw = serialize(             # <<<<<<<<<<<<<<
+ *             response_serializer,
+ *             response_message,
+ */
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc_serialize(__pyx_cur_scope->__pyx_v_response_serializer, __pyx_cur_scope->__pyx_v_response_message); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 431, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_cur_scope->__pyx_v_response_raw = ((PyObject*)__pyx_t_2);
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":430
+ *     # Serializes the response message
+ *     cdef bytes response_raw
+ *     if rpc_state.status_code == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *         response_raw = serialize(
+ *             response_serializer,
+ */
+    goto __pyx_L10;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":437
+ *     else:
+ *         # Discards the response message if the status code is non-OK.
+ *         response_raw = b''             # <<<<<<<<<<<<<<
+ * 
+ *     # Assembles the batch operations
+ */
+  /*else*/ {
+    __Pyx_INCREF(__pyx_kp_b__7);
+    __Pyx_GIVEREF(__pyx_kp_b__7);
+    __pyx_cur_scope->__pyx_v_response_raw = __pyx_kp_b__7;
+  }
+  __pyx_L10:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":442
+ *     cdef tuple finish_ops
+ *     finish_ops = (
+ *         SendMessageOperation(response_raw, rpc_state.get_write_flag()),             # <<<<<<<<<<<<<<
+ *         SendStatusFromServerOperation(
+ *             rpc_state.trailing_metadata,
+ */
+  __pyx_t_8 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->get_write_flag(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 442, __pyx_L1_error)
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 442, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 442, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_response_raw);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_response_raw);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_response_raw)) __PYX_ERR(9, 442, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(9, 442, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendMessageOperation), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 442, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":445
+ *         SendStatusFromServerOperation(
+ *             rpc_state.trailing_metadata,
+ *             rpc_state.status_code,             # <<<<<<<<<<<<<<
+ *             rpc_state.status_details,
+ *             _EMPTY_FLAGS,
+ */
+  __pyx_t_3 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_rpc_state->status_code); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 445, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":447
+ *             rpc_state.status_code,
+ *             rpc_state.status_details,
+ *             _EMPTY_FLAGS,             # <<<<<<<<<<<<<<
+ *         ),
+ *     )
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 447, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":443
+ *     finish_ops = (
+ *         SendMessageOperation(response_raw, rpc_state.get_write_flag()),
+ *         SendStatusFromServerOperation(             # <<<<<<<<<<<<<<
+ *             rpc_state.trailing_metadata,
+ *             rpc_state.status_code,
+ */
+  __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 443, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_rpc_state->trailing_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_rpc_state->trailing_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_cur_scope->__pyx_v_rpc_state->trailing_metadata)) __PYX_ERR(9, 443, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_3);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_3)) __PYX_ERR(9, 443, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_rpc_state->status_details);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_rpc_state->status_details);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_cur_scope->__pyx_v_rpc_state->status_details)) __PYX_ERR(9, 443, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_t_1)) __PYX_ERR(9, 443, __pyx_L1_error);
+  __pyx_t_3 = 0;
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation), __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 443, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":442
+ *     cdef tuple finish_ops
+ *     finish_ops = (
+ *         SendMessageOperation(response_raw, rpc_state.get_write_flag()),             # <<<<<<<<<<<<<<
+ *         SendStatusFromServerOperation(
+ *             rpc_state.trailing_metadata,
+ */
+  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 442, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(9, 442, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1)) __PYX_ERR(9, 442, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_6);
+  __pyx_cur_scope->__pyx_v_finish_ops = ((PyObject*)__pyx_t_6);
+  __pyx_t_6 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":450
+ *         ),
+ *     )
+ *     if not rpc_state.metadata_sent:             # <<<<<<<<<<<<<<
+ *         finish_ops = prepend_send_initial_metadata_op(
+ *             finish_ops,
+ */
+  __pyx_t_5 = (!__pyx_cur_scope->__pyx_v_rpc_state->metadata_sent);
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":451
+ *     )
+ *     if not rpc_state.metadata_sent:
+ *         finish_ops = prepend_send_initial_metadata_op(             # <<<<<<<<<<<<<<
+ *             finish_ops,
+ *             None)
+ */
+    __pyx_t_6 = __pyx_f_7_cython_6cygrpc_prepend_send_initial_metadata_op(__pyx_cur_scope->__pyx_v_finish_ops, ((PyObject*)Py_None)); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 451, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    if (!(likely(PyTuple_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_6))) __PYX_ERR(9, 451, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_finish_ops);
+    __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_finish_ops, ((PyObject*)__pyx_t_6));
+    __Pyx_GIVEREF(__pyx_t_6);
+    __pyx_t_6 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":450
+ *         ),
+ *     )
+ *     if not rpc_state.metadata_sent:             # <<<<<<<<<<<<<<
+ *         finish_ops = prepend_send_initial_metadata_op(
+ *             finish_ops,
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":454
+ *             finish_ops,
+ *             None)
+ *     rpc_state.metadata_sent = True             # <<<<<<<<<<<<<<
+ *     rpc_state.status_sent = True
+ *     await execute_batch(rpc_state, finish_ops, loop)
+ */
+  __pyx_cur_scope->__pyx_v_rpc_state->metadata_sent = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":455
+ *             None)
+ *     rpc_state.metadata_sent = True
+ *     rpc_state.status_sent = True             # <<<<<<<<<<<<<<
+ *     await execute_batch(rpc_state, finish_ops, loop)
+ *     uninstall_context()
+ */
+  __pyx_cur_scope->__pyx_v_rpc_state->status_sent = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":456
+ *     rpc_state.metadata_sent = True
+ *     rpc_state.status_sent = True
+ *     await execute_batch(rpc_state, finish_ops, loop)             # <<<<<<<<<<<<<<
+ *     uninstall_context()
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 456, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_2, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_finish_ops, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 456, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_6);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 3;
+    return __pyx_r;
+    __pyx_L12_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 456, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 456, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":457
+ *     rpc_state.status_sent = True
+ *     await execute_batch(rpc_state, finish_ops, loop)
+ *     uninstall_context()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_uninstall_context); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 457, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 457, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":389
+ * 
+ * 
+ * async def _finish_handler_with_unary_response(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                               object unary_handler,
+ *                                               object request,
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_finish_handler_with_unary_response", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_163generator27(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":460
+ * 
+ * 
+ * async def _finish_handler_with_stream_responses(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                                 object stream_handler,
+ *                                                 object request,
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_162_finish_handler_with_stream_responses(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_161_finish_handler_with_stream_responses, "Finishes server method handler with multiple responses.\n\n    This function executes the application handler, and handles response\n    sending, as well as errors. It is shared between unary-stream and\n    stream-stream handlers.\n    ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_162_finish_handler_with_stream_responses = {"_finish_handler_with_stream_responses", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_162_finish_handler_with_stream_responses, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_161_finish_handler_with_stream_responses};
+static PyObject *__pyx_pw_7_cython_6cygrpc_162_finish_handler_with_stream_responses(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_stream_handler = 0;
+  PyObject *__pyx_v_request = 0;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[5] = {0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_finish_handler_with_stream_responses (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rpc_state,&__pyx_n_s_stream_handler,&__pyx_n_s_request,&__pyx_n_s_servicer_context,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 460, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_stream_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 460, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_stream_responses", 1, 5, 5, 1); __PYX_ERR(9, 460, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_request)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 460, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_stream_responses", 1, 5, 5, 2); __PYX_ERR(9, 460, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_servicer_context)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 460, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_stream_responses", 1, 5, 5, 3); __PYX_ERR(9, 460, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 460, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_finish_handler_with_stream_responses", 1, 5, 5, 4); __PYX_ERR(9, 460, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_finish_handler_with_stream_responses") < 0)) __PYX_ERR(9, 460, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 5)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+      values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+    }
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[0]);
+    __pyx_v_stream_handler = values[1];
+    __pyx_v_request = values[2];
+    __pyx_v_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)values[3]);
+    __pyx_v_loop = values[4];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_finish_handler_with_stream_responses", 1, 5, 5, __pyx_nargs); __PYX_ERR(9, 460, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._finish_handler_with_stream_responses", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 460, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_servicer_context), __pyx_ptype_7_cython_6cygrpc__ServicerContext, 1, "servicer_context", 0))) __PYX_ERR(9, 463, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_161_finish_handler_with_stream_responses(__pyx_self, __pyx_v_rpc_state, __pyx_v_stream_handler, __pyx_v_request, __pyx_v_servicer_context, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_161_finish_handler_with_stream_responses(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_stream_handler, PyObject *__pyx_v_request, struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_finish_handler_with_stream_responses", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 460, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_stream_handler = __pyx_v_stream_handler;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_stream_handler);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_stream_handler);
+  __pyx_cur_scope->__pyx_v_request = __pyx_v_request;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_request);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_request);
+  __pyx_cur_scope->__pyx_v_servicer_context = __pyx_v_servicer_context;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_163generator27, __pyx_codeobj__86, (PyObject *) __pyx_cur_scope, __pyx_n_s_finish_handler_with_stream_resp, __pyx_n_s_finish_handler_with_stream_resp, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 460, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._finish_handler_with_stream_responses", __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_7_cython_6cygrpc_163generator27(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_finish_handler_with_stream_responses", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    case 2: goto __pyx_L9_resume_from_await;
+    case 3: goto __pyx_L10_resume_from_await;
+    case 4: goto __pyx_L13_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 460, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":473
+ *     cdef object async_response_generator
+ *     cdef object response_message
+ *     install_context_from_request_call_event_aio(rpc_state)             # <<<<<<<<<<<<<<
+ * 
+ *     if inspect.iscoroutinefunction(stream_handler):
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_install_context_from_request_cal); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state)};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 473, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":475
+ *     install_context_from_request_call_event_aio(rpc_state)
+ * 
+ *     if inspect.iscoroutinefunction(stream_handler):             # <<<<<<<<<<<<<<
+ *         # Case 1: Coroutine async handler - using reader-writer API
+ *         # The handler uses reader / writer API, returns None.
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_inspect); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 475, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_iscoroutinefunction); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 475, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_cur_scope->__pyx_v_stream_handler};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 475, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(9, 475, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":480
+ *         await stream_handler(
+ *             request,
+ *             servicer_context,             # <<<<<<<<<<<<<<
+ *         )
+ *     else:
+ */
+    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_stream_handler);
+    __pyx_t_3 = __pyx_cur_scope->__pyx_v_stream_handler; __pyx_t_2 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_2, __pyx_cur_scope->__pyx_v_request, ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 478, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L5_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 478, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 478, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":475
+ *     install_context_from_request_call_event_aio(rpc_state)
+ * 
+ *     if inspect.iscoroutinefunction(stream_handler):             # <<<<<<<<<<<<<<
+ *         # Case 1: Coroutine async handler - using reader-writer API
+ *         # The handler uses reader / writer API, returns None.
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":483
+ *         )
+ *     else:
+ *         if inspect.isasyncgenfunction(stream_handler):             # <<<<<<<<<<<<<<
+ *             # Case 2: Async handler - async generator
+ *             # The handler uses async generator API
+ */
+  /*else*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_inspect); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 483, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_isasyncgenfunction); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 483, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_stream_handler};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 483, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(9, 483, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":488
+ *             async_response_generator = stream_handler(
+ *                 request,
+ *                 servicer_context,             # <<<<<<<<<<<<<<
+ *             )
+ *         else:
+ */
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_stream_handler);
+      __pyx_t_2 = __pyx_cur_scope->__pyx_v_stream_handler; __pyx_t_3 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_request, ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 486, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_cur_scope->__pyx_v_async_response_generator = __pyx_t_1;
+      __pyx_t_1 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":483
+ *         )
+ *     else:
+ *         if inspect.isasyncgenfunction(stream_handler):             # <<<<<<<<<<<<<<
+ *             # Case 2: Async handler - async generator
+ *             # The handler uses async generator API
+ */
+      goto __pyx_L6;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":494
+ *             # NOTE(lidiz) Streaming handler in sync stack is either a generator
+ *             # function or a function returns a generator.
+ *             sync_servicer_context = _SyncServicerContext(servicer_context)             # <<<<<<<<<<<<<<
+ *             gen = stream_handler(request, sync_servicer_context)
+ *             async_response_generator = generator_to_async_generator(gen,
+ */
+    /*else*/ {
+      __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext), ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 494, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_cur_scope->__pyx_v_sync_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)__pyx_t_1);
+      __pyx_t_1 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":495
+ *             # function or a function returns a generator.
+ *             sync_servicer_context = _SyncServicerContext(servicer_context)
+ *             gen = stream_handler(request, sync_servicer_context)             # <<<<<<<<<<<<<<
+ *             async_response_generator = generator_to_async_generator(gen,
+ *                                                                     loop,
+ */
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_stream_handler);
+      __pyx_t_2 = __pyx_cur_scope->__pyx_v_stream_handler; __pyx_t_3 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_request, ((PyObject *)__pyx_cur_scope->__pyx_v_sync_servicer_context)};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 495, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_cur_scope->__pyx_v_gen = __pyx_t_1;
+      __pyx_t_1 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":496
+ *             sync_servicer_context = _SyncServicerContext(servicer_context)
+ *             gen = stream_handler(request, sync_servicer_context)
+ *             async_response_generator = generator_to_async_generator(gen,             # <<<<<<<<<<<<<<
+ *                                                                     loop,
+ *                                                                     rpc_state.server.thread_pool())
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_generator_to_async_generator); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 496, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":498
+ *             async_response_generator = generator_to_async_generator(gen,
+ *                                                                     loop,
+ *                                                                     rpc_state.server.thread_pool())             # <<<<<<<<<<<<<<
+ * 
+ *         # Consumes messages from the generator
+ */
+      __pyx_t_3 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_AioServer *)__pyx_cur_scope->__pyx_v_rpc_state->server->__pyx_vtab)->thread_pool(__pyx_cur_scope->__pyx_v_rpc_state->server); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 498, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_6 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[4] = {__pyx_t_6, __pyx_cur_scope->__pyx_v_gen, __pyx_cur_scope->__pyx_v_loop, __pyx_t_3};
+        __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 496, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_cur_scope->__pyx_v_async_response_generator = __pyx_t_1;
+      __pyx_t_1 = 0;
+    }
+    __pyx_L6:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":501
+ * 
+ *         # Consumes messages from the generator
+ *         async for response_message in async_response_generator:             # <<<<<<<<<<<<<<
+ *             # Raises exception if aborted
+ *             rpc_state.raise_for_termination()
+ */
+    __pyx_t_1 = __Pyx_Coroutine_GetAsyncIter(__pyx_cur_scope->__pyx_v_async_response_generator); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 501, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    for (;;) {
+      __pyx_t_2 = __Pyx_Coroutine_AsyncIterNext(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 501, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_1);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 2;
+        return __pyx_r;
+        __pyx_L9_resume_from_await:;
+        __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_1);
+        if (unlikely(!__pyx_sent_value)) {
+          PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+          if (unlikely(exc_type && (exc_type == __Pyx_PyExc_StopAsyncIteration || ( exc_type != PyExc_StopIteration && exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, __Pyx_PyExc_StopAsyncIteration))))) {
+            PyErr_Clear();
+            break;
+          }
+          __PYX_ERR(9, 501, __pyx_L1_error)
+        }
+        __pyx_t_2 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_2);
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (unlikely(exc_type && (exc_type == __Pyx_PyExc_StopAsyncIteration || ( exc_type != PyExc_StopIteration && exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, __Pyx_PyExc_StopAsyncIteration))))) {
+          PyErr_Clear();
+          break;
+        }
+        __pyx_t_2 = NULL;
+        if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_2) < 0) __PYX_ERR(9, 501, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+      }
+      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_response_message);
+      __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_response_message, __pyx_t_2);
+      __Pyx_GIVEREF(__pyx_t_2);
+      __pyx_t_2 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":503
+ *         async for response_message in async_response_generator:
+ *             # Raises exception if aborted
+ *             rpc_state.raise_for_termination()             # <<<<<<<<<<<<<<
+ * 
+ *             await servicer_context.write(response_message)
+ */
+      ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->raise_for_termination(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 503, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":505
+ *             rpc_state.raise_for_termination()
+ * 
+ *             await servicer_context.write(response_message)             # <<<<<<<<<<<<<<
+ * 
+ *     # Raises exception if aborted
+ */
+      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context), __pyx_n_s_write); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 505, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_6 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_cur_scope->__pyx_v_response_message};
+        __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 505, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      }
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_1);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 3;
+        return __pyx_r;
+        __pyx_L10_resume_from_await:;
+        __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_1);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 505, __pyx_L1_error)
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+          else __PYX_ERR(9, 505, __pyx_L1_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":501
+ * 
+ *         # Consumes messages from the generator
+ *         async for response_message in async_response_generator:             # <<<<<<<<<<<<<<
+ *             # Raises exception if aborted
+ *             rpc_state.raise_for_termination()
+ */
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":508
+ * 
+ *     # Raises exception if aborted
+ *     rpc_state.raise_for_termination()             # <<<<<<<<<<<<<<
+ * 
+ *     # Sends the final status of this RPC
+ */
+  ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->raise_for_termination(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 508, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":513
+ *     cdef SendStatusFromServerOperation op = SendStatusFromServerOperation(
+ *         rpc_state.trailing_metadata,
+ *         rpc_state.status_code,             # <<<<<<<<<<<<<<
+ *         rpc_state.status_details,
+ *         _EMPTY_FLAGS,
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_rpc_state->status_code); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 513, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":515
+ *         rpc_state.status_code,
+ *         rpc_state.status_details,
+ *         _EMPTY_FLAGS,             # <<<<<<<<<<<<<<
+ *     )
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_EMPTY_FLAGS); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 515, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":511
+ * 
+ *     # Sends the final status of this RPC
+ *     cdef SendStatusFromServerOperation op = SendStatusFromServerOperation(             # <<<<<<<<<<<<<<
+ *         rpc_state.trailing_metadata,
+ *         rpc_state.status_code,
+ */
+  __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 511, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_rpc_state->trailing_metadata);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_rpc_state->trailing_metadata);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_rpc_state->trailing_metadata)) __PYX_ERR(9, 511, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(9, 511, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_rpc_state->status_details);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_rpc_state->status_details);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_cur_scope->__pyx_v_rpc_state->status_details)) __PYX_ERR(9, 511, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_t_2)) __PYX_ERR(9, 511, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 511, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":518
+ *     )
+ * 
+ *     cdef tuple finish_ops = (op,)             # <<<<<<<<<<<<<<
+ *     if not rpc_state.metadata_sent:
+ *         finish_ops = prepend_send_initial_metadata_op(
+ */
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 518, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_op))) __PYX_ERR(9, 518, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_finish_ops = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":519
+ * 
+ *     cdef tuple finish_ops = (op,)
+ *     if not rpc_state.metadata_sent:             # <<<<<<<<<<<<<<
+ *         finish_ops = prepend_send_initial_metadata_op(
+ *             finish_ops,
+ */
+  __pyx_t_5 = (!__pyx_cur_scope->__pyx_v_rpc_state->metadata_sent);
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":520
+ *     cdef tuple finish_ops = (op,)
+ *     if not rpc_state.metadata_sent:
+ *         finish_ops = prepend_send_initial_metadata_op(             # <<<<<<<<<<<<<<
+ *             finish_ops,
+ *             None
+ */
+    __pyx_t_2 = __pyx_f_7_cython_6cygrpc_prepend_send_initial_metadata_op(__pyx_cur_scope->__pyx_v_finish_ops, ((PyObject*)Py_None)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 520, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(9, 520, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_finish_ops);
+    __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_finish_ops, ((PyObject*)__pyx_t_2));
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":519
+ * 
+ *     cdef tuple finish_ops = (op,)
+ *     if not rpc_state.metadata_sent:             # <<<<<<<<<<<<<<
+ *         finish_ops = prepend_send_initial_metadata_op(
+ *             finish_ops,
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":524
+ *             None
+ *         )
+ *     rpc_state.metadata_sent = True             # <<<<<<<<<<<<<<
+ *     rpc_state.status_sent = True
+ *     await execute_batch(rpc_state, finish_ops, loop)
+ */
+  __pyx_cur_scope->__pyx_v_rpc_state->metadata_sent = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":525
+ *         )
+ *     rpc_state.metadata_sent = True
+ *     rpc_state.status_sent = True             # <<<<<<<<<<<<<<
+ *     await execute_batch(rpc_state, finish_ops, loop)
+ *     uninstall_context()
+ */
+  __pyx_cur_scope->__pyx_v_rpc_state->status_sent = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":526
+ *     rpc_state.metadata_sent = True
+ *     rpc_state.status_sent = True
+ *     await execute_batch(rpc_state, finish_ops, loop)             # <<<<<<<<<<<<<<
+ *     uninstall_context()
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 526, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_1)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_1, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_finish_ops, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 526, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 4;
+    return __pyx_r;
+    __pyx_L13_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 526, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 526, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":527
+ *     rpc_state.status_sent = True
+ *     await execute_batch(rpc_state, finish_ops, loop)
+ *     uninstall_context()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_uninstall_context); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 527, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_1)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 527, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":460
+ * 
+ * 
+ * async def _finish_handler_with_stream_responses(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                                 object stream_handler,
+ *                                                 object request,
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_finish_handler_with_stream_responses", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_166generator28(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":530
+ * 
+ * 
+ * async def _handle_unary_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                   RPCState rpc_state,
+ *                                   object loop):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_165_handle_unary_unary_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_165_handle_unary_unary_rpc = {"_handle_unary_unary_rpc", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_165_handle_unary_unary_rpc, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_165_handle_unary_unary_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_method_handler = 0;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_unary_unary_rpc (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method_handler,&__pyx_n_s_rpc_state,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 530, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 530, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_unary_unary_rpc", 1, 3, 3, 1); __PYX_ERR(9, 530, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 530, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_unary_unary_rpc", 1, 3, 3, 2); __PYX_ERR(9, 530, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_unary_unary_rpc") < 0)) __PYX_ERR(9, 530, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_method_handler = values[0];
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[1]);
+    __pyx_v_loop = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_unary_unary_rpc", 1, 3, 3, __pyx_nargs); __PYX_ERR(9, 530, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._handle_unary_unary_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 531, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_164_handle_unary_unary_rpc(__pyx_self, __pyx_v_method_handler, __pyx_v_rpc_state, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_164_handle_unary_unary_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method_handler, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_unary_unary_rpc", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 530, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_method_handler = __pyx_v_method_handler;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_method_handler);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_method_handler);
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_166generator28, __pyx_codeobj__87, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_unary_unary_rpc, __pyx_n_s_handle_unary_unary_rpc, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 530, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._handle_unary_unary_rpc", __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_7_cython_6cygrpc_166generator28(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_unary_unary_rpc", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    case 2: goto __pyx_L6_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 530, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":534
+ *                                   object loop):
+ *     # Receives request message
+ *     cdef bytes request_raw = await _receive_message(rpc_state, loop)             # <<<<<<<<<<<<<<
+ *     if request_raw is None:
+ *         # The RPC was cancelled immediately after start on client side.
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_receive_message); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 534, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 534, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 534, __pyx_L1_error)
+    __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+  } else {
+    __pyx_t_1 = NULL;
+    if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 534, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+  }
+  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_1))) __PYX_ERR(9, 534, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_request_raw = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":535
+ *     # Receives request message
+ *     cdef bytes request_raw = await _receive_message(rpc_state, loop)
+ *     if request_raw is None:             # <<<<<<<<<<<<<<
+ *         # The RPC was cancelled immediately after start on client side.
+ *         return
+ */
+  __pyx_t_5 = (__pyx_cur_scope->__pyx_v_request_raw == ((PyObject*)Py_None));
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":537
+ *     if request_raw is None:
+ *         # The RPC was cancelled immediately after start on client side.
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     # Deserializes the request message
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":535
+ *     # Receives request message
+ *     cdef bytes request_raw = await _receive_message(rpc_state, loop)
+ *     if request_raw is None:             # <<<<<<<<<<<<<<
+ *         # The RPC was cancelled immediately after start on client side.
+ *         return
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":541
+ *     # Deserializes the request message
+ *     cdef object request_message = deserialize(
+ *         method_handler.request_deserializer,             # <<<<<<<<<<<<<<
+ *         request_raw,
+ *     )
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_deserializer); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 541, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":540
+ * 
+ *     # Deserializes the request message
+ *     cdef object request_message = deserialize(             # <<<<<<<<<<<<<<
+ *         method_handler.request_deserializer,
+ *         request_raw,
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc_deserialize(__pyx_t_1, __pyx_cur_scope->__pyx_v_request_raw); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 540, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_request_message = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":546
+ * 
+ *     # Creates a dedecated ServicerContext
+ *     cdef _ServicerContext servicer_context = _ServicerContext(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         None,
+ */
+  __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 546, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state))) __PYX_ERR(9, 546, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None)) __PYX_ERR(9, 546, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None)) __PYX_ERR(9, 546, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_cur_scope->__pyx_v_loop)) __PYX_ERR(9, 546, __pyx_L1_error);
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 546, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":554
+ * 
+ *     # Finishes the application handler
+ *     await _finish_handler_with_unary_response(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         method_handler.unary_unary,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_finish_handler_with_unary_respo); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 554, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":556
+ *     await _finish_handler_with_unary_response(
+ *         rpc_state,
+ *         method_handler.unary_unary,             # <<<<<<<<<<<<<<
+ *         request_message,
+ *         servicer_context,
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_unary_unary); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 556, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":559
+ *         request_message,
+ *         servicer_context,
+ *         method_handler.response_serializer,             # <<<<<<<<<<<<<<
+ *         loop
+ *     )
+ */
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_response_serializer); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 559, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":560
+ *         servicer_context,
+ *         method_handler.response_serializer,
+ *         loop             # <<<<<<<<<<<<<<
+ *     )
+ * 
+ */
+  __pyx_t_7 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_7)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_7);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[7] = {__pyx_t_7, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_t_3, __pyx_cur_scope->__pyx_v_request_message, ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context), __pyx_t_6, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 6+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 554, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 2;
+    return __pyx_r;
+    __pyx_L6_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 554, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 554, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":530
+ * 
+ * 
+ * async def _handle_unary_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                   RPCState rpc_state,
+ *                                   object loop):
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_handle_unary_unary_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_169generator29(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":564
+ * 
+ * 
+ * async def _handle_unary_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_168_handle_unary_stream_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_168_handle_unary_stream_rpc = {"_handle_unary_stream_rpc", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_168_handle_unary_stream_rpc, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_168_handle_unary_stream_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_method_handler = 0;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_unary_stream_rpc (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method_handler,&__pyx_n_s_rpc_state,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 564, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 564, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_unary_stream_rpc", 1, 3, 3, 1); __PYX_ERR(9, 564, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 564, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_unary_stream_rpc", 1, 3, 3, 2); __PYX_ERR(9, 564, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_unary_stream_rpc") < 0)) __PYX_ERR(9, 564, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_method_handler = values[0];
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[1]);
+    __pyx_v_loop = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_unary_stream_rpc", 1, 3, 3, __pyx_nargs); __PYX_ERR(9, 564, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._handle_unary_stream_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 565, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_167_handle_unary_stream_rpc(__pyx_self, __pyx_v_method_handler, __pyx_v_rpc_state, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_167_handle_unary_stream_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method_handler, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_unary_stream_rpc", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 564, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_method_handler = __pyx_v_method_handler;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_method_handler);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_method_handler);
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_169generator29, __pyx_codeobj__88, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_unary_stream_rpc, __pyx_n_s_handle_unary_stream_rpc, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 564, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._handle_unary_stream_rpc", __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_7_cython_6cygrpc_169generator29(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_unary_stream_rpc", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    case 2: goto __pyx_L6_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 564, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":568
+ *                                    object loop):
+ *     # Receives request message
+ *     cdef bytes request_raw = await _receive_message(rpc_state, loop)             # <<<<<<<<<<<<<<
+ *     if request_raw is None:
+ *         return
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_receive_message); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 568, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 2+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 568, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 568, __pyx_L1_error)
+    __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+  } else {
+    __pyx_t_1 = NULL;
+    if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 568, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+  }
+  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytes", __pyx_t_1))) __PYX_ERR(9, 568, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_request_raw = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":569
+ *     # Receives request message
+ *     cdef bytes request_raw = await _receive_message(rpc_state, loop)
+ *     if request_raw is None:             # <<<<<<<<<<<<<<
+ *         return
+ * 
+ */
+  __pyx_t_5 = (__pyx_cur_scope->__pyx_v_request_raw == ((PyObject*)Py_None));
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":570
+ *     cdef bytes request_raw = await _receive_message(rpc_state, loop)
+ *     if request_raw is None:
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     # Deserializes the request message
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":569
+ *     # Receives request message
+ *     cdef bytes request_raw = await _receive_message(rpc_state, loop)
+ *     if request_raw is None:             # <<<<<<<<<<<<<<
+ *         return
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":574
+ *     # Deserializes the request message
+ *     cdef object request_message = deserialize(
+ *         method_handler.request_deserializer,             # <<<<<<<<<<<<<<
+ *         request_raw,
+ *     )
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_deserializer); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 574, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":573
+ * 
+ *     # Deserializes the request message
+ *     cdef object request_message = deserialize(             # <<<<<<<<<<<<<<
+ *         method_handler.request_deserializer,
+ *         request_raw,
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc_deserialize(__pyx_t_1, __pyx_cur_scope->__pyx_v_request_raw); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 573, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_request_message = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":581
+ *     cdef _ServicerContext servicer_context = _ServicerContext(
+ *         rpc_state,
+ *         method_handler.request_deserializer,             # <<<<<<<<<<<<<<
+ *         method_handler.response_serializer,
+ *         loop,
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_deserializer); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 581, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":582
+ *         rpc_state,
+ *         method_handler.request_deserializer,
+ *         method_handler.response_serializer,             # <<<<<<<<<<<<<<
+ *         loop,
+ *     )
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_response_serializer); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 582, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":579
+ * 
+ *     # Creates a dedecated ServicerContext
+ *     cdef _ServicerContext servicer_context = _ServicerContext(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         method_handler.request_deserializer,
+ */
+  __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 579, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state))) __PYX_ERR(9, 579, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(9, 579, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_1)) __PYX_ERR(9, 579, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_cur_scope->__pyx_v_loop)) __PYX_ERR(9, 579, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext), __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 579, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":587
+ * 
+ *     # Finishes the application handler
+ *     await _finish_handler_with_stream_responses(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         method_handler.unary_stream,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_finish_handler_with_stream_resp); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 587, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":589
+ *     await _finish_handler_with_stream_responses(
+ *         rpc_state,
+ *         method_handler.unary_stream,             # <<<<<<<<<<<<<<
+ *         request_message,
+ *         servicer_context,
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_unary_stream); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 589, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":592
+ *         request_message,
+ *         servicer_context,
+ *         loop,             # <<<<<<<<<<<<<<
+ *     )
+ * 
+ */
+  __pyx_t_6 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[6] = {__pyx_t_6, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_t_2, __pyx_cur_scope->__pyx_v_request_message, ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context), __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 5+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 587, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 2;
+    return __pyx_r;
+    __pyx_L6_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 587, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 587, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":564
+ * 
+ * 
+ * async def _handle_unary_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_AddTraceback("_handle_unary_stream_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":599
+ *     """Bridge between the async generator API and the reader-writer API."""
+ * 
+ *     def __cinit__(self, _ServicerContext servicer_context):             # <<<<<<<<<<<<<<
+ *         self._servicer_context = servicer_context
+ *         self._agen = None
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_16_MessageReceiver_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_16_MessageReceiver_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_servicer_context,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_servicer_context)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 599, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(9, 599, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)values[0]);
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 599, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._MessageReceiver.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_servicer_context), __pyx_ptype_7_cython_6cygrpc__ServicerContext, 1, "servicer_context", 0))) __PYX_ERR(9, 599, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_MessageReceiver___cinit__(((struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)__pyx_v_self), __pyx_v_servicer_context);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_16_MessageReceiver___cinit__(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self, struct __pyx_obj_7_cython_6cygrpc__ServicerContext *__pyx_v_servicer_context) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":600
+ * 
+ *     def __cinit__(self, _ServicerContext servicer_context):
+ *         self._servicer_context = servicer_context             # <<<<<<<<<<<<<<
+ *         self._agen = None
+ * 
+ */
+  __Pyx_INCREF((PyObject *)__pyx_v_servicer_context);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_servicer_context);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_servicer_context);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_servicer_context);
+  __pyx_v_self->_servicer_context = __pyx_v_servicer_context;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":601
+ *     def __cinit__(self, _ServicerContext servicer_context):
+ *         self._servicer_context = servicer_context
+ *         self._agen = None             # <<<<<<<<<<<<<<
+ * 
+ *     async def _async_message_receiver(self):
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->_agen);
+  __Pyx_DECREF(__pyx_v_self->_agen);
+  __pyx_v_self->_agen = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":599
+ *     """Bridge between the async generator API and the reader-writer API."""
+ * 
+ *     def __cinit__(self, _ServicerContext servicer_context):             # <<<<<<<<<<<<<<
+ *         self._servicer_context = servicer_context
+ *         self._agen = None
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_16_MessageReceiver_4generator30(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":603
+ *         self._agen = None
+ * 
+ *     async def _async_message_receiver(self):             # <<<<<<<<<<<<<<
+ *         """An async generator that receives messages."""
+ *         cdef object message
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_3_async_message_receiver(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_16_MessageReceiver_2_async_message_receiver, "An async generator that receives messages.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_MessageReceiver_3_async_message_receiver = {"_async_message_receiver", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_3_async_message_receiver, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_16_MessageReceiver_2_async_message_receiver};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_3_async_message_receiver(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_async_message_receiver (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("_async_message_receiver", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_async_message_receiver", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_MessageReceiver_2_async_message_receiver(((struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_2_async_message_receiver(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_async_message_receiver", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 603, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_AsyncGen_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_16_MessageReceiver_4generator30, __pyx_codeobj__89, (PyObject *) __pyx_cur_scope, __pyx_n_s_async_message_receiver, __pyx_n_s_MessageReceiver__async_message, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 603, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._MessageReceiver._async_message_receiver", __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_7_cython_6cygrpc_16_MessageReceiver_4generator30(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_async_message_receiver", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_await;
+    case 2: goto __pyx_L8_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 603, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":606
+ *         """An async generator that receives messages."""
+ *         cdef object message
+ *         while True:             # <<<<<<<<<<<<<<
+ *             message = await self._servicer_context.read()
+ *             if message is not EOF:
+ */
+  while (1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":607
+ *         cdef object message
+ *         while True:
+ *             message = await self._servicer_context.read()             # <<<<<<<<<<<<<<
+ *             if message is not EOF:
+ *                 yield message
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self->_servicer_context), __pyx_n_s_read); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 607, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 607, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from async generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L6_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 607, __pyx_L1_error)
+      __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+    } else {
+      __pyx_t_1 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 607, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_message);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_message, __pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":608
+ *         while True:
+ *             message = await self._servicer_context.read()
+ *             if message is not EOF:             # <<<<<<<<<<<<<<
+ *                 yield message
+ *             else:
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EOF); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 608, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = (__pyx_cur_scope->__pyx_v_message != __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":609
+ *             message = await self._servicer_context.read()
+ *             if message is not EOF:
+ *                 yield message             # <<<<<<<<<<<<<<
+ *             else:
+ *                 break
+ */
+      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_message);
+      __pyx_r = __pyx_cur_scope->__pyx_v_message;
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from async generator, yielding value */
+      __pyx_generator->resume_label = 2;
+      return __Pyx__PyAsyncGenValueWrapperNew(__pyx_r);
+      __pyx_L8_resume_from_yield:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 609, __pyx_L1_error)
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":608
+ *         while True:
+ *             message = await self._servicer_context.read()
+ *             if message is not EOF:             # <<<<<<<<<<<<<<
+ *                 yield message
+ *             else:
+ */
+      goto __pyx_L7;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":611
+ *                 yield message
+ *             else:
+ *                 break             # <<<<<<<<<<<<<<
+ * 
+ *     def __aiter__(self):
+ */
+    /*else*/ {
+      goto __pyx_L5_break;
+    }
+    __pyx_L7:;
+  }
+  __pyx_L5_break:;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":603
+ *         self._agen = None
+ * 
+ *     async def _async_message_receiver(self):             # <<<<<<<<<<<<<<
+ *         """An async generator that receives messages."""
+ *         cdef object message
+ */
+
+  /* function exit code */
+  PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(1);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_async_message_receiver", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":613
+ *                 break
+ * 
+ *     def __aiter__(self):             # <<<<<<<<<<<<<<
+ *         # Prevents never awaited warning if application never used the async generator
+ *         if self._agen is None:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_6__aiter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_6__aiter__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__aiter__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_MessageReceiver_5__aiter__(((struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_5__aiter__(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__aiter__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":615
+ *     def __aiter__(self):
+ *         # Prevents never awaited warning if application never used the async generator
+ *         if self._agen is None:             # <<<<<<<<<<<<<<
+ *             self._agen = self._async_message_receiver()
+ *         return self._agen
+ */
+  __pyx_t_1 = (__pyx_v_self->_agen == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":616
+ *         # Prevents never awaited warning if application never used the async generator
+ *         if self._agen is None:
+ *             self._agen = self._async_message_receiver()             # <<<<<<<<<<<<<<
+ *         return self._agen
+ * 
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_async_message_receiver); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 616, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 616, __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_self->_agen);
+    __Pyx_DECREF(__pyx_v_self->_agen);
+    __pyx_v_self->_agen = __pyx_t_2;
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":615
+ *     def __aiter__(self):
+ *         # Prevents never awaited warning if application never used the async generator
+ *         if self._agen is None:             # <<<<<<<<<<<<<<
+ *             self._agen = self._async_message_receiver()
+ *         return self._agen
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":617
+ *         if self._agen is None:
+ *             self._agen = self._async_message_receiver()
+ *         return self._agen             # <<<<<<<<<<<<<<
+ * 
+ *     async def __anext__(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_agen);
+  __pyx_r = __pyx_v_self->_agen;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":613
+ *                 break
+ * 
+ *     def __aiter__(self):             # <<<<<<<<<<<<<<
+ *         # Prevents never awaited warning if application never used the async generator
+ *         if self._agen is None:
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._MessageReceiver.__aiter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_16_MessageReceiver_9generator31(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":619
+ *         return self._agen
+ * 
+ *     async def __anext__(self):             # <<<<<<<<<<<<<<
+ *         return await self.__aiter__().__anext__()
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_8__anext__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_8__anext__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__anext__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_MessageReceiver_7__anext__(((struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_7__anext__(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__anext__", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_41___anext__(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 619, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_16_MessageReceiver_9generator31, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_anext, __pyx_n_s_MessageReceiver___anext, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 619, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._MessageReceiver.__anext__", __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_7_cython_6cygrpc_16_MessageReceiver_9generator31(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__anext__", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 619, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":620
+ * 
+ *     async def __anext__(self):
+ *         return await self.__aiter__().__anext__()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_aiter); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 620, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 620, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_anext); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 620, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_2)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_2);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 620, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 620, __pyx_L1_error)
+    __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+  } else {
+    __pyx_t_1 = NULL;
+    if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 620, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+  }
+  __pyx_r = NULL; __Pyx_ReturnWithStopIteration(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  goto __pyx_L0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":619
+ *         return self._agen
+ * 
+ *     async def __anext__(self):             # <<<<<<<<<<<<<<
+ *         return await self.__aiter__().__anext__()
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("__anext__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_11__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_MessageReceiver_11__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_11__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_11__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_MessageReceiver_10__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._MessageReceiver.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_13__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_16_MessageReceiver_13__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_13__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_13__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._MessageReceiver.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_16_MessageReceiver_12__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_16_MessageReceiver_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._MessageReceiver.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_172generator32(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":623
+ * 
+ * 
+ * async def _handle_stream_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_171_handle_stream_unary_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_171_handle_stream_unary_rpc = {"_handle_stream_unary_rpc", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_171_handle_stream_unary_rpc, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_171_handle_stream_unary_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_method_handler = 0;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_stream_unary_rpc (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method_handler,&__pyx_n_s_rpc_state,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 623, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 623, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_stream_unary_rpc", 1, 3, 3, 1); __PYX_ERR(9, 623, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 623, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_stream_unary_rpc", 1, 3, 3, 2); __PYX_ERR(9, 623, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_stream_unary_rpc") < 0)) __PYX_ERR(9, 623, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_method_handler = values[0];
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[1]);
+    __pyx_v_loop = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_stream_unary_rpc", 1, 3, 3, __pyx_nargs); __PYX_ERR(9, 623, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._handle_stream_unary_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 624, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_170_handle_stream_unary_rpc(__pyx_self, __pyx_v_method_handler, __pyx_v_rpc_state, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_170_handle_stream_unary_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method_handler, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_stream_unary_rpc", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 623, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_method_handler = __pyx_v_method_handler;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_method_handler);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_method_handler);
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_172generator32, __pyx_codeobj__90, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_stream_unary_rpc, __pyx_n_s_handle_stream_unary_rpc, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 623, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._handle_stream_unary_rpc", __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_7_cython_6cygrpc_172generator32(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_stream_unary_rpc", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 623, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":629
+ *     cdef _ServicerContext servicer_context = _ServicerContext(
+ *         rpc_state,
+ *         method_handler.request_deserializer,             # <<<<<<<<<<<<<<
+ *         None,
+ *         loop,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_deserializer); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 629, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":627
+ *                                    object loop):
+ *     # Creates a dedecated ServicerContext
+ *     cdef _ServicerContext servicer_context = _ServicerContext(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         method_handler.request_deserializer,
+ */
+  __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 627, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state))) __PYX_ERR(9, 627, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(9, 627, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None)) __PYX_ERR(9, 627, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_cur_scope->__pyx_v_loop)) __PYX_ERR(9, 627, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 627, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":636
+ *     # Prepares the request generator
+ *     cdef object request_iterator
+ *     if _is_async_handler(method_handler.stream_unary):             # <<<<<<<<<<<<<<
+ *         request_iterator = _MessageReceiver(servicer_context)
+ *     else:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_is_async_handler); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 636, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_stream_unary); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 636, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 636, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 636, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":637
+ *     cdef object request_iterator
+ *     if _is_async_handler(method_handler.stream_unary):
+ *         request_iterator = _MessageReceiver(servicer_context)             # <<<<<<<<<<<<<<
+ *     else:
+ *         request_iterator = async_generator_to_generator(
+ */
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__MessageReceiver), ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 637, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_v_request_iterator = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":636
+ *     # Prepares the request generator
+ *     cdef object request_iterator
+ *     if _is_async_handler(method_handler.stream_unary):             # <<<<<<<<<<<<<<
+ *         request_iterator = _MessageReceiver(servicer_context)
+ *     else:
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":639
+ *         request_iterator = _MessageReceiver(servicer_context)
+ *     else:
+ *         request_iterator = async_generator_to_generator(             # <<<<<<<<<<<<<<
+ *             _MessageReceiver(servicer_context),
+ *             loop
+ */
+  /*else*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_async_generator_to_generator); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 639, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":640
+ *     else:
+ *         request_iterator = async_generator_to_generator(
+ *             _MessageReceiver(servicer_context),             # <<<<<<<<<<<<<<
+ *             loop
+ *         )
+ */
+    __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__MessageReceiver), ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 640, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":641
+ *         request_iterator = async_generator_to_generator(
+ *             _MessageReceiver(servicer_context),
+ *             loop             # <<<<<<<<<<<<<<
+ *         )
+ * 
+ */
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_3, __pyx_cur_scope->__pyx_v_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 639, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __Pyx_GIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_v_request_iterator = __pyx_t_1;
+    __pyx_t_1 = 0;
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":645
+ * 
+ *     # Finishes the application handler
+ *     await _finish_handler_with_unary_response(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         method_handler.stream_unary,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_finish_handler_with_unary_respo); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 645, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":647
+ *     await _finish_handler_with_unary_response(
+ *         rpc_state,
+ *         method_handler.stream_unary,             # <<<<<<<<<<<<<<
+ *         request_iterator,
+ *         servicer_context,
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_stream_unary); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 647, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":650
+ *         request_iterator,
+ *         servicer_context,
+ *         method_handler.response_serializer,             # <<<<<<<<<<<<<<
+ *         loop
+ *     )
+ */
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_response_serializer); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 650, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":651
+ *         servicer_context,
+ *         method_handler.response_serializer,
+ *         loop             # <<<<<<<<<<<<<<
+ *     )
+ * 
+ */
+  __pyx_t_7 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_7)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_7);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[7] = {__pyx_t_7, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_t_3, __pyx_cur_scope->__pyx_v_request_iterator, ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context), __pyx_t_4, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 6+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 645, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 645, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 645, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":623
+ * 
+ * 
+ * async def _handle_stream_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_handle_stream_unary_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_175generator33(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":655
+ * 
+ * 
+ * async def _handle_stream_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                     RPCState rpc_state,
+ *                                     object loop):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_174_handle_stream_stream_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_174_handle_stream_stream_rpc = {"_handle_stream_stream_rpc", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_174_handle_stream_stream_rpc, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_174_handle_stream_stream_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_method_handler = 0;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_stream_stream_rpc (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method_handler,&__pyx_n_s_rpc_state,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method_handler)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 655, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 655, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_stream_stream_rpc", 1, 3, 3, 1); __PYX_ERR(9, 655, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 655, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_stream_stream_rpc", 1, 3, 3, 2); __PYX_ERR(9, 655, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_stream_stream_rpc") < 0)) __PYX_ERR(9, 655, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_method_handler = values[0];
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[1]);
+    __pyx_v_loop = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_stream_stream_rpc", 1, 3, 3, __pyx_nargs); __PYX_ERR(9, 655, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._handle_stream_stream_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 656, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_173_handle_stream_stream_rpc(__pyx_self, __pyx_v_method_handler, __pyx_v_rpc_state, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_173_handle_stream_stream_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_method_handler, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_stream_stream_rpc", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 655, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_method_handler = __pyx_v_method_handler;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_method_handler);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_method_handler);
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_175generator33, __pyx_codeobj__91, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_stream_stream_rpc, __pyx_n_s_handle_stream_stream_rpc, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 655, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._handle_stream_stream_rpc", __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_7_cython_6cygrpc_175generator33(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_stream_stream_rpc", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 655, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":661
+ *     cdef _ServicerContext servicer_context = _ServicerContext(
+ *         rpc_state,
+ *         method_handler.request_deserializer,             # <<<<<<<<<<<<<<
+ *         method_handler.response_serializer,
+ *         loop,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_deserializer); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 661, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":662
+ *         rpc_state,
+ *         method_handler.request_deserializer,
+ *         method_handler.response_serializer,             # <<<<<<<<<<<<<<
+ *         loop,
+ *     )
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_response_serializer); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 662, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":659
+ *                                     object loop):
+ *     # Creates a dedecated ServicerContext
+ *     cdef _ServicerContext servicer_context = _ServicerContext(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         method_handler.request_deserializer,
+ */
+  __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 659, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state))) __PYX_ERR(9, 659, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(9, 659, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2)) __PYX_ERR(9, 659, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_cur_scope->__pyx_v_loop)) __PYX_ERR(9, 659, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 659, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":668
+ *     # Prepares the request generator
+ *     cdef object request_iterator
+ *     if _is_async_handler(method_handler.stream_stream):             # <<<<<<<<<<<<<<
+ *         request_iterator = _MessageReceiver(servicer_context)
+ *     else:
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_is_async_handler); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 668, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_stream_stream); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 668, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_1};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 668, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 668, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":669
+ *     cdef object request_iterator
+ *     if _is_async_handler(method_handler.stream_stream):
+ *         request_iterator = _MessageReceiver(servicer_context)             # <<<<<<<<<<<<<<
+ *     else:
+ *         request_iterator = async_generator_to_generator(
+ */
+    __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__MessageReceiver), ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 669, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_cur_scope->__pyx_v_request_iterator = __pyx_t_2;
+    __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":668
+ *     # Prepares the request generator
+ *     cdef object request_iterator
+ *     if _is_async_handler(method_handler.stream_stream):             # <<<<<<<<<<<<<<
+ *         request_iterator = _MessageReceiver(servicer_context)
+ *     else:
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":671
+ *         request_iterator = _MessageReceiver(servicer_context)
+ *     else:
+ *         request_iterator = async_generator_to_generator(             # <<<<<<<<<<<<<<
+ *             _MessageReceiver(servicer_context),
+ *             loop
+ */
+  /*else*/ {
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_async_generator_to_generator); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 671, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":672
+ *     else:
+ *         request_iterator = async_generator_to_generator(
+ *             _MessageReceiver(servicer_context),             # <<<<<<<<<<<<<<
+ *             loop
+ *         )
+ */
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__MessageReceiver), ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 672, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":673
+ *         request_iterator = async_generator_to_generator(
+ *             _MessageReceiver(servicer_context),
+ *             loop             # <<<<<<<<<<<<<<
+ *         )
+ * 
+ */
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_t_1, __pyx_cur_scope->__pyx_v_loop};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 671, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_cur_scope->__pyx_v_request_iterator = __pyx_t_2;
+    __pyx_t_2 = 0;
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":677
+ * 
+ *     # Finishes the application handler
+ *     await _finish_handler_with_stream_responses(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         method_handler.stream_stream,
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_finish_handler_with_stream_resp); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 677, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":679
+ *     await _finish_handler_with_stream_responses(
+ *         rpc_state,
+ *         method_handler.stream_stream,             # <<<<<<<<<<<<<<
+ *         request_iterator,
+ *         servicer_context,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_stream_stream); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 679, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":682
+ *         request_iterator,
+ *         servicer_context,
+ *         loop,             # <<<<<<<<<<<<<<
+ *     )
+ * 
+ */
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[6] = {__pyx_t_4, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_t_1, __pyx_cur_scope->__pyx_v_request_iterator, ((PyObject *)__pyx_cur_scope->__pyx_v_servicer_context), __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 5+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 677, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 677, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 677, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":655
+ * 
+ * 
+ * async def _handle_stream_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                     RPCState rpc_state,
+ *                                     object loop):
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_handle_stream_stream_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_178generator34(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":686
+ * 
+ * 
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         try:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_177_handle_exceptions(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_177_handle_exceptions = {"_handle_exceptions", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_177_handle_exceptions, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_177_handle_exceptions(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_rpc_coro = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_exceptions (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rpc_state,&__pyx_n_s_rpc_coro,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 686, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_coro)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 686, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_exceptions", 1, 3, 3, 1); __PYX_ERR(9, 686, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 686, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_exceptions", 1, 3, 3, 2); __PYX_ERR(9, 686, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_exceptions") < 0)) __PYX_ERR(9, 686, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[0]);
+    __pyx_v_rpc_coro = values[1];
+    __pyx_v_loop = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_exceptions", 1, 3, 3, __pyx_nargs); __PYX_ERR(9, 686, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 686, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_176_handle_exceptions(__pyx_self, __pyx_v_rpc_state, __pyx_v_rpc_coro, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_176_handle_exceptions(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_rpc_coro, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_exceptions", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 686, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_rpc_coro = __pyx_v_rpc_coro;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_rpc_coro);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_rpc_coro);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_178generator34, __pyx_codeobj__92, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_exceptions, __pyx_n_s_handle_exceptions, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 686, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __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_7_cython_6cygrpc_178generator34(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  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;
+  unsigned int __pyx_t_13;
+  int __pyx_t_14;
+  int __pyx_t_15;
+  char const *__pyx_t_16;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *__pyx_t_18 = NULL;
+  PyObject *__pyx_t_19 = NULL;
+  PyObject *__pyx_t_20 = NULL;
+  PyObject *__pyx_t_21 = NULL;
+  PyObject *__pyx_t_22 = NULL;
+  PyObject *__pyx_t_23 = NULL;
+  PyObject *__pyx_t_24 = NULL;
+  PyObject *__pyx_t_25 = NULL;
+  PyObject *__pyx_t_26 = NULL;
+  int __pyx_t_27;
+  PyObject *__pyx_t_28 = NULL;
+  char const *__pyx_t_29;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_exceptions", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L16_resume_from_await;
+    case 2: goto __pyx_L57_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 686, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":687
+ * 
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):
+ *     try:             # <<<<<<<<<<<<<<
+ *         try:
+ *             await rpc_coro
+ */
+  {
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":688
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):
+ *     try:
+ *         try:             # <<<<<<<<<<<<<<
+ *             await rpc_coro
+ *         except AbortError as e:
+ */
+      {
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_XGOTREF(__pyx_t_5);
+        __Pyx_XGOTREF(__pyx_t_6);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":689
+ *     try:
+ *         try:
+ *             await rpc_coro             # <<<<<<<<<<<<<<
+ *         except AbortError as e:
+ *             # Caught AbortError check if it is the same one
+ */
+          __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_rpc_coro);
+          __Pyx_XGOTREF(__pyx_r);
+          if (likely(__pyx_r)) {
+            __Pyx_XGIVEREF(__pyx_t_1);
+            __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+            __Pyx_XGIVEREF(__pyx_t_2);
+            __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+            __Pyx_XGIVEREF(__pyx_t_3);
+            __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __pyx_cur_scope->__pyx_t_3 = __pyx_t_4;
+            __Pyx_XGIVEREF(__pyx_t_5);
+            __pyx_cur_scope->__pyx_t_4 = __pyx_t_5;
+            __Pyx_XGIVEREF(__pyx_t_6);
+            __pyx_cur_scope->__pyx_t_5 = __pyx_t_6;
+            __Pyx_XGIVEREF(__pyx_r);
+            __Pyx_RefNannyFinishContext();
+            __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+            /* return from generator, awaiting value */
+            __pyx_generator->resume_label = 1;
+            return __pyx_r;
+            __pyx_L16_resume_from_await:;
+            __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+            __pyx_cur_scope->__pyx_t_0 = 0;
+            __Pyx_XGOTREF(__pyx_t_1);
+            __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+            __pyx_cur_scope->__pyx_t_1 = 0;
+            __Pyx_XGOTREF(__pyx_t_2);
+            __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+            __pyx_cur_scope->__pyx_t_2 = 0;
+            __Pyx_XGOTREF(__pyx_t_3);
+            __pyx_t_4 = __pyx_cur_scope->__pyx_t_3;
+            __pyx_cur_scope->__pyx_t_3 = 0;
+            __Pyx_XGOTREF(__pyx_t_4);
+            __pyx_t_5 = __pyx_cur_scope->__pyx_t_4;
+            __pyx_cur_scope->__pyx_t_4 = 0;
+            __Pyx_XGOTREF(__pyx_t_5);
+            __pyx_t_6 = __pyx_cur_scope->__pyx_t_5;
+            __pyx_cur_scope->__pyx_t_5 = 0;
+            __Pyx_XGOTREF(__pyx_t_6);
+            if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 689, __pyx_L10_error)
+          } else {
+            PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+            if (exc_type) {
+              if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+              else __PYX_ERR(9, 689, __pyx_L10_error)
+            }
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":688
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):
+ *     try:
+ *         try:             # <<<<<<<<<<<<<<
+ *             await rpc_coro
+ *         except AbortError as e:
+ */
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":696
+ *         else:
+ *             # Check if the abort exception got suppressed
+ *             if rpc_state.abort_exception is not None:             # <<<<<<<<<<<<<<
+ *                 _LOGGER.error(
+ *                     'Abort error unexpectedly suppressed: %s',
+ */
+        /*else:*/ {
+          __pyx_t_7 = (__pyx_cur_scope->__pyx_v_rpc_state->abort_exception != Py_None);
+          if (__pyx_t_7) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":697
+ *             # Check if the abort exception got suppressed
+ *             if rpc_state.abort_exception is not None:
+ *                 _LOGGER.error(             # <<<<<<<<<<<<<<
+ *                     'Abort error unexpectedly suppressed: %s',
+ *                     traceback.format_exception(rpc_state.abort_exception)
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 697, __pyx_L12_except_error)
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_error); if (unlikely(!__pyx_t_10)) __PYX_ERR(9, 697, __pyx_L12_except_error)
+            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":699
+ *                 _LOGGER.error(
+ *                     'Abort error unexpectedly suppressed: %s',
+ *                     traceback.format_exception(rpc_state.abort_exception)             # <<<<<<<<<<<<<<
+ *                 )
+ *     except (KeyboardInterrupt, SystemExit):
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_traceback); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 699, __pyx_L12_except_error)
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_format_exception); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 699, __pyx_L12_except_error)
+            __Pyx_GOTREF(__pyx_t_12);
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+            __pyx_t_11 = NULL;
+            __pyx_t_13 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(PyMethod_Check(__pyx_t_12))) {
+              __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12);
+              if (likely(__pyx_t_11)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+                __Pyx_INCREF(__pyx_t_11);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_12, function);
+                __pyx_t_13 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_cur_scope->__pyx_v_rpc_state->abort_exception};
+              __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_13, 1+__pyx_t_13);
+              __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+              if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 699, __pyx_L12_except_error)
+              __Pyx_GOTREF(__pyx_t_9);
+              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+            }
+            __pyx_t_12 = NULL;
+            __pyx_t_13 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (unlikely(PyMethod_Check(__pyx_t_10))) {
+              __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
+              if (likely(__pyx_t_12)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
+                __Pyx_INCREF(__pyx_t_12);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_10, function);
+                __pyx_t_13 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[3] = {__pyx_t_12, __pyx_kp_s_Abort_error_unexpectedly_suppres, __pyx_t_9};
+              __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_10, __pyx_callargs+1-__pyx_t_13, 2+__pyx_t_13);
+              __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              if (unlikely(!__pyx_t_8)) __PYX_ERR(9, 697, __pyx_L12_except_error)
+              __Pyx_GOTREF(__pyx_t_8);
+              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            }
+            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":696
+ *         else:
+ *             # Check if the abort exception got suppressed
+ *             if rpc_state.abort_exception is not None:             # <<<<<<<<<<<<<<
+ *                 _LOGGER.error(
+ *                     'Abort error unexpectedly suppressed: %s',
+ */
+          }
+        }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        goto __pyx_L15_try_end;
+        __pyx_L10_error:;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":690
+ *         try:
+ *             await rpc_coro
+ *         except AbortError as e:             # <<<<<<<<<<<<<<
+ *             # Caught AbortError check if it is the same one
+ *             assert rpc_state.abort_exception is e, 'Abort error has been replaced!'
+ */
+        __Pyx_ErrFetch(&__pyx_t_8, &__pyx_t_10, &__pyx_t_9);
+        __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_n_s_AbortError); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 690, __pyx_L12_except_error)
+        __Pyx_GOTREF(__pyx_t_12);
+        __pyx_t_14 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_8, __pyx_t_12);
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_ErrRestore(__pyx_t_8, __pyx_t_10, __pyx_t_9);
+        __pyx_t_8 = 0; __pyx_t_10 = 0; __pyx_t_9 = 0;
+        if (__pyx_t_14) {
+          __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_10, &__pyx_t_8) < 0) __PYX_ERR(9, 690, __pyx_L12_except_error)
+          __Pyx_XGOTREF(__pyx_t_9);
+          __Pyx_XGOTREF(__pyx_t_10);
+          __Pyx_XGOTREF(__pyx_t_8);
+          __Pyx_INCREF(__pyx_t_10);
+          __Pyx_GIVEREF(__pyx_t_10);
+          __pyx_cur_scope->__pyx_v_e = __pyx_t_10;
+          /*try:*/ {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":692
+ *         except AbortError as e:
+ *             # Caught AbortError check if it is the same one
+ *             assert rpc_state.abort_exception is e, 'Abort error has been replaced!'             # <<<<<<<<<<<<<<
+ *             return
+ *         else:
+ */
+            #ifndef CYTHON_WITHOUT_ASSERTIONS
+            if (unlikely(__pyx_assertions_enabled())) {
+              __pyx_t_7 = (__pyx_cur_scope->__pyx_v_rpc_state->abort_exception == __pyx_cur_scope->__pyx_v_e);
+              if (unlikely(!__pyx_t_7)) {
+                __Pyx_Raise(__pyx_builtin_AssertionError, __pyx_kp_s_Abort_error_has_been_replaced, 0, 0);
+                __PYX_ERR(9, 692, __pyx_L23_error)
+              }
+            }
+            #else
+            if ((1)); else __PYX_ERR(9, 692, __pyx_L23_error)
+            #endif
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":693
+ *             # Caught AbortError check if it is the same one
+ *             assert rpc_state.abort_exception is e, 'Abort error has been replaced!'
+ *             return             # <<<<<<<<<<<<<<
+ *         else:
+ *             # Check if the abort exception got suppressed
+ */
+            __Pyx_XDECREF(__pyx_r);
+            __pyx_r = NULL;
+            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            goto __pyx_L22_return;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":690
+ *         try:
+ *             await rpc_coro
+ *         except AbortError as e:             # <<<<<<<<<<<<<<
+ *             # Caught AbortError check if it is the same one
+ *             assert rpc_state.abort_exception is e, 'Abort error has been replaced!'
+ */
+          /*finally:*/ {
+            __pyx_L23_error:;
+            /*exception exit:*/{
+              __Pyx_PyThreadState_assign
+              __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0;
+              __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+              __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+              if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_20, &__pyx_t_21, &__pyx_t_22);
+              if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19) < 0)) __Pyx_ErrFetch(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19);
+              __Pyx_XGOTREF(__pyx_t_17);
+              __Pyx_XGOTREF(__pyx_t_18);
+              __Pyx_XGOTREF(__pyx_t_19);
+              __Pyx_XGOTREF(__pyx_t_20);
+              __Pyx_XGOTREF(__pyx_t_21);
+              __Pyx_XGOTREF(__pyx_t_22);
+              __pyx_t_14 = __pyx_lineno; __pyx_t_15 = __pyx_clineno; __pyx_t_16 = __pyx_filename;
+              {
+                __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_e);
+                __Pyx_DECREF(__pyx_cur_scope->__pyx_v_e); __pyx_cur_scope->__pyx_v_e = 0;
+              }
+              if (PY_MAJOR_VERSION >= 3) {
+                __Pyx_XGIVEREF(__pyx_t_20);
+                __Pyx_XGIVEREF(__pyx_t_21);
+                __Pyx_XGIVEREF(__pyx_t_22);
+                __Pyx_ExceptionReset(__pyx_t_20, __pyx_t_21, __pyx_t_22);
+              }
+              __Pyx_XGIVEREF(__pyx_t_17);
+              __Pyx_XGIVEREF(__pyx_t_18);
+              __Pyx_XGIVEREF(__pyx_t_19);
+              __Pyx_ErrRestore(__pyx_t_17, __pyx_t_18, __pyx_t_19);
+              __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0;
+              __pyx_lineno = __pyx_t_14; __pyx_clineno = __pyx_t_15; __pyx_filename = __pyx_t_16;
+              goto __pyx_L12_except_error;
+            }
+            __pyx_L22_return: {
+              __Pyx_PyThreadState_assign
+              __pyx_t_22 = 0; __pyx_t_21 = 0; __pyx_t_20 = 0; __pyx_t_19 = 0; __pyx_t_18 = 0; __pyx_t_17 = 0;
+              if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_19, &__pyx_t_18, &__pyx_t_17);
+              if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_22, &__pyx_t_21, &__pyx_t_20) < 0)) __Pyx_ErrFetch(&__pyx_t_22, &__pyx_t_21, &__pyx_t_20);
+              __Pyx_XGOTREF(__pyx_t_22);
+              __Pyx_XGOTREF(__pyx_t_21);
+              __Pyx_XGOTREF(__pyx_t_20);
+              __Pyx_XGOTREF(__pyx_t_19);
+              __Pyx_XGOTREF(__pyx_t_18);
+              __Pyx_XGOTREF(__pyx_t_17);
+              __pyx_t_23 = __pyx_r;
+              __pyx_r = 0;
+              __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_e);
+              __Pyx_DECREF(__pyx_cur_scope->__pyx_v_e); __pyx_cur_scope->__pyx_v_e = 0;
+              __pyx_r = __pyx_t_23;
+              __pyx_t_23 = 0;
+              if (PY_MAJOR_VERSION >= 3) {
+                __Pyx_XGIVEREF(__pyx_t_19);
+                __Pyx_XGIVEREF(__pyx_t_18);
+                __Pyx_XGIVEREF(__pyx_t_17);
+                __Pyx_ExceptionReset(__pyx_t_19, __pyx_t_18, __pyx_t_17);
+              }
+              __Pyx_XGIVEREF(__pyx_t_22);
+              __Pyx_XGIVEREF(__pyx_t_21);
+              __Pyx_XGIVEREF(__pyx_t_20);
+              __Pyx_ErrRestore(__pyx_t_22, __pyx_t_21, __pyx_t_20);
+              __pyx_t_22 = 0; __pyx_t_21 = 0; __pyx_t_20 = 0; __pyx_t_19 = 0; __pyx_t_18 = 0; __pyx_t_17 = 0;
+              goto __pyx_L13_except_return;
+            }
+          }
+        }
+        goto __pyx_L12_except_error;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":688
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):
+ *     try:
+ *         try:             # <<<<<<<<<<<<<<
+ *             await rpc_coro
+ *         except AbortError as e:
+ */
+        __pyx_L12_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
+        __Pyx_XGIVEREF(__pyx_t_5);
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        goto __pyx_L4_error;
+        __pyx_L13_except_return:;
+        __Pyx_XGIVEREF(__pyx_t_4);
+        __Pyx_XGIVEREF(__pyx_t_5);
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        goto __pyx_L8_try_return;
+        __pyx_L15_try_end:;
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":687
+ * 
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):
+ *     try:             # <<<<<<<<<<<<<<
+ *         try:
+ *             await rpc_coro
+ */
+    }
+    __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_L9_try_end;
+    __pyx_L4_error:;
+    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+    __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":701
+ *                     traceback.format_exception(rpc_state.abort_exception)
+ *                 )
+ *     except (KeyboardInterrupt, SystemExit):             # <<<<<<<<<<<<<<
+ *         raise
+ *     except asyncio.CancelledError:
+ */
+    __pyx_t_15 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_KeyboardInterrupt, __pyx_builtin_SystemExit);
+    if (__pyx_t_15) {
+      __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_10, &__pyx_t_9) < 0) __PYX_ERR(9, 701, __pyx_L6_except_error)
+      __Pyx_XGOTREF(__pyx_t_8);
+      __Pyx_XGOTREF(__pyx_t_10);
+      __Pyx_XGOTREF(__pyx_t_9);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":702
+ *                 )
+ *     except (KeyboardInterrupt, SystemExit):
+ *         raise             # <<<<<<<<<<<<<<
+ *     except asyncio.CancelledError:
+ *         _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method()))
+ */
+      __Pyx_GIVEREF(__pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_10);
+      __Pyx_XGIVEREF(__pyx_t_9);
+      __Pyx_ErrRestoreWithState(__pyx_t_8, __pyx_t_10, __pyx_t_9);
+      __pyx_t_8 = 0; __pyx_t_10 = 0; __pyx_t_9 = 0; 
+      __PYX_ERR(9, 702, __pyx_L6_except_error)
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":703
+ *     except (KeyboardInterrupt, SystemExit):
+ *         raise
+ *     except asyncio.CancelledError:             # <<<<<<<<<<<<<<
+ *         _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method()))
+ *     except _ServerStoppedError:
+ */
+    __Pyx_ErrFetch(&__pyx_t_9, &__pyx_t_10, &__pyx_t_8);
+    __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 703, __pyx_L6_except_error)
+    __Pyx_GOTREF(__pyx_t_12);
+    __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_CancelledError); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 703, __pyx_L6_except_error)
+    __Pyx_GOTREF(__pyx_t_11);
+    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+    __pyx_t_15 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_9, __pyx_t_11);
+    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+    __Pyx_ErrRestore(__pyx_t_9, __pyx_t_10, __pyx_t_8);
+    __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_8 = 0;
+    if (__pyx_t_15) {
+      __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_10, &__pyx_t_9) < 0) __PYX_ERR(9, 703, __pyx_L6_except_error)
+      __Pyx_XGOTREF(__pyx_t_8);
+      __Pyx_XGOTREF(__pyx_t_10);
+      __Pyx_XGOTREF(__pyx_t_9);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":704
+ *         raise
+ *     except asyncio.CancelledError:
+ *         _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method()))             # <<<<<<<<<<<<<<
+ *     except _ServerStoppedError:
+ *         _LOGGER.warning('Aborting method [%s] due to server stop.', _decode(rpc_state.method()))
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 704, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_12);
+      __pyx_t_24 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_debug); if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 704, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_24);
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      __pyx_t_12 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->method(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 704, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_12);
+      __pyx_t_25 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_12)); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 704, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_25);
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      __pyx_t_12 = NULL;
+      __pyx_t_13 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_24))) {
+        __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_24);
+        if (likely(__pyx_t_12)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_24);
+          __Pyx_INCREF(__pyx_t_12);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_24, function);
+          __pyx_t_13 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_12, __pyx_kp_s_RPC_cancelled_for_servicer_metho, __pyx_t_25};
+        __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_24, __pyx_callargs+1-__pyx_t_13, 2+__pyx_t_13);
+        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+        if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 704, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      goto __pyx_L5_exception_handled;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":705
+ *     except asyncio.CancelledError:
+ *         _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method()))
+ *     except _ServerStoppedError:             # <<<<<<<<<<<<<<
+ *         _LOGGER.warning('Aborting method [%s] due to server stop.', _decode(rpc_state.method()))
+ *     except ExecuteBatchError:
+ */
+    __Pyx_ErrFetch(&__pyx_t_9, &__pyx_t_10, &__pyx_t_8);
+    __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_ServerStoppedError); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 705, __pyx_L6_except_error)
+    __Pyx_GOTREF(__pyx_t_11);
+    __pyx_t_15 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_9, __pyx_t_11);
+    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+    __Pyx_ErrRestore(__pyx_t_9, __pyx_t_10, __pyx_t_8);
+    __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_8 = 0;
+    if (__pyx_t_15) {
+      __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_10, &__pyx_t_9) < 0) __PYX_ERR(9, 705, __pyx_L6_except_error)
+      __Pyx_XGOTREF(__pyx_t_8);
+      __Pyx_XGOTREF(__pyx_t_10);
+      __Pyx_XGOTREF(__pyx_t_9);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":706
+ *         _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method()))
+ *     except _ServerStoppedError:
+ *         _LOGGER.warning('Aborting method [%s] due to server stop.', _decode(rpc_state.method()))             # <<<<<<<<<<<<<<
+ *     except ExecuteBatchError:
+ *         # If client closed (aka. cancelled), ignore the failed batch operations.
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_24, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 706, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_24);
+      __pyx_t_25 = __Pyx_PyObject_GetAttrStr(__pyx_t_24, __pyx_n_s_warning); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 706, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_25);
+      __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+      __pyx_t_24 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->method(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 706, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_24);
+      __pyx_t_12 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_24)); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 706, __pyx_L6_except_error)
+      __Pyx_GOTREF(__pyx_t_12);
+      __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+      __pyx_t_24 = NULL;
+      __pyx_t_13 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_25))) {
+        __pyx_t_24 = PyMethod_GET_SELF(__pyx_t_25);
+        if (likely(__pyx_t_24)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_25);
+          __Pyx_INCREF(__pyx_t_24);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_25, function);
+          __pyx_t_13 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_24, __pyx_kp_s_Aborting_method_s_due_to_server, __pyx_t_12};
+        __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_25, __pyx_callargs+1-__pyx_t_13, 2+__pyx_t_13);
+        __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0;
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 706, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      goto __pyx_L5_exception_handled;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":707
+ *     except _ServerStoppedError:
+ *         _LOGGER.warning('Aborting method [%s] due to server stop.', _decode(rpc_state.method()))
+ *     except ExecuteBatchError:             # <<<<<<<<<<<<<<
+ *         # If client closed (aka. cancelled), ignore the failed batch operations.
+ *         if rpc_state.client_closed:
+ */
+    __Pyx_ErrFetch(&__pyx_t_9, &__pyx_t_10, &__pyx_t_8);
+    __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_ExecuteBatchError); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 707, __pyx_L6_except_error)
+    __Pyx_GOTREF(__pyx_t_11);
+    __pyx_t_15 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_9, __pyx_t_11);
+    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+    __Pyx_ErrRestore(__pyx_t_9, __pyx_t_10, __pyx_t_8);
+    __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_8 = 0;
+    if (__pyx_t_15) {
+      __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_10, &__pyx_t_9) < 0) __PYX_ERR(9, 707, __pyx_L6_except_error)
+      __Pyx_XGOTREF(__pyx_t_8);
+      __Pyx_XGOTREF(__pyx_t_10);
+      __Pyx_XGOTREF(__pyx_t_9);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":709
+ *     except ExecuteBatchError:
+ *         # If client closed (aka. cancelled), ignore the failed batch operations.
+ *         if rpc_state.client_closed:             # <<<<<<<<<<<<<<
+ *             return
+ *         else:
+ */
+      if (__pyx_cur_scope->__pyx_v_rpc_state->client_closed) {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":710
+ *         # If client closed (aka. cancelled), ignore the failed batch operations.
+ *         if rpc_state.client_closed:
+ *             return             # <<<<<<<<<<<<<<
+ *         else:
+ *             _LOGGER.exception('ExecuteBatchError raised in core by servicer method [%s]' % (
+ */
+        __Pyx_XDECREF(__pyx_r);
+        __pyx_r = NULL;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        goto __pyx_L7_except_return;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":709
+ *     except ExecuteBatchError:
+ *         # If client closed (aka. cancelled), ignore the failed batch operations.
+ *         if rpc_state.client_closed:             # <<<<<<<<<<<<<<
+ *             return
+ *         else:
+ */
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":712
+ *             return
+ *         else:
+ *             _LOGGER.exception('ExecuteBatchError raised in core by servicer method [%s]' % (             # <<<<<<<<<<<<<<
+ *                 _decode(rpc_state.method())))
+ *             return
+ */
+      /*else*/ {
+        __Pyx_GetModuleGlobalName(__pyx_t_25, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 712, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_25);
+        __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_25, __pyx_n_s_exception); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 712, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_12);
+        __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":713
+ *         else:
+ *             _LOGGER.exception('ExecuteBatchError raised in core by servicer method [%s]' % (
+ *                 _decode(rpc_state.method())))             # <<<<<<<<<<<<<<
+ *             return
+ *     except Exception as e:
+ */
+        __pyx_t_25 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->method(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 713, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_25);
+        __pyx_t_24 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_25)); if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 713, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_24);
+        __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":712
+ *             return
+ *         else:
+ *             _LOGGER.exception('ExecuteBatchError raised in core by servicer method [%s]' % (             # <<<<<<<<<<<<<<
+ *                 _decode(rpc_state.method())))
+ *             return
+ */
+        __pyx_t_25 = __Pyx_PyString_Format(__pyx_kp_s_ExecuteBatchError_raised_in_core, __pyx_t_24); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 712, __pyx_L6_except_error)
+        __Pyx_GOTREF(__pyx_t_25);
+        __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+        __pyx_t_24 = NULL;
+        __pyx_t_13 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_12))) {
+          __pyx_t_24 = PyMethod_GET_SELF(__pyx_t_12);
+          if (likely(__pyx_t_24)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+            __Pyx_INCREF(__pyx_t_24);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_12, function);
+            __pyx_t_13 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_24, __pyx_t_25};
+          __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_13, 1+__pyx_t_13);
+          __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0;
+          __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 712, __pyx_L6_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":714
+ *             _LOGGER.exception('ExecuteBatchError raised in core by servicer method [%s]' % (
+ *                 _decode(rpc_state.method())))
+ *             return             # <<<<<<<<<<<<<<
+ *     except Exception as e:
+ *         _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % (
+ */
+        __Pyx_XDECREF(__pyx_r);
+        __pyx_r = NULL;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        goto __pyx_L7_except_return;
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":715
+ *                 _decode(rpc_state.method())))
+ *             return
+ *     except Exception as e:             # <<<<<<<<<<<<<<
+ *         _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % (
+ *             type(e).__name__,
+ */
+    __pyx_t_15 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
+    if (__pyx_t_15) {
+      __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_10, &__pyx_t_8) < 0) __PYX_ERR(9, 715, __pyx_L6_except_error)
+      __Pyx_XGOTREF(__pyx_t_9);
+      __Pyx_XGOTREF(__pyx_t_10);
+      __Pyx_XGOTREF(__pyx_t_8);
+      __Pyx_INCREF(__pyx_t_10);
+      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
+      __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_e, __pyx_t_10);
+      __Pyx_GIVEREF(__pyx_t_10);
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":716
+ *             return
+ *     except Exception as e:
+ *         _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % (             # <<<<<<<<<<<<<<
+ *             type(e).__name__,
+ *             _decode(rpc_state.method()),
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 716, __pyx_L43_error)
+        __Pyx_GOTREF(__pyx_t_12);
+        __pyx_t_25 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_exception); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 716, __pyx_L43_error)
+        __Pyx_GOTREF(__pyx_t_25);
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":717
+ *     except Exception as e:
+ *         _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % (
+ *             type(e).__name__,             # <<<<<<<<<<<<<<
+ *             _decode(rpc_state.method()),
+ *         ))
+ */
+        __pyx_t_12 = __Pyx_PyObject_GetAttrStr(((PyObject *)Py_TYPE(__pyx_cur_scope->__pyx_v_e)), __pyx_n_s_name_2); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 717, __pyx_L43_error)
+        __Pyx_GOTREF(__pyx_t_12);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":718
+ *         _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % (
+ *             type(e).__name__,
+ *             _decode(rpc_state.method()),             # <<<<<<<<<<<<<<
+ *         ))
+ *         if not rpc_state.status_sent and rpc_state.server._status != AIO_SERVER_STATUS_STOPPED:
+ */
+        __pyx_t_24 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->method(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 718, __pyx_L43_error)
+        __Pyx_GOTREF(__pyx_t_24);
+        __pyx_t_26 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_24)); if (unlikely(!__pyx_t_26)) __PYX_ERR(9, 718, __pyx_L43_error)
+        __Pyx_GOTREF(__pyx_t_26);
+        __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":717
+ *     except Exception as e:
+ *         _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % (
+ *             type(e).__name__,             # <<<<<<<<<<<<<<
+ *             _decode(rpc_state.method()),
+ *         ))
+ */
+        __pyx_t_24 = PyTuple_New(2); if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 717, __pyx_L43_error)
+        __Pyx_GOTREF(__pyx_t_24);
+        __Pyx_GIVEREF(__pyx_t_12);
+        if (__Pyx_PyTuple_SET_ITEM(__pyx_t_24, 0, __pyx_t_12)) __PYX_ERR(9, 717, __pyx_L43_error);
+        __Pyx_GIVEREF(__pyx_t_26);
+        if (__Pyx_PyTuple_SET_ITEM(__pyx_t_24, 1, __pyx_t_26)) __PYX_ERR(9, 717, __pyx_L43_error);
+        __pyx_t_12 = 0;
+        __pyx_t_26 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":716
+ *             return
+ *     except Exception as e:
+ *         _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % (             # <<<<<<<<<<<<<<
+ *             type(e).__name__,
+ *             _decode(rpc_state.method()),
+ */
+        __pyx_t_26 = __Pyx_PyString_Format(__pyx_kp_s_Unexpected_s_raised_by_servicer, __pyx_t_24); if (unlikely(!__pyx_t_26)) __PYX_ERR(9, 716, __pyx_L43_error)
+        __Pyx_GOTREF(__pyx_t_26);
+        __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+        __pyx_t_24 = NULL;
+        __pyx_t_13 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_25))) {
+          __pyx_t_24 = PyMethod_GET_SELF(__pyx_t_25);
+          if (likely(__pyx_t_24)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_25);
+            __Pyx_INCREF(__pyx_t_24);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_25, function);
+            __pyx_t_13 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_24, __pyx_t_26};
+          __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_25, __pyx_callargs+1-__pyx_t_13, 1+__pyx_t_13);
+          __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0;
+          __Pyx_DECREF(__pyx_t_26); __pyx_t_26 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 716, __pyx_L43_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":720
+ *             _decode(rpc_state.method()),
+ *         ))
+ *         if not rpc_state.status_sent and rpc_state.server._status != AIO_SERVER_STATUS_STOPPED:             # <<<<<<<<<<<<<<
+ *             # Allows users to raise other types of exception with specified status code
+ *             if rpc_state.status_code == StatusCode.ok:
+ */
+        __pyx_t_27 = (!__pyx_cur_scope->__pyx_v_rpc_state->status_sent);
+        if (__pyx_t_27) {
+        } else {
+          __pyx_t_7 = __pyx_t_27;
+          goto __pyx_L46_bool_binop_done;
+        }
+        __pyx_t_27 = (__pyx_cur_scope->__pyx_v_rpc_state->server->_status != __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPED);
+        __pyx_t_7 = __pyx_t_27;
+        __pyx_L46_bool_binop_done:;
+        if (__pyx_t_7) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":722
+ *         if not rpc_state.status_sent and rpc_state.server._status != AIO_SERVER_STATUS_STOPPED:
+ *             # Allows users to raise other types of exception with specified status code
+ *             if rpc_state.status_code == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *                 status_code = StatusCode.unknown
+ *             else:
+ */
+          __pyx_t_11 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_rpc_state->status_code); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 722, __pyx_L43_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __Pyx_GetModuleGlobalName(__pyx_t_25, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 722, __pyx_L43_error)
+          __Pyx_GOTREF(__pyx_t_25);
+          __pyx_t_26 = __Pyx_PyObject_GetAttrStr(__pyx_t_25, __pyx_n_s_ok); if (unlikely(!__pyx_t_26)) __PYX_ERR(9, 722, __pyx_L43_error)
+          __Pyx_GOTREF(__pyx_t_26);
+          __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+          __pyx_t_25 = PyObject_RichCompare(__pyx_t_11, __pyx_t_26, Py_EQ); __Pyx_XGOTREF(__pyx_t_25); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 722, __pyx_L43_error)
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __Pyx_DECREF(__pyx_t_26); __pyx_t_26 = 0;
+          __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_25); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(9, 722, __pyx_L43_error)
+          __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+          if (__pyx_t_7) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":723
+ *             # Allows users to raise other types of exception with specified status code
+ *             if rpc_state.status_code == StatusCode.ok:
+ *                 status_code = StatusCode.unknown             # <<<<<<<<<<<<<<
+ *             else:
+ *                 status_code = rpc_state.status_code
+ */
+            __Pyx_GetModuleGlobalName(__pyx_t_25, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 723, __pyx_L43_error)
+            __Pyx_GOTREF(__pyx_t_25);
+            __pyx_t_26 = __Pyx_PyObject_GetAttrStr(__pyx_t_25, __pyx_n_s_unknown); if (unlikely(!__pyx_t_26)) __PYX_ERR(9, 723, __pyx_L43_error)
+            __Pyx_GOTREF(__pyx_t_26);
+            __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+            __Pyx_GIVEREF(__pyx_t_26);
+            __pyx_cur_scope->__pyx_v_status_code = __pyx_t_26;
+            __pyx_t_26 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":722
+ *         if not rpc_state.status_sent and rpc_state.server._status != AIO_SERVER_STATUS_STOPPED:
+ *             # Allows users to raise other types of exception with specified status code
+ *             if rpc_state.status_code == StatusCode.ok:             # <<<<<<<<<<<<<<
+ *                 status_code = StatusCode.unknown
+ *             else:
+ */
+            goto __pyx_L48;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":725
+ *                 status_code = StatusCode.unknown
+ *             else:
+ *                 status_code = rpc_state.status_code             # <<<<<<<<<<<<<<
+ * 
+ *             rpc_state.status_sent = True
+ */
+          /*else*/ {
+            __pyx_t_26 = __Pyx_PyInt_From_grpc_status_code(__pyx_cur_scope->__pyx_v_rpc_state->status_code); if (unlikely(!__pyx_t_26)) __PYX_ERR(9, 725, __pyx_L43_error)
+            __Pyx_GOTREF(__pyx_t_26);
+            __Pyx_GIVEREF(__pyx_t_26);
+            __pyx_cur_scope->__pyx_v_status_code = __pyx_t_26;
+            __pyx_t_26 = 0;
+          }
+          __pyx_L48:;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":727
+ *                 status_code = rpc_state.status_code
+ * 
+ *             rpc_state.status_sent = True             # <<<<<<<<<<<<<<
+ *             try:
+ *                 await _send_error_status_from_server(
+ */
+          __pyx_cur_scope->__pyx_v_rpc_state->status_sent = 1;
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":728
+ * 
+ *             rpc_state.status_sent = True
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await _send_error_status_from_server(
+ *                     rpc_state,
+ */
+          {
+            __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_5, &__pyx_t_4);
+            __Pyx_XGOTREF(__pyx_t_6);
+            __Pyx_XGOTREF(__pyx_t_5);
+            __Pyx_XGOTREF(__pyx_t_4);
+            /*try:*/ {
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":729
+ *             rpc_state.status_sent = True
+ *             try:
+ *                 await _send_error_status_from_server(             # <<<<<<<<<<<<<<
+ *                     rpc_state,
+ *                     status_code,
+ */
+              __Pyx_GetModuleGlobalName(__pyx_t_25, __pyx_n_s_send_error_status_from_server); if (unlikely(!__pyx_t_25)) __PYX_ERR(9, 729, __pyx_L49_error)
+              __Pyx_GOTREF(__pyx_t_25);
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":732
+ *                     rpc_state,
+ *                     status_code,
+ *                     'Unexpected %s: %s' % (type(e), e),             # <<<<<<<<<<<<<<
+ *                     rpc_state.trailing_metadata,
+ *                     rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ */
+              __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 732, __pyx_L49_error)
+              __Pyx_GOTREF(__pyx_t_11);
+              __Pyx_INCREF(((PyObject *)Py_TYPE(__pyx_cur_scope->__pyx_v_e)));
+              __Pyx_GIVEREF(((PyObject *)Py_TYPE(__pyx_cur_scope->__pyx_v_e)));
+              if (__Pyx_PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)Py_TYPE(__pyx_cur_scope->__pyx_v_e)))) __PYX_ERR(9, 732, __pyx_L49_error);
+              __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
+              __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
+              if (__Pyx_PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_cur_scope->__pyx_v_e)) __PYX_ERR(9, 732, __pyx_L49_error);
+              __pyx_t_24 = __Pyx_PyString_Format(__pyx_kp_s_Unexpected_s_s, __pyx_t_11); if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 732, __pyx_L49_error)
+              __Pyx_GOTREF(__pyx_t_24);
+              __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":734
+ *                     'Unexpected %s: %s' % (type(e), e),
+ *                     rpc_state.trailing_metadata,
+ *                     rpc_state.create_send_initial_metadata_op_if_not_sent(),             # <<<<<<<<<<<<<<
+ *                     loop
+ *                 )
+ */
+              __pyx_t_11 = ((PyObject *)((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->create_send_initial_metadata_op_if_not_sent(__pyx_cur_scope->__pyx_v_rpc_state)); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 734, __pyx_L49_error)
+              __Pyx_GOTREF(__pyx_t_11);
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":735
+ *                     rpc_state.trailing_metadata,
+ *                     rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *                     loop             # <<<<<<<<<<<<<<
+ *                 )
+ *             except ExecuteBatchError:
+ */
+              __pyx_t_12 = NULL;
+              __pyx_t_13 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (unlikely(PyMethod_Check(__pyx_t_25))) {
+                __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_25);
+                if (likely(__pyx_t_12)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_25);
+                  __Pyx_INCREF(__pyx_t_12);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_25, function);
+                  __pyx_t_13 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[7] = {__pyx_t_12, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_status_code, __pyx_t_24, __pyx_cur_scope->__pyx_v_rpc_state->trailing_metadata, __pyx_t_11, __pyx_cur_scope->__pyx_v_loop};
+                __pyx_t_26 = __Pyx_PyObject_FastCall(__pyx_t_25, __pyx_callargs+1-__pyx_t_13, 6+__pyx_t_13);
+                __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+                __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+                __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+                if (unlikely(!__pyx_t_26)) __PYX_ERR(9, 729, __pyx_L49_error)
+                __Pyx_GOTREF(__pyx_t_26);
+                __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
+              }
+              __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_26);
+              __Pyx_DECREF(__pyx_t_26); __pyx_t_26 = 0;
+              __Pyx_XGOTREF(__pyx_r);
+              if (likely(__pyx_r)) {
+                __Pyx_XGIVEREF(__pyx_t_1);
+                __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+                __Pyx_XGIVEREF(__pyx_t_2);
+                __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+                __Pyx_XGIVEREF(__pyx_t_3);
+                __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+                __Pyx_XGIVEREF(__pyx_t_4);
+                __pyx_cur_scope->__pyx_t_3 = __pyx_t_4;
+                __Pyx_XGIVEREF(__pyx_t_5);
+                __pyx_cur_scope->__pyx_t_4 = __pyx_t_5;
+                __Pyx_XGIVEREF(__pyx_t_6);
+                __pyx_cur_scope->__pyx_t_5 = __pyx_t_6;
+                __Pyx_XGIVEREF(__pyx_t_8);
+                __pyx_cur_scope->__pyx_t_6 = __pyx_t_8;
+                __Pyx_XGIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_t_7 = __pyx_t_9;
+                __Pyx_XGIVEREF(__pyx_t_10);
+                __pyx_cur_scope->__pyx_t_8 = __pyx_t_10;
+                __Pyx_XGIVEREF(__pyx_r);
+                __Pyx_RefNannyFinishContext();
+                __Pyx_Coroutine_SwapException(__pyx_generator);
+                /* return from generator, awaiting value */
+                __pyx_generator->resume_label = 2;
+                return __pyx_r;
+                __pyx_L57_resume_from_await:;
+                __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+                __pyx_cur_scope->__pyx_t_0 = 0;
+                __Pyx_XGOTREF(__pyx_t_1);
+                __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+                __pyx_cur_scope->__pyx_t_1 = 0;
+                __Pyx_XGOTREF(__pyx_t_2);
+                __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+                __pyx_cur_scope->__pyx_t_2 = 0;
+                __Pyx_XGOTREF(__pyx_t_3);
+                __pyx_t_4 = __pyx_cur_scope->__pyx_t_3;
+                __pyx_cur_scope->__pyx_t_3 = 0;
+                __Pyx_XGOTREF(__pyx_t_4);
+                __pyx_t_5 = __pyx_cur_scope->__pyx_t_4;
+                __pyx_cur_scope->__pyx_t_4 = 0;
+                __Pyx_XGOTREF(__pyx_t_5);
+                __pyx_t_6 = __pyx_cur_scope->__pyx_t_5;
+                __pyx_cur_scope->__pyx_t_5 = 0;
+                __Pyx_XGOTREF(__pyx_t_6);
+                __pyx_t_8 = __pyx_cur_scope->__pyx_t_6;
+                __pyx_cur_scope->__pyx_t_6 = 0;
+                __Pyx_XGOTREF(__pyx_t_8);
+                __pyx_t_9 = __pyx_cur_scope->__pyx_t_7;
+                __pyx_cur_scope->__pyx_t_7 = 0;
+                __Pyx_XGOTREF(__pyx_t_9);
+                __pyx_t_10 = __pyx_cur_scope->__pyx_t_8;
+                __pyx_cur_scope->__pyx_t_8 = 0;
+                __Pyx_XGOTREF(__pyx_t_10);
+                if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 729, __pyx_L49_error)
+              } else {
+                PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+                if (exc_type) {
+                  if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+                  else __PYX_ERR(9, 729, __pyx_L49_error)
+                }
+              }
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":728
+ * 
+ *             rpc_state.status_sent = True
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await _send_error_status_from_server(
+ *                     rpc_state,
+ */
+            }
+            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+            goto __pyx_L56_try_end;
+            __pyx_L49_error:;
+            __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+            __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+            __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0;
+            __Pyx_XDECREF(__pyx_t_25); __pyx_t_25 = 0;
+            __Pyx_XDECREF(__pyx_t_26); __pyx_t_26 = 0;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":737
+ *                     loop
+ *                 )
+ *             except ExecuteBatchError:             # <<<<<<<<<<<<<<
+ *                 _LOGGER.exception('Failed sending error status from server')
+ *                 traceback.print_exc()
+ */
+            __Pyx_ErrFetch(&__pyx_t_26, &__pyx_t_25, &__pyx_t_11);
+            __Pyx_GetModuleGlobalName(__pyx_t_24, __pyx_n_s_ExecuteBatchError); if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 737, __pyx_L51_except_error)
+            __Pyx_GOTREF(__pyx_t_24);
+            __pyx_t_15 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_26, __pyx_t_24);
+            __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+            __Pyx_ErrRestore(__pyx_t_26, __pyx_t_25, __pyx_t_11);
+            __pyx_t_26 = 0; __pyx_t_25 = 0; __pyx_t_11 = 0;
+            if (__pyx_t_15) {
+              __Pyx_AddTraceback("_cython.cygrpc._handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+              if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_25, &__pyx_t_26) < 0) __PYX_ERR(9, 737, __pyx_L51_except_error)
+              __Pyx_XGOTREF(__pyx_t_11);
+              __Pyx_XGOTREF(__pyx_t_25);
+              __Pyx_XGOTREF(__pyx_t_26);
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":738
+ *                 )
+ *             except ExecuteBatchError:
+ *                 _LOGGER.exception('Failed sending error status from server')             # <<<<<<<<<<<<<<
+ *                 traceback.print_exc()
+ * 
+ */
+              __Pyx_GetModuleGlobalName(__pyx_t_12, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 738, __pyx_L51_except_error)
+              __Pyx_GOTREF(__pyx_t_12);
+              __pyx_t_28 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_exception); if (unlikely(!__pyx_t_28)) __PYX_ERR(9, 738, __pyx_L51_except_error)
+              __Pyx_GOTREF(__pyx_t_28);
+              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+              __pyx_t_12 = NULL;
+              __pyx_t_13 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (unlikely(PyMethod_Check(__pyx_t_28))) {
+                __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_28);
+                if (likely(__pyx_t_12)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_28);
+                  __Pyx_INCREF(__pyx_t_12);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_28, function);
+                  __pyx_t_13 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_kp_s_Failed_sending_error_status_from};
+                __pyx_t_24 = __Pyx_PyObject_FastCall(__pyx_t_28, __pyx_callargs+1-__pyx_t_13, 1+__pyx_t_13);
+                __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+                if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 738, __pyx_L51_except_error)
+                __Pyx_GOTREF(__pyx_t_24);
+                __Pyx_DECREF(__pyx_t_28); __pyx_t_28 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+
+              /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":739
+ *             except ExecuteBatchError:
+ *                 _LOGGER.exception('Failed sending error status from server')
+ *                 traceback.print_exc()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+              __Pyx_GetModuleGlobalName(__pyx_t_28, __pyx_n_s_traceback); if (unlikely(!__pyx_t_28)) __PYX_ERR(9, 739, __pyx_L51_except_error)
+              __Pyx_GOTREF(__pyx_t_28);
+              __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_28, __pyx_n_s_print_exc); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 739, __pyx_L51_except_error)
+              __Pyx_GOTREF(__pyx_t_12);
+              __Pyx_DECREF(__pyx_t_28); __pyx_t_28 = 0;
+              __pyx_t_28 = NULL;
+              __pyx_t_13 = 0;
+              #if CYTHON_UNPACK_METHODS
+              if (unlikely(PyMethod_Check(__pyx_t_12))) {
+                __pyx_t_28 = PyMethod_GET_SELF(__pyx_t_12);
+                if (likely(__pyx_t_28)) {
+                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+                  __Pyx_INCREF(__pyx_t_28);
+                  __Pyx_INCREF(function);
+                  __Pyx_DECREF_SET(__pyx_t_12, function);
+                  __pyx_t_13 = 1;
+                }
+              }
+              #endif
+              {
+                PyObject *__pyx_callargs[2] = {__pyx_t_28, NULL};
+                __pyx_t_24 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_13, 0+__pyx_t_13);
+                __Pyx_XDECREF(__pyx_t_28); __pyx_t_28 = 0;
+                if (unlikely(!__pyx_t_24)) __PYX_ERR(9, 739, __pyx_L51_except_error)
+                __Pyx_GOTREF(__pyx_t_24);
+                __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+              }
+              __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
+              __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+              __Pyx_XDECREF(__pyx_t_25); __pyx_t_25 = 0;
+              __Pyx_XDECREF(__pyx_t_26); __pyx_t_26 = 0;
+              goto __pyx_L50_exception_handled;
+            }
+            goto __pyx_L51_except_error;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":728
+ * 
+ *             rpc_state.status_sent = True
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await _send_error_status_from_server(
+ *                     rpc_state,
+ */
+            __pyx_L51_except_error:;
+            __Pyx_XGIVEREF(__pyx_t_6);
+            __Pyx_XGIVEREF(__pyx_t_5);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_5, __pyx_t_4);
+            goto __pyx_L43_error;
+            __pyx_L50_exception_handled:;
+            __Pyx_XGIVEREF(__pyx_t_6);
+            __Pyx_XGIVEREF(__pyx_t_5);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_5, __pyx_t_4);
+            __pyx_L56_try_end:;
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":720
+ *             _decode(rpc_state.method()),
+ *         ))
+ *         if not rpc_state.status_sent and rpc_state.server._status != AIO_SERVER_STATUS_STOPPED:             # <<<<<<<<<<<<<<
+ *             # Allows users to raise other types of exception with specified status code
+ *             if rpc_state.status_code == StatusCode.ok:
+ */
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":715
+ *                 _decode(rpc_state.method())))
+ *             return
+ *     except Exception as e:             # <<<<<<<<<<<<<<
+ *         _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % (
+ *             type(e).__name__,
+ */
+      /*finally:*/ {
+        /*normal exit:*/{
+          __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_e);
+          __Pyx_DECREF(__pyx_cur_scope->__pyx_v_e); __pyx_cur_scope->__pyx_v_e = 0;
+          goto __pyx_L44;
+        }
+        __pyx_L43_error:;
+        /*exception exit:*/{
+          __Pyx_PyThreadState_assign
+          __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0;
+          __Pyx_XDECREF(__pyx_t_25); __pyx_t_25 = 0;
+          __Pyx_XDECREF(__pyx_t_26); __pyx_t_26 = 0;
+          __Pyx_XDECREF(__pyx_t_28); __pyx_t_28 = 0;
+          if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19);
+          if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6) < 0)) __Pyx_ErrFetch(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __Pyx_XGOTREF(__pyx_t_5);
+          __Pyx_XGOTREF(__pyx_t_6);
+          __Pyx_XGOTREF(__pyx_t_17);
+          __Pyx_XGOTREF(__pyx_t_18);
+          __Pyx_XGOTREF(__pyx_t_19);
+          __pyx_t_15 = __pyx_lineno; __pyx_t_14 = __pyx_clineno; __pyx_t_29 = __pyx_filename;
+          {
+            __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_e);
+            __Pyx_DECREF(__pyx_cur_scope->__pyx_v_e); __pyx_cur_scope->__pyx_v_e = 0;
+          }
+          if (PY_MAJOR_VERSION >= 3) {
+            __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_XGIVEREF(__pyx_t_4);
+          __Pyx_XGIVEREF(__pyx_t_5);
+          __Pyx_XGIVEREF(__pyx_t_6);
+          __Pyx_ErrRestore(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+          __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0;
+          __pyx_lineno = __pyx_t_15; __pyx_clineno = __pyx_t_14; __pyx_filename = __pyx_t_29;
+          goto __pyx_L6_except_error;
+        }
+        __pyx_L44:;
+      }
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L5_exception_handled;
+    }
+    goto __pyx_L6_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":687
+ * 
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):
+ *     try:             # <<<<<<<<<<<<<<
+ *         try:
+ *             await rpc_coro
+ */
+    __pyx_L6_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_L8_try_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_L7_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_L5_exception_handled:;
+    __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);
+    __pyx_L9_try_end:;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":686
+ * 
+ * 
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         try:
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_24);
+  __Pyx_XDECREF(__pyx_t_25);
+  __Pyx_XDECREF(__pyx_t_26);
+  __Pyx_XDECREF(__pyx_t_28);
+  __Pyx_AddTraceback("_handle_exceptions", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":744
+ * cdef _add_callback_handler(object rpc_task, RPCState rpc_state):
+ * 
+ *     def handle_callbacks(object unused_task):             # <<<<<<<<<<<<<<
+ *         try:
+ *             for callback in rpc_state.callbacks:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_add_callback_handler_1handle_callbacks(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21_add_callback_handler_1handle_callbacks = {"handle_callbacks", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_add_callback_handler_1handle_callbacks, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_add_callback_handler_1handle_callbacks(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v_unused_task = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("handle_callbacks (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_unused_task,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_unused_task)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 744, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "handle_callbacks") < 0)) __PYX_ERR(9, 744, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_unused_task = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("handle_callbacks", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 744, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._add_callback_handler.handle_callbacks", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21_add_callback_handler_handle_callbacks(__pyx_self, __pyx_v_unused_task);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_add_callback_handler_handle_callbacks(PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_unused_task) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *__pyx_cur_scope;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *__pyx_outer_scope;
+  PyObject *__pyx_v_callback = 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;
+  Py_ssize_t __pyx_t_5;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  unsigned int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("handle_callbacks", 1);
+  __pyx_outer_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *) __Pyx_CyFunction_GetClosure(__pyx_self);
+  __pyx_cur_scope = __pyx_outer_scope;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":745
+ * 
+ *     def handle_callbacks(object unused_task):
+ *         try:             # <<<<<<<<<<<<<<
+ *             for callback in rpc_state.callbacks:
+ *                 # The _ServicerContext object is bound in add_done_callback.
+ */
+  {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __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:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":746
+ *     def handle_callbacks(object unused_task):
+ *         try:
+ *             for callback in rpc_state.callbacks:             # <<<<<<<<<<<<<<
+ *                 # The _ServicerContext object is bound in add_done_callback.
+ *                 callback()
+ */
+      if (unlikely(!__pyx_cur_scope->__pyx_v_rpc_state)) { __Pyx_RaiseClosureNameError("rpc_state"); __PYX_ERR(9, 746, __pyx_L3_error) }
+      if (likely(PyList_CheckExact(__pyx_cur_scope->__pyx_v_rpc_state->callbacks)) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_rpc_state->callbacks)) {
+        __pyx_t_4 = __pyx_cur_scope->__pyx_v_rpc_state->callbacks; __Pyx_INCREF(__pyx_t_4);
+        __pyx_t_5 = 0;
+        __pyx_t_6 = NULL;
+      } else {
+        __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_rpc_state->callbacks); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 746, __pyx_L3_error)
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 746, __pyx_L3_error)
+      }
+      for (;;) {
+        if (likely(!__pyx_t_6)) {
+          if (likely(PyList_CheckExact(__pyx_t_4))) {
+            {
+              Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_4);
+              #if !CYTHON_ASSUME_SAFE_MACROS
+              if (unlikely((__pyx_temp < 0))) __PYX_ERR(9, 746, __pyx_L3_error)
+              #endif
+              if (__pyx_t_5 >= __pyx_temp) break;
+            }
+            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+            __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(9, 746, __pyx_L3_error)
+            #else
+            __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 746, __pyx_L3_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            #endif
+          } else {
+            {
+              Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_4);
+              #if !CYTHON_ASSUME_SAFE_MACROS
+              if (unlikely((__pyx_temp < 0))) __PYX_ERR(9, 746, __pyx_L3_error)
+              #endif
+              if (__pyx_t_5 >= __pyx_temp) break;
+            }
+            #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+            __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely((0 < 0))) __PYX_ERR(9, 746, __pyx_L3_error)
+            #else
+            __pyx_t_7 = __Pyx_PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 746, __pyx_L3_error)
+            __Pyx_GOTREF(__pyx_t_7);
+            #endif
+          }
+        } else {
+          __pyx_t_7 = __pyx_t_6(__pyx_t_4);
+          if (unlikely(!__pyx_t_7)) {
+            PyObject* exc_type = PyErr_Occurred();
+            if (exc_type) {
+              if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+              else __PYX_ERR(9, 746, __pyx_L3_error)
+            }
+            break;
+          }
+          __Pyx_GOTREF(__pyx_t_7);
+        }
+        __Pyx_XDECREF_SET(__pyx_v_callback, __pyx_t_7);
+        __pyx_t_7 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":748
+ *             for callback in rpc_state.callbacks:
+ *                 # The _ServicerContext object is bound in add_done_callback.
+ *                 callback()             # <<<<<<<<<<<<<<
+ *         except:
+ *             _LOGGER.exception('Error in callback for method [%s]', _decode(rpc_state.method()))
+ */
+        __Pyx_INCREF(__pyx_v_callback);
+        __pyx_t_8 = __pyx_v_callback; __pyx_t_9 = NULL;
+        __pyx_t_10 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_8))) {
+          __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8);
+          if (likely(__pyx_t_9)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
+            __Pyx_INCREF(__pyx_t_9);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_8, function);
+            __pyx_t_10 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_9, NULL};
+          __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 0+__pyx_t_10);
+          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+          if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 748, __pyx_L3_error)
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":746
+ *     def handle_callbacks(object unused_task):
+ *         try:
+ *             for callback in rpc_state.callbacks:             # <<<<<<<<<<<<<<
+ *                 # The _ServicerContext object is bound in add_done_callback.
+ *                 callback()
+ */
+      }
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":745
+ * 
+ *     def handle_callbacks(object unused_task):
+ *         try:             # <<<<<<<<<<<<<<
+ *             for callback in rpc_state.callbacks:
+ *                 # The _ServicerContext object is bound in add_done_callback.
+ */
+    }
+    __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_L8_try_end;
+    __pyx_L3_error:;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":749
+ *                 # The _ServicerContext object is bound in add_done_callback.
+ *                 callback()
+ *         except:             # <<<<<<<<<<<<<<
+ *             _LOGGER.exception('Error in callback for method [%s]', _decode(rpc_state.method()))
+ * 
+ */
+    /*except:*/ {
+      __Pyx_AddTraceback("_cython.cygrpc._add_callback_handler.handle_callbacks", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(9, 749, __pyx_L5_except_error)
+      __Pyx_XGOTREF(__pyx_t_4);
+      __Pyx_XGOTREF(__pyx_t_7);
+      __Pyx_XGOTREF(__pyx_t_8);
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":750
+ *                 callback()
+ *         except:
+ *             _LOGGER.exception('Error in callback for method [%s]', _decode(rpc_state.method()))             # <<<<<<<<<<<<<<
+ * 
+ *     rpc_task.add_done_callback(handle_callbacks)
+ */
+      __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 750, __pyx_L5_except_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_exception); if (unlikely(!__pyx_t_12)) __PYX_ERR(9, 750, __pyx_L5_except_error)
+      __Pyx_GOTREF(__pyx_t_12);
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      if (unlikely(!__pyx_cur_scope->__pyx_v_rpc_state)) { __Pyx_RaiseClosureNameError("rpc_state"); __PYX_ERR(9, 750, __pyx_L5_except_error) }
+      __pyx_t_11 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->method(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 750, __pyx_L5_except_error)
+      __Pyx_GOTREF(__pyx_t_11);
+      __pyx_t_13 = __pyx_f_7_cython_6cygrpc__decode(((PyObject*)__pyx_t_11)); if (unlikely(!__pyx_t_13)) __PYX_ERR(9, 750, __pyx_L5_except_error)
+      __Pyx_GOTREF(__pyx_t_13);
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __pyx_t_11 = NULL;
+      __pyx_t_10 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (unlikely(PyMethod_Check(__pyx_t_12))) {
+        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12);
+        if (likely(__pyx_t_11)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
+          __Pyx_INCREF(__pyx_t_11);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_12, function);
+          __pyx_t_10 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[3] = {__pyx_t_11, __pyx_kp_s_Error_in_callback_for_method_s, __pyx_t_13};
+        __pyx_t_9 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10);
+        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+        if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 750, __pyx_L5_except_error)
+        __Pyx_GOTREF(__pyx_t_9);
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L4_exception_handled;
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":745
+ * 
+ *     def handle_callbacks(object unused_task):
+ *         try:             # <<<<<<<<<<<<<<
+ *             for callback in rpc_state.callbacks:
+ *                 # The _ServicerContext object is bound in add_done_callback.
+ */
+    __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_L4_exception_handled:;
+    __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);
+    __pyx_L8_try_end:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":744
+ * cdef _add_callback_handler(object rpc_task, RPCState rpc_state):
+ * 
+ *     def handle_callbacks(object unused_task):             # <<<<<<<<<<<<<<
+ *         try:
+ *             for callback in rpc_state.callbacks:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_13);
+  __Pyx_AddTraceback("_cython.cygrpc._add_callback_handler.handle_callbacks", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_callback);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":742
+ * 
+ * 
+ * cdef _add_callback_handler(object rpc_task, RPCState rpc_state):             # <<<<<<<<<<<<<<
+ * 
+ *     def handle_callbacks(object unused_task):
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__add_callback_handler(PyObject *__pyx_v_rpc_task, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *__pyx_cur_scope;
+  PyObject *__pyx_v_handle_callbacks = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("_add_callback_handler", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 742, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":744
+ * cdef _add_callback_handler(object rpc_task, RPCState rpc_state):
+ * 
+ *     def handle_callbacks(object unused_task):             # <<<<<<<<<<<<<<
+ *         try:
+ *             for callback in rpc_state.callbacks:
+ */
+  __pyx_t_1 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21_add_callback_handler_1handle_callbacks, 0, __pyx_n_s_add_callback_handler_locals_han, ((PyObject*)__pyx_cur_scope), __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__94)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 744, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_handle_callbacks = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":752
+ *             _LOGGER.exception('Error in callback for method [%s]', _decode(rpc_state.method()))
+ * 
+ *     rpc_task.add_done_callback(handle_callbacks)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_rpc_task, __pyx_n_s_add_done_callback); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 752, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_handle_callbacks};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 752, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":742
+ * 
+ * 
+ * cdef _add_callback_handler(object rpc_task, RPCState rpc_state):             # <<<<<<<<<<<<<<
+ * 
+ *     def handle_callbacks(object unused_task):
+ */
+
+  /* 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("_cython.cygrpc._add_callback_handler", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_handle_callbacks);
+  __Pyx_DECREF((PyObject *)__pyx_cur_scope);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_181generator35(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":755
+ * 
+ * 
+ * async def _handle_cancellation_from_core(object rpc_task,             # <<<<<<<<<<<<<<
+ *                                          RPCState rpc_state,
+ *                                          object loop):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_180_handle_cancellation_from_core(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_180_handle_cancellation_from_core = {"_handle_cancellation_from_core", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_180_handle_cancellation_from_core, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_180_handle_cancellation_from_core(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_rpc_task = 0;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_cancellation_from_core (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rpc_task,&__pyx_n_s_rpc_state,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_task)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 755, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 755, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_cancellation_from_core", 1, 3, 3, 1); __PYX_ERR(9, 755, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 755, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_cancellation_from_core", 1, 3, 3, 2); __PYX_ERR(9, 755, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_cancellation_from_core") < 0)) __PYX_ERR(9, 755, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_rpc_task = values[0];
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[1]);
+    __pyx_v_loop = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_cancellation_from_core", 1, 3, 3, __pyx_nargs); __PYX_ERR(9, 755, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._handle_cancellation_from_core", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 756, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_179_handle_cancellation_from_core(__pyx_self, __pyx_v_rpc_task, __pyx_v_rpc_state, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_179_handle_cancellation_from_core(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rpc_task, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_cancellation_from_core", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 755, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_rpc_task = __pyx_v_rpc_task;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_rpc_task);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_rpc_task);
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_181generator35, __pyx_codeobj__95, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_cancellation_from_core, __pyx_n_s_handle_cancellation_from_core, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 755, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._handle_cancellation_from_core", __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_7_cython_6cygrpc_181generator35(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_cancellation_from_core", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 755, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":758
+ *                                          RPCState rpc_state,
+ *                                          object loop):
+ *     cdef ReceiveCloseOnServerOperation op = ReceiveCloseOnServerOperation(_EMPTY_FLAG)             # <<<<<<<<<<<<<<
+ *     cdef tuple ops = (op,)
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_7_cython_6cygrpc__EMPTY_FLAG); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 758, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 758, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_op = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":759
+ *                                          object loop):
+ *     cdef ReceiveCloseOnServerOperation op = ReceiveCloseOnServerOperation(_EMPTY_FLAG)
+ *     cdef tuple ops = (op,)             # <<<<<<<<<<<<<<
+ * 
+ *     # Awaits cancellation from peer.
+ */
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 759, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_op);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_op))) __PYX_ERR(9, 759, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_ops = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":762
+ * 
+ *     # Awaits cancellation from peer.
+ *     await execute_batch(rpc_state, ops, loop)             # <<<<<<<<<<<<<<
+ *     rpc_state.client_closed = True
+ *     # If 1) received cancel signal; 2) the Task is not finished; 3) the server
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_execute_batch); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 762, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_3, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_ops, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 762, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 762, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 762, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":763
+ *     # Awaits cancellation from peer.
+ *     await execute_batch(rpc_state, ops, loop)
+ *     rpc_state.client_closed = True             # <<<<<<<<<<<<<<
+ *     # If 1) received cancel signal; 2) the Task is not finished; 3) the server
+ *     # wasn't replying final status. For condition 3, it might cause inaccurate
+ */
+  __pyx_cur_scope->__pyx_v_rpc_state->client_closed = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":767
+ *     # wasn't replying final status. For condition 3, it might cause inaccurate
+ *     # log that an RPC is both aborted and cancelled.
+ *     if op.cancelled() and not rpc_task.done() and not rpc_state.status_sent:             # <<<<<<<<<<<<<<
+ *         # Injects `CancelledError` to halt the RPC coroutine
+ *         rpc_task.cancel()
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_op), __pyx_n_s_cancelled); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 767, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 767, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 767, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_6) {
+  } else {
+    __pyx_t_5 = __pyx_t_6;
+    goto __pyx_L6_bool_binop_done;
+  }
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_rpc_task, __pyx_n_s_done); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 767, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 767, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 767, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_7 = (!__pyx_t_6);
+  if (__pyx_t_7) {
+  } else {
+    __pyx_t_5 = __pyx_t_7;
+    goto __pyx_L6_bool_binop_done;
+  }
+  __pyx_t_7 = (!__pyx_cur_scope->__pyx_v_rpc_state->status_sent);
+  __pyx_t_5 = __pyx_t_7;
+  __pyx_L6_bool_binop_done:;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":769
+ *     if op.cancelled() and not rpc_task.done() and not rpc_state.status_sent:
+ *         # Injects `CancelledError` to halt the RPC coroutine
+ *         rpc_task.cancel()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_rpc_task, __pyx_n_s_cancel); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 769, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 769, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":767
+ *     # wasn't replying final status. For condition 3, it might cause inaccurate
+ *     # log that an RPC is both aborted and cancelled.
+ *     if op.cancelled() and not rpc_task.done() and not rpc_state.status_sent:             # <<<<<<<<<<<<<<
+ *         # Injects `CancelledError` to halt the RPC coroutine
+ *         rpc_task.cancel()
+ */
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":755
+ * 
+ * 
+ * async def _handle_cancellation_from_core(object rpc_task,             # <<<<<<<<<<<<<<
+ *                                          RPCState rpc_state,
+ *                                          object loop):
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_handle_cancellation_from_core", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_184generator36(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":772
+ * 
+ * 
+ * async def _schedule_rpc_coro(object rpc_coro,             # <<<<<<<<<<<<<<
+ *                              RPCState rpc_state,
+ *                              object loop):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_183_schedule_rpc_coro(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_183_schedule_rpc_coro = {"_schedule_rpc_coro", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_183_schedule_rpc_coro, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_183_schedule_rpc_coro(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_rpc_coro = 0;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_loop = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_schedule_rpc_coro (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rpc_coro,&__pyx_n_s_rpc_state,&__pyx_n_s_loop,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_coro)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 772, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 772, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_schedule_rpc_coro", 1, 3, 3, 1); __PYX_ERR(9, 772, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 772, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_schedule_rpc_coro", 1, 3, 3, 2); __PYX_ERR(9, 772, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_schedule_rpc_coro") < 0)) __PYX_ERR(9, 772, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v_rpc_coro = values[0];
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[1]);
+    __pyx_v_loop = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_schedule_rpc_coro", 1, 3, 3, __pyx_nargs); __PYX_ERR(9, 772, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._schedule_rpc_coro", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 773, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_182_schedule_rpc_coro(__pyx_self, __pyx_v_rpc_coro, __pyx_v_rpc_state, __pyx_v_loop);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_182_schedule_rpc_coro(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_rpc_coro, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_schedule_rpc_coro", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 772, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_rpc_coro = __pyx_v_rpc_coro;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_rpc_coro);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_rpc_coro);
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_184generator36, __pyx_codeobj__96, (PyObject *) __pyx_cur_scope, __pyx_n_s_schedule_rpc_coro, __pyx_n_s_schedule_rpc_coro, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 772, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._schedule_rpc_coro", __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_7_cython_6cygrpc_184generator36(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_schedule_rpc_coro", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 772, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":776
+ *                              object loop):
+ *     # Schedules the RPC coroutine.
+ *     cdef object rpc_task = loop.create_task(_handle_exceptions(             # <<<<<<<<<<<<<<
+ *         rpc_state,
+ *         rpc_coro,
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_loop, __pyx_n_s_create_task); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 776, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_handle_exceptions); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 776, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":779
+ *         rpc_state,
+ *         rpc_coro,
+ *         loop,             # <<<<<<<<<<<<<<
+ *     ))
+ *     _add_callback_handler(rpc_task, rpc_state)
+ */
+  __pyx_t_5 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_5, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_rpc_coro, __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 776, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __pyx_t_4 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 776, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_rpc_task = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":781
+ *         loop,
+ *     ))
+ *     _add_callback_handler(rpc_task, rpc_state)             # <<<<<<<<<<<<<<
+ *     await _handle_cancellation_from_core(rpc_task, rpc_state, loop)
+ * 
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc__add_callback_handler(__pyx_cur_scope->__pyx_v_rpc_task, __pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 781, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":782
+ *     ))
+ *     _add_callback_handler(rpc_task, rpc_state)
+ *     await _handle_cancellation_from_core(rpc_task, rpc_state, loop)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_handle_cancellation_from_core); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 782, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[4] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_rpc_task, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_loop};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 782, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 782, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 782, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":772
+ * 
+ * 
+ * async def _schedule_rpc_coro(object rpc_coro,             # <<<<<<<<<<<<<<
+ *                              RPCState rpc_state,
+ *                              object loop):
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __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_AddTraceback("_schedule_rpc_coro", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_187generator37(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":785
+ * 
+ * 
+ * async def _handle_rpc(list generic_handlers, tuple interceptors,             # <<<<<<<<<<<<<<
+ *                       RPCState rpc_state, object loop, bint concurrency_exceeded):
+ *     cdef object method_handler
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_186_handle_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_186_handle_rpc = {"_handle_rpc", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_186_handle_rpc, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_186_handle_rpc(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_generic_handlers = 0;
+  PyObject *__pyx_v_interceptors = 0;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state = 0;
+  PyObject *__pyx_v_loop = 0;
+  int __pyx_v_concurrency_exceeded;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[5] = {0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_rpc (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_generic_handlers,&__pyx_n_s_interceptors,&__pyx_n_s_rpc_state,&__pyx_n_s_loop,&__pyx_n_s_concurrency_exceeded,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_generic_handlers)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 785, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_interceptors)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 785, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_rpc", 1, 5, 5, 1); __PYX_ERR(9, 785, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 785, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_rpc", 1, 5, 5, 2); __PYX_ERR(9, 785, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 785, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_rpc", 1, 5, 5, 3); __PYX_ERR(9, 785, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_concurrency_exceeded)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 785, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("_handle_rpc", 1, 5, 5, 4); __PYX_ERR(9, 785, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_handle_rpc") < 0)) __PYX_ERR(9, 785, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 5)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+      values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
+      values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
+    }
+    __pyx_v_generic_handlers = ((PyObject*)values[0]);
+    __pyx_v_interceptors = ((PyObject*)values[1]);
+    __pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)values[2]);
+    __pyx_v_loop = values[3];
+    __pyx_v_concurrency_exceeded = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_concurrency_exceeded == (int)-1) && PyErr_Occurred())) __PYX_ERR(9, 786, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_handle_rpc", 1, 5, 5, __pyx_nargs); __PYX_ERR(9, 785, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._handle_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_generic_handlers), (&PyList_Type), 1, "generic_handlers", 1))) __PYX_ERR(9, 785, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_interceptors), (&PyTuple_Type), 1, "interceptors", 1))) __PYX_ERR(9, 785, __pyx_L1_error)
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rpc_state), __pyx_ptype_7_cython_6cygrpc_RPCState, 1, "rpc_state", 0))) __PYX_ERR(9, 786, __pyx_L1_error)
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_185_handle_rpc(__pyx_self, __pyx_v_generic_handlers, __pyx_v_interceptors, __pyx_v_rpc_state, __pyx_v_loop, __pyx_v_concurrency_exceeded);
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_185_handle_rpc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_generic_handlers, PyObject *__pyx_v_interceptors, struct __pyx_obj_7_cython_6cygrpc_RPCState *__pyx_v_rpc_state, PyObject *__pyx_v_loop, int __pyx_v_concurrency_exceeded) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_handle_rpc", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 785, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_generic_handlers = __pyx_v_generic_handlers;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_generic_handlers);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_generic_handlers);
+  __pyx_cur_scope->__pyx_v_interceptors = __pyx_v_interceptors;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_interceptors);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_interceptors);
+  __pyx_cur_scope->__pyx_v_rpc_state = __pyx_v_rpc_state;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+  __pyx_cur_scope->__pyx_v_loop = __pyx_v_loop;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loop);
+  __pyx_cur_scope->__pyx_v_concurrency_exceeded = __pyx_v_concurrency_exceeded;
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_187generator37, __pyx_codeobj__97, (PyObject *) __pyx_cur_scope, __pyx_n_s_handle_rpc, __pyx_n_s_handle_rpc, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 785, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._handle_rpc", __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_7_cython_6cygrpc_187generator37(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  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;
+  unsigned int __pyx_t_6;
+  int __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  int __pyx_t_10;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_handle_rpc", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L4_resume_from_await;
+    case 2: goto __pyx_L6_resume_from_await;
+    case 3: goto __pyx_L8_resume_from_await;
+    case 4: goto __pyx_L12_resume_from_await;
+    case 5: goto __pyx_L16_resume_from_await;
+    case 6: goto __pyx_L20_resume_from_await;
+    case 7: goto __pyx_L24_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 785, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":789
+ *     cdef object method_handler
+ *     # Finds the method handler (application logic)
+ *     method_handler = await _find_method_handler(             # <<<<<<<<<<<<<<
+ *         rpc_state.method().decode(),
+ *         rpc_state.invocation_metadata(),
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_find_method_handler); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 789, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":790
+ *     # Finds the method handler (application logic)
+ *     method_handler = await _find_method_handler(
+ *         rpc_state.method().decode(),             # <<<<<<<<<<<<<<
+ *         rpc_state.invocation_metadata(),
+ *         generic_handlers,
+ */
+  __pyx_t_3 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->method(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 790, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  if (unlikely(__pyx_t_3 == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode");
+    __PYX_ERR(9, 790, __pyx_L1_error)
+  }
+  __pyx_t_4 = __Pyx_decode_bytes(__pyx_t_3, 0, PY_SSIZE_T_MAX, NULL, NULL, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 790, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":791
+ *     method_handler = await _find_method_handler(
+ *         rpc_state.method().decode(),
+ *         rpc_state.invocation_metadata(),             # <<<<<<<<<<<<<<
+ *         generic_handlers,
+ *         interceptors,
+ */
+  __pyx_t_3 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->invocation_metadata(__pyx_cur_scope->__pyx_v_rpc_state); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 791, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":793
+ *         rpc_state.invocation_metadata(),
+ *         generic_handlers,
+ *         interceptors,             # <<<<<<<<<<<<<<
+ *     )
+ *     if method_handler is None:
+ */
+  __pyx_t_5 = NULL;
+  __pyx_t_6 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_6 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[5] = {__pyx_t_5, __pyx_t_4, __pyx_t_3, __pyx_cur_scope->__pyx_v_generic_handlers, __pyx_cur_scope->__pyx_v_interceptors};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 4+__pyx_t_6);
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 789, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L4_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 789, __pyx_L1_error)
+    __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
+  } else {
+    __pyx_t_1 = NULL;
+    if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_1) < 0) __PYX_ERR(9, 789, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_method_handler = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":795
+ *         interceptors,
+ *     )
+ *     if method_handler is None:             # <<<<<<<<<<<<<<
+ *         rpc_state.status_sent = True
+ *         await _send_error_status_from_server(
+ */
+  __pyx_t_7 = (__pyx_cur_scope->__pyx_v_method_handler == Py_None);
+  if (__pyx_t_7) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":796
+ *     )
+ *     if method_handler is None:
+ *         rpc_state.status_sent = True             # <<<<<<<<<<<<<<
+ *         await _send_error_status_from_server(
+ *             rpc_state,
+ */
+    __pyx_cur_scope->__pyx_v_rpc_state->status_sent = 1;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":797
+ *     if method_handler is None:
+ *         rpc_state.status_sent = True
+ *         await _send_error_status_from_server(             # <<<<<<<<<<<<<<
+ *             rpc_state,
+ *             StatusCode.unimplemented,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_send_error_status_from_server); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 797, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":799
+ *         await _send_error_status_from_server(
+ *             rpc_state,
+ *             StatusCode.unimplemented,             # <<<<<<<<<<<<<<
+ *             'Method not found!',
+ *             _IMMUTABLE_EMPTY_METADATA,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 799, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_unimplemented); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 799, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":801
+ *             StatusCode.unimplemented,
+ *             'Method not found!',
+ *             _IMMUTABLE_EMPTY_METADATA,             # <<<<<<<<<<<<<<
+ *             rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *             loop
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 801, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":802
+ *             'Method not found!',
+ *             _IMMUTABLE_EMPTY_METADATA,
+ *             rpc_state.create_send_initial_metadata_op_if_not_sent(),             # <<<<<<<<<<<<<<
+ *             loop
+ *         )
+ */
+    __pyx_t_5 = ((PyObject *)((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->create_send_initial_metadata_op_if_not_sent(__pyx_cur_scope->__pyx_v_rpc_state)); if (unlikely(!__pyx_t_5)) __PYX_ERR(9, 802, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":803
+ *             _IMMUTABLE_EMPTY_METADATA,
+ *             rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *             loop             # <<<<<<<<<<<<<<
+ *         )
+ *         return
+ */
+    __pyx_t_8 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_8)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_8);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[7] = {__pyx_t_8, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_t_4, __pyx_kp_s_Method_not_found, __pyx_t_3, __pyx_t_5, __pyx_cur_scope->__pyx_v_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 6+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 797, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 2;
+      return __pyx_r;
+      __pyx_L6_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 797, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 797, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":805
+ *             loop
+ *         )
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     if concurrency_exceeded:
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":795
+ *         interceptors,
+ *     )
+ *     if method_handler is None:             # <<<<<<<<<<<<<<
+ *         rpc_state.status_sent = True
+ *         await _send_error_status_from_server(
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":807
+ *         return
+ * 
+ *     if concurrency_exceeded:             # <<<<<<<<<<<<<<
+ *         rpc_state.status_sent = True
+ *         await _send_error_status_from_server(
+ */
+  if (__pyx_cur_scope->__pyx_v_concurrency_exceeded) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":808
+ * 
+ *     if concurrency_exceeded:
+ *         rpc_state.status_sent = True             # <<<<<<<<<<<<<<
+ *         await _send_error_status_from_server(
+ *             rpc_state,
+ */
+    __pyx_cur_scope->__pyx_v_rpc_state->status_sent = 1;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":809
+ *     if concurrency_exceeded:
+ *         rpc_state.status_sent = True
+ *         await _send_error_status_from_server(             # <<<<<<<<<<<<<<
+ *             rpc_state,
+ *             StatusCode.resource_exhausted,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_send_error_status_from_server); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 809, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":811
+ *         await _send_error_status_from_server(
+ *             rpc_state,
+ *             StatusCode.resource_exhausted,             # <<<<<<<<<<<<<<
+ *             'Concurrent RPC limit exceeded!',
+ *             _IMMUTABLE_EMPTY_METADATA,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_StatusCode); if (unlikely(!__pyx_t_5)) __PYX_ERR(9, 811, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_resource_exhausted); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 811, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":813
+ *             StatusCode.resource_exhausted,
+ *             'Concurrent RPC limit exceeded!',
+ *             _IMMUTABLE_EMPTY_METADATA,             # <<<<<<<<<<<<<<
+ *             rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *             loop
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_5)) __PYX_ERR(9, 813, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":814
+ *             'Concurrent RPC limit exceeded!',
+ *             _IMMUTABLE_EMPTY_METADATA,
+ *             rpc_state.create_send_initial_metadata_op_if_not_sent(),             # <<<<<<<<<<<<<<
+ *             loop
+ *         )
+ */
+    __pyx_t_4 = ((PyObject *)((struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState *)__pyx_cur_scope->__pyx_v_rpc_state->__pyx_vtab)->create_send_initial_metadata_op_if_not_sent(__pyx_cur_scope->__pyx_v_rpc_state)); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 814, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":815
+ *             _IMMUTABLE_EMPTY_METADATA,
+ *             rpc_state.create_send_initial_metadata_op_if_not_sent(),
+ *             loop             # <<<<<<<<<<<<<<
+ *         )
+ *         return
+ */
+    __pyx_t_8 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_8)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_8);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[7] = {__pyx_t_8, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_t_3, __pyx_kp_s_Concurrent_RPC_limit_exceeded, __pyx_t_5, __pyx_t_4, __pyx_cur_scope->__pyx_v_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 6+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 809, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 3;
+      return __pyx_r;
+      __pyx_L8_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 809, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 809, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":817
+ *             loop
+ *         )
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     # Handles unary-unary case
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":807
+ *         return
+ * 
+ *     if concurrency_exceeded:             # <<<<<<<<<<<<<<
+ *         rpc_state.status_sent = True
+ *         await _send_error_status_from_server(
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":820
+ * 
+ *     # Handles unary-unary case
+ *     if not method_handler.request_streaming and not method_handler.response_streaming:             # <<<<<<<<<<<<<<
+ *         await _handle_unary_unary_rpc(method_handler,
+ *                                       rpc_state,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_streaming); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 820, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(9, 820, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_10 = (!__pyx_t_9);
+  if (__pyx_t_10) {
+  } else {
+    __pyx_t_7 = __pyx_t_10;
+    goto __pyx_L10_bool_binop_done;
+  }
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_response_streaming); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 820, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(9, 820, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_9 = (!__pyx_t_10);
+  __pyx_t_7 = __pyx_t_9;
+  __pyx_L10_bool_binop_done:;
+  if (__pyx_t_7) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":821
+ *     # Handles unary-unary case
+ *     if not method_handler.request_streaming and not method_handler.response_streaming:
+ *         await _handle_unary_unary_rpc(method_handler,             # <<<<<<<<<<<<<<
+ *                                       rpc_state,
+ *                                       loop)
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_handle_unary_unary_rpc); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 821, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":823
+ *         await _handle_unary_unary_rpc(method_handler,
+ *                                       rpc_state,
+ *                                       loop)             # <<<<<<<<<<<<<<
+ *         return
+ * 
+ */
+    __pyx_t_4 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_cur_scope->__pyx_v_method_handler, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 821, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 4;
+      return __pyx_r;
+      __pyx_L12_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 821, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 821, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":824
+ *                                       rpc_state,
+ *                                       loop)
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     # Handles unary-stream case
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":820
+ * 
+ *     # Handles unary-unary case
+ *     if not method_handler.request_streaming and not method_handler.response_streaming:             # <<<<<<<<<<<<<<
+ *         await _handle_unary_unary_rpc(method_handler,
+ *                                       rpc_state,
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":827
+ * 
+ *     # Handles unary-stream case
+ *     if not method_handler.request_streaming and method_handler.response_streaming:             # <<<<<<<<<<<<<<
+ *         await _handle_unary_stream_rpc(method_handler,
+ *                                        rpc_state,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_streaming); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 827, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(9, 827, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_10 = (!__pyx_t_9);
+  if (__pyx_t_10) {
+  } else {
+    __pyx_t_7 = __pyx_t_10;
+    goto __pyx_L14_bool_binop_done;
+  }
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_response_streaming); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 827, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(9, 827, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_7 = __pyx_t_10;
+  __pyx_L14_bool_binop_done:;
+  if (__pyx_t_7) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":828
+ *     # Handles unary-stream case
+ *     if not method_handler.request_streaming and method_handler.response_streaming:
+ *         await _handle_unary_stream_rpc(method_handler,             # <<<<<<<<<<<<<<
+ *                                        rpc_state,
+ *                                        loop)
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_handle_unary_stream_rpc); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 828, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":830
+ *         await _handle_unary_stream_rpc(method_handler,
+ *                                        rpc_state,
+ *                                        loop)             # <<<<<<<<<<<<<<
+ *         return
+ * 
+ */
+    __pyx_t_4 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_cur_scope->__pyx_v_method_handler, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 828, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 5;
+      return __pyx_r;
+      __pyx_L16_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 828, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 828, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":831
+ *                                        rpc_state,
+ *                                        loop)
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     # Handles stream-unary case
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":827
+ * 
+ *     # Handles unary-stream case
+ *     if not method_handler.request_streaming and method_handler.response_streaming:             # <<<<<<<<<<<<<<
+ *         await _handle_unary_stream_rpc(method_handler,
+ *                                        rpc_state,
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":834
+ * 
+ *     # Handles stream-unary case
+ *     if method_handler.request_streaming and not method_handler.response_streaming:             # <<<<<<<<<<<<<<
+ *         await _handle_stream_unary_rpc(method_handler,
+ *                                        rpc_state,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_streaming); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 834, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(9, 834, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_10) {
+  } else {
+    __pyx_t_7 = __pyx_t_10;
+    goto __pyx_L18_bool_binop_done;
+  }
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_response_streaming); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 834, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_10 < 0))) __PYX_ERR(9, 834, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_9 = (!__pyx_t_10);
+  __pyx_t_7 = __pyx_t_9;
+  __pyx_L18_bool_binop_done:;
+  if (__pyx_t_7) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":835
+ *     # Handles stream-unary case
+ *     if method_handler.request_streaming and not method_handler.response_streaming:
+ *         await _handle_stream_unary_rpc(method_handler,             # <<<<<<<<<<<<<<
+ *                                        rpc_state,
+ *                                        loop)
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_handle_stream_unary_rpc); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 835, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":837
+ *         await _handle_stream_unary_rpc(method_handler,
+ *                                        rpc_state,
+ *                                        loop)             # <<<<<<<<<<<<<<
+ *         return
+ * 
+ */
+    __pyx_t_4 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_cur_scope->__pyx_v_method_handler, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 835, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 6;
+      return __pyx_r;
+      __pyx_L20_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 835, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 835, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":838
+ *                                        rpc_state,
+ *                                        loop)
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ *     # Handles stream-stream case
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":834
+ * 
+ *     # Handles stream-unary case
+ *     if method_handler.request_streaming and not method_handler.response_streaming:             # <<<<<<<<<<<<<<
+ *         await _handle_stream_unary_rpc(method_handler,
+ *                                        rpc_state,
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":841
+ * 
+ *     # Handles stream-stream case
+ *     if method_handler.request_streaming and method_handler.response_streaming:             # <<<<<<<<<<<<<<
+ *         await _handle_stream_stream_rpc(method_handler,
+ *                                         rpc_state,
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_request_streaming); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 841, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(9, 841, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_9) {
+  } else {
+    __pyx_t_7 = __pyx_t_9;
+    goto __pyx_L22_bool_binop_done;
+  }
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_method_handler, __pyx_n_s_response_streaming); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 841, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(9, 841, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_7 = __pyx_t_9;
+  __pyx_L22_bool_binop_done:;
+  if (__pyx_t_7) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":842
+ *     # Handles stream-stream case
+ *     if method_handler.request_streaming and method_handler.response_streaming:
+ *         await _handle_stream_stream_rpc(method_handler,             # <<<<<<<<<<<<<<
+ *                                         rpc_state,
+ *                                         loop)
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_handle_stream_stream_rpc); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 842, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":844
+ *         await _handle_stream_stream_rpc(method_handler,
+ *                                         rpc_state,
+ *                                         loop)             # <<<<<<<<<<<<<<
+ *         return
+ * 
+ */
+    __pyx_t_4 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_2))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_2, function);
+        __pyx_t_6 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_cur_scope->__pyx_v_method_handler, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 842, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 7;
+      return __pyx_r;
+      __pyx_L24_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 842, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 842, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":845
+ *                                         rpc_state,
+ *                                         loop)
+ *         return             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":841
+ * 
+ *     # Handles stream-stream case
+ *     if method_handler.request_streaming and method_handler.response_streaming:             # <<<<<<<<<<<<<<
+ *         await _handle_stream_stream_rpc(method_handler,
+ *                                         rpc_state,
+ */
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":785
+ * 
+ * 
+ * async def _handle_rpc(list generic_handlers, tuple interceptors,             # <<<<<<<<<<<<<<
+ *                       RPCState rpc_state, object loop, bint concurrency_exceeded):
+ *     cdef object method_handler
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __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_8);
+  __Pyx_AddTraceback("_handle_rpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":862
+ * cdef class _ConcurrentRpcLimiter:
+ * 
+ *     def __cinit__(self, int maximum_concurrent_rpcs):             # <<<<<<<<<<<<<<
+ *         if maximum_concurrent_rpcs <= 0:
+ *             raise ValueError("maximum_concurrent_rpcs should be a postive integer")
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_v_maximum_concurrent_rpcs;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_maximum_concurrent_rpcs,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_maximum_concurrent_rpcs)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 862, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(9, 862, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+    }
+    __pyx_v_maximum_concurrent_rpcs = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_maximum_concurrent_rpcs == (int)-1) && PyErr_Occurred())) __PYX_ERR(9, 862, __pyx_L3_error)
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 862, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ConcurrentRpcLimiter.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter___cinit__(((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)__pyx_v_self), __pyx_v_maximum_concurrent_rpcs);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter___cinit__(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self, int __pyx_v_maximum_concurrent_rpcs) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":863
+ * 
+ *     def __cinit__(self, int maximum_concurrent_rpcs):
+ *         if maximum_concurrent_rpcs <= 0:             # <<<<<<<<<<<<<<
+ *             raise ValueError("maximum_concurrent_rpcs should be a postive integer")
+ *         self._maximum_concurrent_rpcs = maximum_concurrent_rpcs
+ */
+  __pyx_t_1 = (__pyx_v_maximum_concurrent_rpcs <= 0);
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":864
+ *     def __cinit__(self, int maximum_concurrent_rpcs):
+ *         if maximum_concurrent_rpcs <= 0:
+ *             raise ValueError("maximum_concurrent_rpcs should be a postive integer")             # <<<<<<<<<<<<<<
+ *         self._maximum_concurrent_rpcs = maximum_concurrent_rpcs
+ *         self._active_rpcs = 0
+ */
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__98, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 864, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(9, 864, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":863
+ * 
+ *     def __cinit__(self, int maximum_concurrent_rpcs):
+ *         if maximum_concurrent_rpcs <= 0:             # <<<<<<<<<<<<<<
+ *             raise ValueError("maximum_concurrent_rpcs should be a postive integer")
+ *         self._maximum_concurrent_rpcs = maximum_concurrent_rpcs
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":865
+ *         if maximum_concurrent_rpcs <= 0:
+ *             raise ValueError("maximum_concurrent_rpcs should be a postive integer")
+ *         self._maximum_concurrent_rpcs = maximum_concurrent_rpcs             # <<<<<<<<<<<<<<
+ *         self._active_rpcs = 0
+ *         self.limiter_concurrency_exceeded = False
+ */
+  __pyx_v_self->_maximum_concurrent_rpcs = __pyx_v_maximum_concurrent_rpcs;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":866
+ *             raise ValueError("maximum_concurrent_rpcs should be a postive integer")
+ *         self._maximum_concurrent_rpcs = maximum_concurrent_rpcs
+ *         self._active_rpcs = 0             # <<<<<<<<<<<<<<
+ *         self.limiter_concurrency_exceeded = False
+ * 
+ */
+  __pyx_v_self->_active_rpcs = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":867
+ *         self._maximum_concurrent_rpcs = maximum_concurrent_rpcs
+ *         self._active_rpcs = 0
+ *         self.limiter_concurrency_exceeded = False             # <<<<<<<<<<<<<<
+ * 
+ *     def check_before_request_call(self):
+ */
+  __pyx_v_self->limiter_concurrency_exceeded = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":862
+ * cdef class _ConcurrentRpcLimiter:
+ * 
+ *     def __cinit__(self, int maximum_concurrent_rpcs):             # <<<<<<<<<<<<<<
+ *         if maximum_concurrent_rpcs <= 0:
+ *             raise ValueError("maximum_concurrent_rpcs should be a postive integer")
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_cython.cygrpc._ConcurrentRpcLimiter.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":869
+ *         self.limiter_concurrency_exceeded = False
+ * 
+ *     def check_before_request_call(self):             # <<<<<<<<<<<<<<
+ *         if self._active_rpcs >= self._maximum_concurrent_rpcs:
+ *             self.limiter_concurrency_exceeded = True
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_3check_before_request_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_3check_before_request_call = {"check_before_request_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_3check_before_request_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_3check_before_request_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("check_before_request_call (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("check_before_request_call", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "check_before_request_call", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_2check_before_request_call(((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_2check_before_request_call(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("check_before_request_call", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":870
+ * 
+ *     def check_before_request_call(self):
+ *         if self._active_rpcs >= self._maximum_concurrent_rpcs:             # <<<<<<<<<<<<<<
+ *             self.limiter_concurrency_exceeded = True
+ *         else:
+ */
+  __pyx_t_1 = (__pyx_v_self->_active_rpcs >= __pyx_v_self->_maximum_concurrent_rpcs);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":871
+ *     def check_before_request_call(self):
+ *         if self._active_rpcs >= self._maximum_concurrent_rpcs:
+ *             self.limiter_concurrency_exceeded = True             # <<<<<<<<<<<<<<
+ *         else:
+ *             self._active_rpcs += 1
+ */
+    __pyx_v_self->limiter_concurrency_exceeded = 1;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":870
+ * 
+ *     def check_before_request_call(self):
+ *         if self._active_rpcs >= self._maximum_concurrent_rpcs:             # <<<<<<<<<<<<<<
+ *             self.limiter_concurrency_exceeded = True
+ *         else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":873
+ *             self.limiter_concurrency_exceeded = True
+ *         else:
+ *             self._active_rpcs += 1             # <<<<<<<<<<<<<<
+ * 
+ *     def _decrease_active_rpcs_count(self, unused_future):
+ */
+  /*else*/ {
+    __pyx_v_self->_active_rpcs = (__pyx_v_self->_active_rpcs + 1);
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":869
+ *         self.limiter_concurrency_exceeded = False
+ * 
+ *     def check_before_request_call(self):             # <<<<<<<<<<<<<<
+ *         if self._active_rpcs >= self._maximum_concurrent_rpcs:
+ *             self.limiter_concurrency_exceeded = True
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":875
+ *             self._active_rpcs += 1
+ * 
+ *     def _decrease_active_rpcs_count(self, unused_future):             # <<<<<<<<<<<<<<
+ *         self._active_rpcs -= 1
+ *         if self._active_rpcs < self._maximum_concurrent_rpcs:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_5_decrease_active_rpcs_count(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_5_decrease_active_rpcs_count = {"_decrease_active_rpcs_count", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_5_decrease_active_rpcs_count, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_5_decrease_active_rpcs_count(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v_unused_future = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_decrease_active_rpcs_count (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_unused_future,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_unused_future)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 875, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_decrease_active_rpcs_count") < 0)) __PYX_ERR(9, 875, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_unused_future = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_decrease_active_rpcs_count", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 875, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ConcurrentRpcLimiter._decrease_active_rpcs_count", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_4_decrease_active_rpcs_count(((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)__pyx_v_self), __pyx_v_unused_future);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_4_decrease_active_rpcs_count(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_unused_future) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("_decrease_active_rpcs_count", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":876
+ * 
+ *     def _decrease_active_rpcs_count(self, unused_future):
+ *         self._active_rpcs -= 1             # <<<<<<<<<<<<<<
+ *         if self._active_rpcs < self._maximum_concurrent_rpcs:
+ *             self.limiter_concurrency_exceeded = False
+ */
+  __pyx_v_self->_active_rpcs = (__pyx_v_self->_active_rpcs - 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":877
+ *     def _decrease_active_rpcs_count(self, unused_future):
+ *         self._active_rpcs -= 1
+ *         if self._active_rpcs < self._maximum_concurrent_rpcs:             # <<<<<<<<<<<<<<
+ *             self.limiter_concurrency_exceeded = False
+ * 
+ */
+  __pyx_t_1 = (__pyx_v_self->_active_rpcs < __pyx_v_self->_maximum_concurrent_rpcs);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":878
+ *         self._active_rpcs -= 1
+ *         if self._active_rpcs < self._maximum_concurrent_rpcs:
+ *             self.limiter_concurrency_exceeded = False             # <<<<<<<<<<<<<<
+ * 
+ *     def decrease_once_finished(self, object rpc_task):
+ */
+    __pyx_v_self->limiter_concurrency_exceeded = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":877
+ *     def _decrease_active_rpcs_count(self, unused_future):
+ *         self._active_rpcs -= 1
+ *         if self._active_rpcs < self._maximum_concurrent_rpcs:             # <<<<<<<<<<<<<<
+ *             self.limiter_concurrency_exceeded = False
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":875
+ *             self._active_rpcs += 1
+ * 
+ *     def _decrease_active_rpcs_count(self, unused_future):             # <<<<<<<<<<<<<<
+ *         self._active_rpcs -= 1
+ *         if self._active_rpcs < self._maximum_concurrent_rpcs:
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":880
+ *             self.limiter_concurrency_exceeded = False
+ * 
+ *     def decrease_once_finished(self, object rpc_task):             # <<<<<<<<<<<<<<
+ *         rpc_task.add_done_callback(self._decrease_active_rpcs_count)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_7decrease_once_finished(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_7decrease_once_finished = {"decrease_once_finished", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_7decrease_once_finished, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_7decrease_once_finished(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_rpc_task = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("decrease_once_finished (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rpc_task,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rpc_task)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 880, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "decrease_once_finished") < 0)) __PYX_ERR(9, 880, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_rpc_task = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("decrease_once_finished", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 880, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ConcurrentRpcLimiter.decrease_once_finished", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_6decrease_once_finished(((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)__pyx_v_self), __pyx_v_rpc_task);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_6decrease_once_finished(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self, PyObject *__pyx_v_rpc_task) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("decrease_once_finished", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":881
+ * 
+ *     def decrease_once_finished(self, object rpc_task):
+ *         rpc_task.add_done_callback(self._decrease_active_rpcs_count)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_rpc_task, __pyx_n_s_add_done_callback); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 881, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_decrease_active_rpcs_count); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 881, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_3};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 881, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":880
+ *             self.limiter_concurrency_exceeded = False
+ * 
+ *     def decrease_once_finished(self, object rpc_task):             # <<<<<<<<<<<<<<
+ *         rpc_task.add_done_callback(self._decrease_active_rpcs_count)
+ * 
+ */
+
+  /* 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_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc._ConcurrentRpcLimiter.decrease_once_finished", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_9__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_9__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_9__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_9__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_8__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_8__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":2
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 2, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ConcurrentRpcLimiter.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_11__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_11__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_11__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_11__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 3, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 3, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 3, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc._ConcurrentRpcLimiter.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_10__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_21_ConcurrentRpcLimiter_10__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__setstate_cython__", 1);
+
+  /* "(tree fragment)":4
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"             # <<<<<<<<<<<<<<
+ */
+  __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0);
+  __PYX_ERR(10, 4, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc._ConcurrentRpcLimiter.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":886
+ * cdef class AioServer:
+ * 
+ *     def __init__(self, loop, thread_pool, generic_handlers, interceptors,             # <<<<<<<<<<<<<<
+ *                  options, maximum_concurrent_rpcs):
+ *         init_grpc_aio()
+ */
+
+/* Python wrapper */
+static int __pyx_pw_7_cython_6cygrpc_9AioServer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_7_cython_6cygrpc_9AioServer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_loop = 0;
+  PyObject *__pyx_v_thread_pool = 0;
+  PyObject *__pyx_v_generic_handlers = 0;
+  PyObject *__pyx_v_interceptors = 0;
+  PyObject *__pyx_v_options = 0;
+  PyObject *__pyx_v_maximum_concurrent_rpcs = 0;
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[6] = {0,0,0,0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_loop,&__pyx_n_s_thread_pool,&__pyx_n_s_generic_handlers,&__pyx_n_s_interceptors,&__pyx_n_s_options,&__pyx_n_s_maximum_concurrent_rpcs,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5);
+        CYTHON_FALLTHROUGH;
+        case  5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 886, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_thread_pool)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 886, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 1); __PYX_ERR(9, 886, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_generic_handlers)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 886, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 2); __PYX_ERR(9, 886, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_interceptors)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[3]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 886, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 3); __PYX_ERR(9, 886, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_options)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[4]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 886, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 4); __PYX_ERR(9, 886, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  5:
+        if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_maximum_concurrent_rpcs)) != 0)) {
+          (void)__Pyx_Arg_NewRef_VARARGS(values[5]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 886, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 5); __PYX_ERR(9, 886, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(9, 886, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 6)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
+      values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1);
+      values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2);
+      values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3);
+      values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4);
+      values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5);
+    }
+    __pyx_v_loop = values[0];
+    __pyx_v_thread_pool = values[1];
+    __pyx_v_generic_handlers = values[2];
+    __pyx_v_interceptors = values[3];
+    __pyx_v_options = values[4];
+    __pyx_v_maximum_concurrent_rpcs = values[5];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, __pyx_nargs); __PYX_ERR(9, 886, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer___init__(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v_loop, __pyx_v_thread_pool, __pyx_v_generic_handlers, __pyx_v_interceptors, __pyx_v_options, __pyx_v_maximum_concurrent_rpcs);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_7_cython_6cygrpc_9AioServer___init__(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_loop, PyObject *__pyx_v_thread_pool, PyObject *__pyx_v_generic_handlers, PyObject *__pyx_v_interceptors, PyObject *__pyx_v_options, PyObject *__pyx_v_maximum_concurrent_rpcs) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  grpc_completion_queue *__pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__init__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":888
+ *     def __init__(self, loop, thread_pool, generic_handlers, interceptors,
+ *                  options, maximum_concurrent_rpcs):
+ *         init_grpc_aio()             # <<<<<<<<<<<<<<
+ *         # NOTE(lidiz) Core objects won't be deallocated automatically.
+ *         # If AioServer.shutdown is not called, those objects will leak.
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_init_grpc_aio(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 888, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":892
+ *         # If AioServer.shutdown is not called, those objects will leak.
+ *         # TODO(rbellevi): Support xDS in aio server.
+ *         self._server = Server(options, False)             # <<<<<<<<<<<<<<
+ *         grpc_server_register_completion_queue(
+ *             self._server.c_server,
+ */
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 892, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_v_options);
+  __Pyx_GIVEREF(__pyx_v_options);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_options)) __PYX_ERR(9, 892, __pyx_L1_error);
+  __Pyx_INCREF(Py_False);
+  __Pyx_GIVEREF(Py_False);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, Py_False)) __PYX_ERR(9, 892, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_Server), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 892, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_server);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_server);
+  __pyx_v_self->_server = ((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":895
+ *         grpc_server_register_completion_queue(
+ *             self._server.c_server,
+ *             global_completion_queue(),             # <<<<<<<<<<<<<<
+ *             NULL
+ *         )
+ */
+  __pyx_t_3 = __pyx_f_7_cython_6cygrpc_global_completion_queue(); if (unlikely(__pyx_t_3 == ((grpc_completion_queue *)NULL) && PyErr_Occurred())) __PYX_ERR(9, 895, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":893
+ *         # TODO(rbellevi): Support xDS in aio server.
+ *         self._server = Server(options, False)
+ *         grpc_server_register_completion_queue(             # <<<<<<<<<<<<<<
+ *             self._server.c_server,
+ *             global_completion_queue(),
+ */
+  grpc_server_register_completion_queue(__pyx_v_self->_server->c_server, __pyx_t_3, NULL);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":899
+ *         )
+ * 
+ *         self._loop = loop             # <<<<<<<<<<<<<<
+ *         self._status = AIO_SERVER_STATUS_READY
+ *         self._generic_handlers = []
+ */
+  __Pyx_INCREF(__pyx_v_loop);
+  __Pyx_GIVEREF(__pyx_v_loop);
+  __Pyx_GOTREF(__pyx_v_self->_loop);
+  __Pyx_DECREF(__pyx_v_self->_loop);
+  __pyx_v_self->_loop = __pyx_v_loop;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":900
+ * 
+ *         self._loop = loop
+ *         self._status = AIO_SERVER_STATUS_READY             # <<<<<<<<<<<<<<
+ *         self._generic_handlers = []
+ *         self.add_generic_rpc_handlers(generic_handlers)
+ */
+  __pyx_v_self->_status = __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_READY;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":901
+ *         self._loop = loop
+ *         self._status = AIO_SERVER_STATUS_READY
+ *         self._generic_handlers = []             # <<<<<<<<<<<<<<
+ *         self.add_generic_rpc_handlers(generic_handlers)
+ *         self._serving_task = None
+ */
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 901, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->_generic_handlers);
+  __Pyx_DECREF(__pyx_v_self->_generic_handlers);
+  __pyx_v_self->_generic_handlers = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":902
+ *         self._status = AIO_SERVER_STATUS_READY
+ *         self._generic_handlers = []
+ *         self.add_generic_rpc_handlers(generic_handlers)             # <<<<<<<<<<<<<<
+ *         self._serving_task = None
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add_generic_rpc_handlers); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 902, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_1))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_1, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_generic_handlers};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 902, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":903
+ *         self._generic_handlers = []
+ *         self.add_generic_rpc_handlers(generic_handlers)
+ *         self._serving_task = None             # <<<<<<<<<<<<<<
+ * 
+ *         self._shutdown_lock = asyncio.Lock()
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->_serving_task);
+  __Pyx_DECREF(__pyx_v_self->_serving_task);
+  __pyx_v_self->_serving_task = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":905
+ *         self._serving_task = None
+ * 
+ *         self._shutdown_lock = asyncio.Lock()             # <<<<<<<<<<<<<<
+ *         self._shutdown_completed = self._loop.create_future()
+ *         self._shutdown_callback_wrapper = CallbackWrapper(
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 905, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Lock); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 905, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (unlikely(PyMethod_Check(__pyx_t_4))) {
+    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+    if (likely(__pyx_t_1)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_4, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 905, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->_shutdown_lock);
+  __Pyx_DECREF(__pyx_v_self->_shutdown_lock);
+  __pyx_v_self->_shutdown_lock = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":906
+ * 
+ *         self._shutdown_lock = asyncio.Lock()
+ *         self._shutdown_completed = self._loop.create_future()             # <<<<<<<<<<<<<<
+ *         self._shutdown_callback_wrapper = CallbackWrapper(
+ *             self._shutdown_completed,
+ */
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_loop, __pyx_n_s_create_future); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 906, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_1 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_4))) {
+    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
+    if (likely(__pyx_t_1)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_1);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_4, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 906, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->_shutdown_completed);
+  __Pyx_DECREF(__pyx_v_self->_shutdown_completed);
+  __pyx_v_self->_shutdown_completed = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":907
+ *         self._shutdown_lock = asyncio.Lock()
+ *         self._shutdown_completed = self._loop.create_future()
+ *         self._shutdown_callback_wrapper = CallbackWrapper(             # <<<<<<<<<<<<<<
+ *             self._shutdown_completed,
+ *             self._loop,
+ */
+  __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 907, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_self->_shutdown_completed);
+  __Pyx_GIVEREF(__pyx_v_self->_shutdown_completed);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->_shutdown_completed)) __PYX_ERR(9, 907, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_loop);
+  __Pyx_GIVEREF(__pyx_v_self->_loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->_loop)) __PYX_ERR(9, 907, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_7_cython_6cygrpc_SERVER_SHUTDOWN_FAILURE_HANDLER);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_7_cython_6cygrpc_SERVER_SHUTDOWN_FAILURE_HANDLER);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_7_cython_6cygrpc_SERVER_SHUTDOWN_FAILURE_HANDLER))) __PYX_ERR(9, 907, __pyx_L1_error);
+  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackWrapper), __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 907, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_4);
+  __Pyx_GOTREF((PyObject *)__pyx_v_self->_shutdown_callback_wrapper);
+  __Pyx_DECREF((PyObject *)__pyx_v_self->_shutdown_callback_wrapper);
+  __pyx_v_self->_shutdown_callback_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)__pyx_t_4);
+  __pyx_t_4 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":911
+ *             self._loop,
+ *             SERVER_SHUTDOWN_FAILURE_HANDLER)
+ *         self._crash_exception = None             # <<<<<<<<<<<<<<
+ * 
+ *         if interceptors:
+ */
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->_crash_exception);
+  __Pyx_DECREF(__pyx_v_self->_crash_exception);
+  __pyx_v_self->_crash_exception = Py_None;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":913
+ *         self._crash_exception = None
+ * 
+ *         if interceptors:             # <<<<<<<<<<<<<<
+ *             self._interceptors = tuple(interceptors)
+ *         else:
+ */
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_interceptors); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(9, 913, __pyx_L1_error)
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":914
+ * 
+ *         if interceptors:
+ *             self._interceptors = tuple(interceptors)             # <<<<<<<<<<<<<<
+ *         else:
+ *             self._interceptors = ()
+ */
+    __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_interceptors); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 914, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_4);
+    __Pyx_GOTREF(__pyx_v_self->_interceptors);
+    __Pyx_DECREF(__pyx_v_self->_interceptors);
+    __pyx_v_self->_interceptors = ((PyObject*)__pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":913
+ *         self._crash_exception = None
+ * 
+ *         if interceptors:             # <<<<<<<<<<<<<<
+ *             self._interceptors = tuple(interceptors)
+ *         else:
+ */
+    goto __pyx_L3;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":916
+ *             self._interceptors = tuple(interceptors)
+ *         else:
+ *             self._interceptors = ()             # <<<<<<<<<<<<<<
+ * 
+ *         self._thread_pool = thread_pool
+ */
+  /*else*/ {
+    __Pyx_INCREF(__pyx_empty_tuple);
+    __Pyx_GIVEREF(__pyx_empty_tuple);
+    __Pyx_GOTREF(__pyx_v_self->_interceptors);
+    __Pyx_DECREF(__pyx_v_self->_interceptors);
+    __pyx_v_self->_interceptors = __pyx_empty_tuple;
+  }
+  __pyx_L3:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":918
+ *             self._interceptors = ()
+ * 
+ *         self._thread_pool = thread_pool             # <<<<<<<<<<<<<<
+ *         if maximum_concurrent_rpcs is not None:
+ *             self._limiter = _ConcurrentRpcLimiter(maximum_concurrent_rpcs)
+ */
+  __Pyx_INCREF(__pyx_v_thread_pool);
+  __Pyx_GIVEREF(__pyx_v_thread_pool);
+  __Pyx_GOTREF(__pyx_v_self->_thread_pool);
+  __Pyx_DECREF(__pyx_v_self->_thread_pool);
+  __pyx_v_self->_thread_pool = __pyx_v_thread_pool;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":919
+ * 
+ *         self._thread_pool = thread_pool
+ *         if maximum_concurrent_rpcs is not None:             # <<<<<<<<<<<<<<
+ *             self._limiter = _ConcurrentRpcLimiter(maximum_concurrent_rpcs)
+ * 
+ */
+  __pyx_t_6 = (__pyx_v_maximum_concurrent_rpcs != Py_None);
+  if (__pyx_t_6) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":920
+ *         self._thread_pool = thread_pool
+ *         if maximum_concurrent_rpcs is not None:
+ *             self._limiter = _ConcurrentRpcLimiter(maximum_concurrent_rpcs)             # <<<<<<<<<<<<<<
+ * 
+ *     def add_generic_rpc_handlers(self, object generic_rpc_handlers):
+ */
+    __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter), __pyx_v_maximum_concurrent_rpcs); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 920, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_4);
+    __Pyx_GOTREF((PyObject *)__pyx_v_self->_limiter);
+    __Pyx_DECREF((PyObject *)__pyx_v_self->_limiter);
+    __pyx_v_self->_limiter = ((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)__pyx_t_4);
+    __pyx_t_4 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":919
+ * 
+ *         self._thread_pool = thread_pool
+ *         if maximum_concurrent_rpcs is not None:             # <<<<<<<<<<<<<<
+ *             self._limiter = _ConcurrentRpcLimiter(maximum_concurrent_rpcs)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":886
+ * cdef class AioServer:
+ * 
+ *     def __init__(self, loop, thread_pool, generic_handlers, interceptors,             # <<<<<<<<<<<<<<
+ *                  options, maximum_concurrent_rpcs):
+ *         init_grpc_aio()
+ */
+
+  /* function exit code */
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":922
+ *             self._limiter = _ConcurrentRpcLimiter(maximum_concurrent_rpcs)
+ * 
+ *     def add_generic_rpc_handlers(self, object generic_rpc_handlers):             # <<<<<<<<<<<<<<
+ *         self._generic_handlers.extend(generic_rpc_handlers)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_3add_generic_rpc_handlers(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_3add_generic_rpc_handlers = {"add_generic_rpc_handlers", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_3add_generic_rpc_handlers, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_3add_generic_rpc_handlers(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_generic_rpc_handlers = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("add_generic_rpc_handlers (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_generic_rpc_handlers,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_generic_rpc_handlers)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 922, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_generic_rpc_handlers") < 0)) __PYX_ERR(9, 922, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_generic_rpc_handlers = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("add_generic_rpc_handlers", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 922, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.add_generic_rpc_handlers", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_2add_generic_rpc_handlers(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v_generic_rpc_handlers);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_2add_generic_rpc_handlers(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_generic_rpc_handlers) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("add_generic_rpc_handlers", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":923
+ * 
+ *     def add_generic_rpc_handlers(self, object generic_rpc_handlers):
+ *         self._generic_handlers.extend(generic_rpc_handlers)             # <<<<<<<<<<<<<<
+ * 
+ *     def add_insecure_port(self, address):
+ */
+  if (unlikely(__pyx_v_self->_generic_handlers == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "extend");
+    __PYX_ERR(9, 923, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_PyList_Extend(__pyx_v_self->_generic_handlers, __pyx_v_generic_rpc_handlers); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(9, 923, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":922
+ *             self._limiter = _ConcurrentRpcLimiter(maximum_concurrent_rpcs)
+ * 
+ *     def add_generic_rpc_handlers(self, object generic_rpc_handlers):             # <<<<<<<<<<<<<<
+ *         self._generic_handlers.extend(generic_rpc_handlers)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.add_generic_rpc_handlers", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":925
+ *         self._generic_handlers.extend(generic_rpc_handlers)
+ * 
+ *     def add_insecure_port(self, address):             # <<<<<<<<<<<<<<
+ *         return self._server.add_http2_port(address)
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_5add_insecure_port(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_5add_insecure_port = {"add_insecure_port", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_5add_insecure_port, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_5add_insecure_port(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_address = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("add_insecure_port (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_address,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_address)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 925, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_insecure_port") < 0)) __PYX_ERR(9, 925, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_address = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("add_insecure_port", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 925, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.add_insecure_port", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_4add_insecure_port(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v_address);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_4add_insecure_port(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_address) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  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("add_insecure_port", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":926
+ * 
+ *     def add_insecure_port(self, address):
+ *         return self._server.add_http2_port(address)             # <<<<<<<<<<<<<<
+ * 
+ *     def add_secure_port(self, address, server_credentials):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_server), __pyx_n_s_add_http2_port); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 926, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_address};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 926, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":925
+ *         self._generic_handlers.extend(generic_rpc_handlers)
+ * 
+ *     def add_insecure_port(self, address):             # <<<<<<<<<<<<<<
+ *         return self._server.add_http2_port(address)
+ * 
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.add_insecure_port", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":928
+ *         return self._server.add_http2_port(address)
+ * 
+ *     def add_secure_port(self, address, server_credentials):             # <<<<<<<<<<<<<<
+ *         return self._server.add_http2_port(address,
+ *                                            server_credentials._credentials)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_7add_secure_port(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_7add_secure_port = {"add_secure_port", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_7add_secure_port, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_7add_secure_port(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_address = 0;
+  PyObject *__pyx_v_server_credentials = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[2] = {0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("add_secure_port (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_address,&__pyx_n_s_server_credentials,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_address)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 928, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_server_credentials)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 928, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("add_secure_port", 1, 2, 2, 1); __PYX_ERR(9, 928, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_secure_port") < 0)) __PYX_ERR(9, 928, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 2)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+    }
+    __pyx_v_address = values[0];
+    __pyx_v_server_credentials = values[1];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("add_secure_port", 1, 2, 2, __pyx_nargs); __PYX_ERR(9, 928, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.add_secure_port", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_6add_secure_port(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v_address, __pyx_v_server_credentials);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_6add_secure_port(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_address, PyObject *__pyx_v_server_credentials) {
+  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;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("add_secure_port", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":929
+ * 
+ *     def add_secure_port(self, address, server_credentials):
+ *         return self._server.add_http2_port(address,             # <<<<<<<<<<<<<<
+ *                                            server_credentials._credentials)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->_server), __pyx_n_s_add_http2_port); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 929, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":930
+ *     def add_secure_port(self, address, server_credentials):
+ *         return self._server.add_http2_port(address,
+ *                                            server_credentials._credentials)             # <<<<<<<<<<<<<<
+ * 
+ *     async def _request_call(self):
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_server_credentials, __pyx_n_s_credentials_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 930, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_v_address, __pyx_t_3};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 929, __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;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":928
+ *         return self._server.add_http2_port(address)
+ * 
+ *     def add_secure_port(self, address, server_credentials):             # <<<<<<<<<<<<<<
+ *         return self._server.add_http2_port(address,
+ *                                            server_credentials._credentials)
+ */
+
+  /* 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("_cython.cygrpc.AioServer.add_secure_port", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_9AioServer_10generator38(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":932
+ *                                            server_credentials._credentials)
+ * 
+ *     async def _request_call(self):             # <<<<<<<<<<<<<<
+ *         cdef grpc_call_error error
+ *         cdef RPCState rpc_state = RPCState(self)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_9_request_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_9_request_call = {"_request_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_9_request_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_9_request_call(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_request_call (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("_request_call", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_request_call", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_8_request_call(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_8_request_call(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_request_call", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_49__request_call(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 932, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_9AioServer_10generator38, __pyx_codeobj__99, (PyObject *) __pyx_cur_scope, __pyx_n_s_request_call, __pyx_n_s_AioServer__request_call, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 932, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer._request_call", __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_7_cython_6cygrpc_9AioServer_10generator38(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  grpc_completion_queue *__pyx_t_5;
+  grpc_completion_queue *__pyx_t_6;
+  grpc_completion_queue_functor *__pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_request_call", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 932, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":934
+ *     async def _request_call(self):
+ *         cdef grpc_call_error error
+ *         cdef RPCState rpc_state = RPCState(self)             # <<<<<<<<<<<<<<
+ *         cdef object future = self._loop.create_future()
+ *         cdef CallbackWrapper wrapper = CallbackWrapper(
+ */
+  __pyx_t_1 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc_RPCState), ((PyObject *)__pyx_cur_scope->__pyx_v_self)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 934, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":935
+ *         cdef grpc_call_error error
+ *         cdef RPCState rpc_state = RPCState(self)
+ *         cdef object future = self._loop.create_future()             # <<<<<<<<<<<<<<
+ *         cdef CallbackWrapper wrapper = CallbackWrapper(
+ *             future,
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_loop, __pyx_n_s_create_future); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 935, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 935, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_future = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":936
+ *         cdef RPCState rpc_state = RPCState(self)
+ *         cdef object future = self._loop.create_future()
+ *         cdef CallbackWrapper wrapper = CallbackWrapper(             # <<<<<<<<<<<<<<
+ *             future,
+ *             self._loop,
+ */
+  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 936, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_future);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_future);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_v_future)) __PYX_ERR(9, 936, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->_loop);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->_loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_cur_scope->__pyx_v_self->_loop)) __PYX_ERR(9, 936, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_7_cython_6cygrpc_REQUEST_CALL_FAILURE_HANDLER);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_7_cython_6cygrpc_REQUEST_CALL_FAILURE_HANDLER);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_v_7_cython_6cygrpc_REQUEST_CALL_FAILURE_HANDLER))) __PYX_ERR(9, 936, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackWrapper), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 936, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":943
+ *             self._server.c_server, &rpc_state.call, &rpc_state.details,
+ *             &rpc_state.request_metadata,
+ *             global_completion_queue(), global_completion_queue(),             # <<<<<<<<<<<<<<
+ *             wrapper.c_functor()
+ *         )
+ */
+  __pyx_t_5 = __pyx_f_7_cython_6cygrpc_global_completion_queue(); if (unlikely(__pyx_t_5 == ((grpc_completion_queue *)NULL) && PyErr_Occurred())) __PYX_ERR(9, 943, __pyx_L1_error)
+  __pyx_t_6 = __pyx_f_7_cython_6cygrpc_global_completion_queue(); if (unlikely(__pyx_t_6 == ((grpc_completion_queue *)NULL) && PyErr_Occurred())) __PYX_ERR(9, 943, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":944
+ *             &rpc_state.request_metadata,
+ *             global_completion_queue(), global_completion_queue(),
+ *             wrapper.c_functor()             # <<<<<<<<<<<<<<
+ *         )
+ *         if error != GRPC_CALL_OK:
+ */
+  __pyx_t_7 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper *)__pyx_cur_scope->__pyx_v_wrapper->__pyx_vtab)->c_functor(__pyx_cur_scope->__pyx_v_wrapper); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 944, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":940
+ *             self._loop,
+ *             REQUEST_CALL_FAILURE_HANDLER)
+ *         error = grpc_server_request_call(             # <<<<<<<<<<<<<<
+ *             self._server.c_server, &rpc_state.call, &rpc_state.details,
+ *             &rpc_state.request_metadata,
+ */
+  __pyx_cur_scope->__pyx_v_error = grpc_server_request_call(__pyx_cur_scope->__pyx_v_self->_server->c_server, (&__pyx_cur_scope->__pyx_v_rpc_state->__pyx_base.call), (&__pyx_cur_scope->__pyx_v_rpc_state->details), (&__pyx_cur_scope->__pyx_v_rpc_state->request_metadata), __pyx_t_5, __pyx_t_6, __pyx_t_7);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":946
+ *             wrapper.c_functor()
+ *         )
+ *         if error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *             raise InternalError("Error in grpc_server_request_call: %s" % error)
+ * 
+ */
+  __pyx_t_8 = (__pyx_cur_scope->__pyx_v_error != GRPC_CALL_OK);
+  if (unlikely(__pyx_t_8)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":947
+ *         )
+ *         if error != GRPC_CALL_OK:
+ *             raise InternalError("Error in grpc_server_request_call: %s" % error)             # <<<<<<<<<<<<<<
+ * 
+ *         await future
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_InternalError); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 947, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyInt_From_grpc_call_error(__pyx_cur_scope->__pyx_v_error); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 947, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_9 = __Pyx_PyString_Format(__pyx_kp_s_Error_in_grpc_server_request_cal, __pyx_t_3); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 947, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_9};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 947, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    }
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(9, 947, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":946
+ *             wrapper.c_functor()
+ *         )
+ *         if error != GRPC_CALL_OK:             # <<<<<<<<<<<<<<
+ *             raise InternalError("Error in grpc_server_request_call: %s" % error)
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":949
+ *             raise InternalError("Error in grpc_server_request_call: %s" % error)
+ * 
+ *         await future             # <<<<<<<<<<<<<<
+ *         return rpc_state
+ * 
+ */
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_future);
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 949, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 949, __pyx_L1_error)
+    }
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":950
+ * 
+ *         await future
+ *         return rpc_state             # <<<<<<<<<<<<<<
+ * 
+ *     async def _server_main_loop(self,
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_r = NULL; __Pyx_ReturnWithStopIteration(((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state));
+  goto __pyx_L0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":932
+ *                                            server_credentials._credentials)
+ * 
+ *     async def _request_call(self):             # <<<<<<<<<<<<<<
+ *         cdef grpc_call_error error
+ *         cdef RPCState rpc_state = RPCState(self)
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("_request_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_9AioServer_13generator39(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":952
+ *         return rpc_state
+ * 
+ *     async def _server_main_loop(self,             # <<<<<<<<<<<<<<
+ *                                 object server_started):
+ *         self._server.start(backup_queue=False)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_12_server_main_loop(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_12_server_main_loop = {"_server_main_loop", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_12_server_main_loop, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_12_server_main_loop(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_server_started = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_server_main_loop (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_server_started,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_server_started)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 952, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_server_main_loop") < 0)) __PYX_ERR(9, 952, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_server_started = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_server_main_loop", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 952, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer._server_main_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_11_server_main_loop(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v_server_started);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_11_server_main_loop(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_server_started) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_server_main_loop", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 952, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_server_started = __pyx_v_server_started;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_server_started);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_server_started);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_9AioServer_13generator39, __pyx_codeobj__100, (PyObject *) __pyx_cur_scope, __pyx_n_s_server_main_loop, __pyx_n_s_AioServer__server_main_loop, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 952, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer._server_main_loop", __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_7_cython_6cygrpc_9AioServer_13generator39(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_server_main_loop", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L8_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 952, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":954
+ *     async def _server_main_loop(self,
+ *                                 object server_started):
+ *         self._server.start(backup_queue=False)             # <<<<<<<<<<<<<<
+ *         cdef RPCState rpc_state
+ *         server_started.set_result(True)
+ */
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self->_server), __pyx_n_s_start); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 954, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 954, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_backup_queue, Py_False) < 0) __PYX_ERR(9, 954, __pyx_L1_error)
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 954, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":956
+ *         self._server.start(backup_queue=False)
+ *         cdef RPCState rpc_state
+ *         server_started.set_result(True)             # <<<<<<<<<<<<<<
+ * 
+ *         while True:
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_server_started, __pyx_n_s_set_result); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 956, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_1, Py_True};
+    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 956, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":958
+ *         server_started.set_result(True)
+ * 
+ *         while True:             # <<<<<<<<<<<<<<
+ *             # When shutdown begins, no more new connections.
+ *             if self._status != AIO_SERVER_STATUS_RUNNING:
+ */
+  while (1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":960
+ *         while True:
+ *             # When shutdown begins, no more new connections.
+ *             if self._status != AIO_SERVER_STATUS_RUNNING:             # <<<<<<<<<<<<<<
+ *                 break
+ * 
+ */
+    __pyx_t_5 = (__pyx_cur_scope->__pyx_v_self->_status != __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_RUNNING);
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":961
+ *             # When shutdown begins, no more new connections.
+ *             if self._status != AIO_SERVER_STATUS_RUNNING:
+ *                 break             # <<<<<<<<<<<<<<
+ * 
+ *             concurrency_exceeded = False
+ */
+      goto __pyx_L5_break;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":960
+ *         while True:
+ *             # When shutdown begins, no more new connections.
+ *             if self._status != AIO_SERVER_STATUS_RUNNING:             # <<<<<<<<<<<<<<
+ *                 break
+ * 
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":963
+ *                 break
+ * 
+ *             concurrency_exceeded = False             # <<<<<<<<<<<<<<
+ *             if self._limiter is not None:
+ *                 self._limiter.check_before_request_call()
+ */
+    __pyx_cur_scope->__pyx_v_concurrency_exceeded = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":964
+ * 
+ *             concurrency_exceeded = False
+ *             if self._limiter is not None:             # <<<<<<<<<<<<<<
+ *                 self._limiter.check_before_request_call()
+ *                 concurrency_exceeded = self._limiter.limiter_concurrency_exceeded
+ */
+    __pyx_t_5 = (((PyObject *)__pyx_cur_scope->__pyx_v_self->_limiter) != Py_None);
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":965
+ *             concurrency_exceeded = False
+ *             if self._limiter is not None:
+ *                 self._limiter.check_before_request_call()             # <<<<<<<<<<<<<<
+ *                 concurrency_exceeded = self._limiter.limiter_concurrency_exceeded
+ * 
+ */
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self->_limiter), __pyx_n_s_check_before_request_call); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 965, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_1 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+        __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 965, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":966
+ *             if self._limiter is not None:
+ *                 self._limiter.check_before_request_call()
+ *                 concurrency_exceeded = self._limiter.limiter_concurrency_exceeded             # <<<<<<<<<<<<<<
+ * 
+ *             # Accepts new request from Core
+ */
+      __pyx_t_5 = __pyx_cur_scope->__pyx_v_self->_limiter->limiter_concurrency_exceeded;
+      __pyx_cur_scope->__pyx_v_concurrency_exceeded = __pyx_t_5;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":964
+ * 
+ *             concurrency_exceeded = False
+ *             if self._limiter is not None:             # <<<<<<<<<<<<<<
+ *                 self._limiter.check_before_request_call()
+ *                 concurrency_exceeded = self._limiter.limiter_concurrency_exceeded
+ */
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":969
+ * 
+ *             # Accepts new request from Core
+ *             rpc_state = await self._request_call()             # <<<<<<<<<<<<<<
+ * 
+ *             # Creates the dedicated RPC coroutine. If we schedule it right now,
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_request_call); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 969, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_1, NULL};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 969, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_3);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L8_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 969, __pyx_L1_error)
+      __pyx_t_3 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_3);
+    } else {
+      __pyx_t_3 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_3) < 0) __PYX_ERR(9, 969, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_7_cython_6cygrpc_RPCState))))) __PYX_ERR(9, 969, __pyx_L1_error)
+    __Pyx_XGOTREF((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_rpc_state, ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)__pyx_t_3));
+    __Pyx_GIVEREF(__pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":976
+ *             # the coroutine onto event loop inside of the cancellation
+ *             # coroutine.
+ *             rpc_coro = _handle_rpc(self._generic_handlers,             # <<<<<<<<<<<<<<
+ *                                    self._interceptors,
+ *                                    rpc_state,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_handle_rpc); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 976, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":980
+ *                                    rpc_state,
+ *                                    self._loop,
+ *                                    concurrency_exceeded)             # <<<<<<<<<<<<<<
+ * 
+ *             # Fires off a task that listens on the cancellation from client.
+ */
+    __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_cur_scope->__pyx_v_concurrency_exceeded); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 980, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_6 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[6] = {__pyx_t_6, __pyx_cur_scope->__pyx_v_self->_generic_handlers, __pyx_cur_scope->__pyx_v_self->_interceptors, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_self->_loop, __pyx_t_1};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 5+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 976, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_rpc_coro);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_rpc_coro, __pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":983
+ * 
+ *             # Fires off a task that listens on the cancellation from client.
+ *             rpc_task = self._loop.create_task(             # <<<<<<<<<<<<<<
+ *                 _schedule_rpc_coro(
+ *                     rpc_coro,
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_loop, __pyx_n_s_create_task); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 983, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":984
+ *             # Fires off a task that listens on the cancellation from client.
+ *             rpc_task = self._loop.create_task(
+ *                 _schedule_rpc_coro(             # <<<<<<<<<<<<<<
+ *                     rpc_coro,
+ *                     rpc_state,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_schedule_rpc_coro); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 984, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":987
+ *                     rpc_coro,
+ *                     rpc_state,
+ *                     self._loop             # <<<<<<<<<<<<<<
+ *                 )
+ *             )
+ */
+    __pyx_t_7 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_7, __pyx_cur_scope->__pyx_v_rpc_coro, ((PyObject *)__pyx_cur_scope->__pyx_v_rpc_state), __pyx_cur_scope->__pyx_v_self->_loop};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_4, 3+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 984, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __pyx_t_6 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_1};
+      __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 983, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_rpc_task);
+    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_rpc_task, __pyx_t_3);
+    __Pyx_GIVEREF(__pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":991
+ *             )
+ * 
+ *             if self._limiter is not None:             # <<<<<<<<<<<<<<
+ *                 self._limiter.decrease_once_finished(rpc_task)
+ * 
+ */
+    __pyx_t_5 = (((PyObject *)__pyx_cur_scope->__pyx_v_self->_limiter) != Py_None);
+    if (__pyx_t_5) {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":992
+ * 
+ *             if self._limiter is not None:
+ *                 self._limiter.decrease_once_finished(rpc_task)             # <<<<<<<<<<<<<<
+ * 
+ *     def _serving_task_crash_handler(self, object task):
+ */
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self->_limiter), __pyx_n_s_decrease_once_finished); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 992, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_1 = NULL;
+      __pyx_t_4 = 0;
+      #if CYTHON_UNPACK_METHODS
+      if (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);
+          __pyx_t_4 = 1;
+        }
+      }
+      #endif
+      {
+        PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_cur_scope->__pyx_v_rpc_task};
+        __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 992, __pyx_L1_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":991
+ *             )
+ * 
+ *             if self._limiter is not None:             # <<<<<<<<<<<<<<
+ *                 self._limiter.decrease_once_finished(rpc_task)
+ * 
+ */
+    }
+  }
+  __pyx_L5_break:;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":952
+ *         return rpc_state
+ * 
+ *     async def _server_main_loop(self,             # <<<<<<<<<<<<<<
+ *                                 object server_started):
+ *         self._server.start(backup_queue=False)
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_server_main_loop", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":994
+ *                 self._limiter.decrease_once_finished(rpc_task)
+ * 
+ *     def _serving_task_crash_handler(self, object task):             # <<<<<<<<<<<<<<
+ *         """Shutdown the server immediately if unexpectedly exited."""
+ *         if task.cancelled():
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_15_serving_task_crash_handler(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_9AioServer_14_serving_task_crash_handler, "Shutdown the server immediately if unexpectedly exited.");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_15_serving_task_crash_handler = {"_serving_task_crash_handler", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_15_serving_task_crash_handler, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_9AioServer_14_serving_task_crash_handler};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_15_serving_task_crash_handler(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_task = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_serving_task_crash_handler (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_task,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_task)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 994, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_serving_task_crash_handler") < 0)) __PYX_ERR(9, 994, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_task = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("_serving_task_crash_handler", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 994, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer._serving_task_crash_handler", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_14_serving_task_crash_handler(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v_task);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_14_serving_task_crash_handler(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_task) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  unsigned int __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_serving_task_crash_handler", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":996
+ *     def _serving_task_crash_handler(self, object task):
+ *         """Shutdown the server immediately if unexpectedly exited."""
+ *         if task.cancelled():             # <<<<<<<<<<<<<<
+ *             return
+ *         if task.exception() is None:
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_task, __pyx_n_s_cancelled); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 996, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 996, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(9, 996, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":997
+ *         """Shutdown the server immediately if unexpectedly exited."""
+ *         if task.cancelled():
+ *             return             # <<<<<<<<<<<<<<
+ *         if task.exception() is None:
+ *             return
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":996
+ *     def _serving_task_crash_handler(self, object task):
+ *         """Shutdown the server immediately if unexpectedly exited."""
+ *         if task.cancelled():             # <<<<<<<<<<<<<<
+ *             return
+ *         if task.exception() is None:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":998
+ *         if task.cancelled():
+ *             return
+ *         if task.exception() is None:             # <<<<<<<<<<<<<<
+ *             return
+ *         if self._status != AIO_SERVER_STATUS_STOPPING:
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_task, __pyx_n_s_exception); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 998, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = NULL;
+  __pyx_t_4 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_4 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 998, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_t_5 = (__pyx_t_1 == Py_None);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":999
+ *             return
+ *         if task.exception() is None:
+ *             return             # <<<<<<<<<<<<<<
+ *         if self._status != AIO_SERVER_STATUS_STOPPING:
+ *             self._crash_exception = task.exception()
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":998
+ *         if task.cancelled():
+ *             return
+ *         if task.exception() is None:             # <<<<<<<<<<<<<<
+ *             return
+ *         if self._status != AIO_SERVER_STATUS_STOPPING:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1000
+ *         if task.exception() is None:
+ *             return
+ *         if self._status != AIO_SERVER_STATUS_STOPPING:             # <<<<<<<<<<<<<<
+ *             self._crash_exception = task.exception()
+ *             _LOGGER.exception(self._crash_exception)
+ */
+  __pyx_t_5 = (__pyx_v_self->_status != __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPING);
+  if (__pyx_t_5) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1001
+ *             return
+ *         if self._status != AIO_SERVER_STATUS_STOPPING:
+ *             self._crash_exception = task.exception()             # <<<<<<<<<<<<<<
+ *             _LOGGER.exception(self._crash_exception)
+ *             self._loop.create_task(self.shutdown(None))
+ */
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_task, __pyx_n_s_exception); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1001, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 1001, __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_self->_crash_exception);
+    __Pyx_DECREF(__pyx_v_self->_crash_exception);
+    __pyx_v_self->_crash_exception = __pyx_t_1;
+    __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1002
+ *         if self._status != AIO_SERVER_STATUS_STOPPING:
+ *             self._crash_exception = task.exception()
+ *             _LOGGER.exception(self._crash_exception)             # <<<<<<<<<<<<<<
+ *             self._loop.create_task(self.shutdown(None))
+ * 
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1002, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_exception); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1002, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_2)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_2);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_self->_crash_exception};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 1002, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1003
+ *             self._crash_exception = task.exception()
+ *             _LOGGER.exception(self._crash_exception)
+ *             self._loop.create_task(self.shutdown(None))             # <<<<<<<<<<<<<<
+ * 
+ *     async def start(self):
+ */
+    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_loop, __pyx_n_s_create_task); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1003, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_shutdown); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 1003, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_7 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_7, Py_None};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1003, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __pyx_t_6 = NULL;
+    __pyx_t_4 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_4 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_2};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 1003, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1000
+ *         if task.exception() is None:
+ *             return
+ *         if self._status != AIO_SERVER_STATUS_STOPPING:             # <<<<<<<<<<<<<<
+ *             self._crash_exception = task.exception()
+ *             _LOGGER.exception(self._crash_exception)
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":994
+ *                 self._limiter.decrease_once_finished(rpc_task)
+ * 
+ *     def _serving_task_crash_handler(self, object task):             # <<<<<<<<<<<<<<
+ *         """Shutdown the server immediately if unexpectedly exited."""
+ *         if task.cancelled():
+ */
+
+  /* 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_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer._serving_task_crash_handler", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_9AioServer_18generator40(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1005
+ *             self._loop.create_task(self.shutdown(None))
+ * 
+ *     async def start(self):             # <<<<<<<<<<<<<<
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:
+ *             return
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_17start(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_17start = {"start", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_17start, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_17start(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("start (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("start", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "start", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_16start(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_16start(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("start", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_51_start(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 1005, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_9AioServer_18generator40, __pyx_codeobj__101, (PyObject *) __pyx_cur_scope, __pyx_n_s_start, __pyx_n_s_AioServer_start, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 1005, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.start", __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_7_cython_6cygrpc_9AioServer_18generator40(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("start", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1005, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1006
+ * 
+ *     async def start(self):
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:             # <<<<<<<<<<<<<<
+ *             return
+ *         elif self._status != AIO_SERVER_STATUS_READY:
+ */
+  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_self->_status == __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_RUNNING);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1007
+ *     async def start(self):
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:
+ *             return             # <<<<<<<<<<<<<<
+ *         elif self._status != AIO_SERVER_STATUS_READY:
+ *             raise UsageError('Server not in ready state')
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1006
+ * 
+ *     async def start(self):
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:             # <<<<<<<<<<<<<<
+ *             return
+ *         elif self._status != AIO_SERVER_STATUS_READY:
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1008
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:
+ *             return
+ *         elif self._status != AIO_SERVER_STATUS_READY:             # <<<<<<<<<<<<<<
+ *             raise UsageError('Server not in ready state')
+ * 
+ */
+  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_self->_status != __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_READY);
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1009
+ *             return
+ *         elif self._status != AIO_SERVER_STATUS_READY:
+ *             raise UsageError('Server not in ready state')             # <<<<<<<<<<<<<<
+ * 
+ *         self._status = AIO_SERVER_STATUS_RUNNING
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_UsageError); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1009, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (unlikely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_s_Server_not_in_ready_state};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1009, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __PYX_ERR(9, 1009, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1008
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:
+ *             return
+ *         elif self._status != AIO_SERVER_STATUS_READY:             # <<<<<<<<<<<<<<
+ *             raise UsageError('Server not in ready state')
+ * 
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1011
+ *             raise UsageError('Server not in ready state')
+ * 
+ *         self._status = AIO_SERVER_STATUS_RUNNING             # <<<<<<<<<<<<<<
+ *         cdef object server_started = self._loop.create_future()
+ *         self._serving_task = self._loop.create_task(self._server_main_loop(server_started))
+ */
+  __pyx_cur_scope->__pyx_v_self->_status = __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_RUNNING;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1012
+ * 
+ *         self._status = AIO_SERVER_STATUS_RUNNING
+ *         cdef object server_started = self._loop.create_future()             # <<<<<<<<<<<<<<
+ *         self._serving_task = self._loop.create_task(self._server_main_loop(server_started))
+ *         self._serving_task.add_done_callback(self._serving_task_crash_handler)
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_loop, __pyx_n_s_create_future); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1012, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1012, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_cur_scope->__pyx_v_server_started = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1013
+ *         self._status = AIO_SERVER_STATUS_RUNNING
+ *         cdef object server_started = self._loop.create_future()
+ *         self._serving_task = self._loop.create_task(self._server_main_loop(server_started))             # <<<<<<<<<<<<<<
+ *         self._serving_task.add_done_callback(self._serving_task_crash_handler)
+ *         # Needs to explicitly wait for the server to start up.
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_loop, __pyx_n_s_create_task); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1013, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_server_main_loop); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 1013, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(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);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_cur_scope->__pyx_v_server_started};
+    __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 1013, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  }
+  __pyx_t_6 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_4};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1013, __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_cur_scope->__pyx_v_self->_serving_task);
+  __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->_serving_task);
+  __pyx_cur_scope->__pyx_v_self->_serving_task = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1014
+ *         cdef object server_started = self._loop.create_future()
+ *         self._serving_task = self._loop.create_task(self._server_main_loop(server_started))
+ *         self._serving_task.add_done_callback(self._serving_task_crash_handler)             # <<<<<<<<<<<<<<
+ *         # Needs to explicitly wait for the server to start up.
+ *         # Otherwise, the actual start time of the server is un-controllable.
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_self->_serving_task, __pyx_n_s_add_done_callback); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1014, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_serving_task_crash_handler); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 1014, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_6 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (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);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_4};
+    __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1014, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1017
+ *         # Needs to explicitly wait for the server to start up.
+ *         # Otherwise, the actual start time of the server is un-controllable.
+ *         await server_started             # <<<<<<<<<<<<<<
+ * 
+ *     async def _start_shutting_down(self):
+ */
+  __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_server_started);
+  __Pyx_XGOTREF(__pyx_r);
+  if (likely(__pyx_r)) {
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+    /* return from generator, awaiting value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L5_resume_from_await:;
+    if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1017, __pyx_L1_error)
+  } else {
+    PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (exc_type) {
+      if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+      else __PYX_ERR(9, 1017, __pyx_L1_error)
+    }
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1005
+ *             self._loop.create_task(self.shutdown(None))
+ * 
+ *     async def start(self):             # <<<<<<<<<<<<<<
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:
+ *             return
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_AddTraceback("start", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_9AioServer_21generator41(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1019
+ *         await server_started
+ * 
+ *     async def _start_shutting_down(self):             # <<<<<<<<<<<<<<
+ *         """Prepares the server to shutting down.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_20_start_shutting_down(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_9AioServer_19_start_shutting_down, "Prepares the server to shutting down.\n\n        This coroutine function is NOT coroutine-safe.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_20_start_shutting_down = {"_start_shutting_down", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_20_start_shutting_down, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_9AioServer_19_start_shutting_down};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_20_start_shutting_down(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_start_shutting_down (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("_start_shutting_down", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_start_shutting_down", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_19_start_shutting_down(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_19_start_shutting_down(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_start_shutting_down", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 1019, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_9AioServer_21generator41, __pyx_codeobj__102, (PyObject *) __pyx_cur_scope, __pyx_n_s_start_shutting_down, __pyx_n_s_AioServer__start_shutting_down, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 1019, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer._start_shutting_down", __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_7_cython_6cygrpc_9AioServer_21generator41(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  grpc_completion_queue *__pyx_t_1;
+  grpc_completion_queue_functor *__pyx_t_2;
+  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;
+  int __pyx_t_10;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_start_shutting_down", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L10_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1019, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1027
+ *         grpc_server_shutdown_and_notify(
+ *             self._server.c_server,
+ *             global_completion_queue(),             # <<<<<<<<<<<<<<
+ *             self._shutdown_callback_wrapper.c_functor())
+ * 
+ */
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc_global_completion_queue(); if (unlikely(__pyx_t_1 == ((grpc_completion_queue *)NULL) && PyErr_Occurred())) __PYX_ERR(9, 1027, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1028
+ *             self._server.c_server,
+ *             global_completion_queue(),
+ *             self._shutdown_callback_wrapper.c_functor())             # <<<<<<<<<<<<<<
+ * 
+ *         # Ensures the serving task (coroutine) exits.
+ */
+  __pyx_t_2 = ((struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper *)__pyx_cur_scope->__pyx_v_self->_shutdown_callback_wrapper->__pyx_vtab)->c_functor(__pyx_cur_scope->__pyx_v_self->_shutdown_callback_wrapper); if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 1028, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1025
+ *         """
+ *         # The shutdown callback won't be called until there is no live RPC.
+ *         grpc_server_shutdown_and_notify(             # <<<<<<<<<<<<<<
+ *             self._server.c_server,
+ *             global_completion_queue(),
+ */
+  grpc_server_shutdown_and_notify(__pyx_cur_scope->__pyx_v_self->_server->c_server, __pyx_t_1, __pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1031
+ * 
+ *         # Ensures the serving task (coroutine) exits.
+ *         try:             # <<<<<<<<<<<<<<
+ *             await self._serving_task
+ *         except _RequestCallError:
+ */
+  {
+    __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5);
+    __Pyx_XGOTREF(__pyx_t_3);
+    __Pyx_XGOTREF(__pyx_t_4);
+    __Pyx_XGOTREF(__pyx_t_5);
+    /*try:*/ {
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1032
+ *         # Ensures the serving task (coroutine) exits.
+ *         try:
+ *             await self._serving_task             # <<<<<<<<<<<<<<
+ *         except _RequestCallError:
+ *             pass
+ */
+      __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_self->_serving_task);
+      __Pyx_XGOTREF(__pyx_r);
+      if (likely(__pyx_r)) {
+        __Pyx_XGIVEREF(__pyx_t_3);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_3;
+        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_4;
+        __Pyx_XGIVEREF(__pyx_t_5);
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+        /* return from generator, awaiting value */
+        __pyx_generator->resume_label = 1;
+        return __pyx_r;
+        __pyx_L10_resume_from_await:;
+        __pyx_t_3 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_3);
+        __pyx_t_4 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = 0;
+        __Pyx_XGOTREF(__pyx_t_4);
+        __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = 0;
+        __Pyx_XGOTREF(__pyx_t_5);
+        if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1032, __pyx_L4_error)
+      } else {
+        PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+        if (exc_type) {
+          if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+          else __PYX_ERR(9, 1032, __pyx_L4_error)
+        }
+      }
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1031
+ * 
+ *         # Ensures the serving task (coroutine) exits.
+ *         try:             # <<<<<<<<<<<<<<
+ *             await self._serving_task
+ *         except _RequestCallError:
+ */
+    }
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    goto __pyx_L9_try_end;
+    __pyx_L4_error:;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1033
+ *         try:
+ *             await self._serving_task
+ *         except _RequestCallError:             # <<<<<<<<<<<<<<
+ *             pass
+ * 
+ */
+    __Pyx_ErrFetch(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+    __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_RequestCallError); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 1033, __pyx_L6_except_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_10 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_6, __pyx_t_9);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __Pyx_ErrRestore(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+    __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0;
+    if (__pyx_t_10) {
+      __Pyx_ErrRestore(0,0,0);
+      goto __pyx_L5_exception_handled;
+    }
+    goto __pyx_L6_except_error;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1031
+ * 
+ *         # Ensures the serving task (coroutine) exits.
+ *         try:             # <<<<<<<<<<<<<<
+ *             await self._serving_task
+ *         except _RequestCallError:
+ */
+    __pyx_L6_except_error:;
+    __Pyx_XGIVEREF(__pyx_t_3);
+    __Pyx_XGIVEREF(__pyx_t_4);
+    __Pyx_XGIVEREF(__pyx_t_5);
+    __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
+    goto __pyx_L1_error;
+    __pyx_L5_exception_handled:;
+    __Pyx_XGIVEREF(__pyx_t_3);
+    __Pyx_XGIVEREF(__pyx_t_4);
+    __Pyx_XGIVEREF(__pyx_t_5);
+    __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
+    __pyx_L9_try_end:;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1019
+ *         await server_started
+ * 
+ *     async def _start_shutting_down(self):             # <<<<<<<<<<<<<<
+ *         """Prepares the server to shutting down.
+ * 
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_AddTraceback("_start_shutting_down", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_9AioServer_24generator42(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1036
+ *             pass
+ * 
+ *     async def shutdown(self, grace):             # <<<<<<<<<<<<<<
+ *         """Gracefully shutdown the Core server.
+ * 
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_23shutdown(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+PyDoc_STRVAR(__pyx_doc_7_cython_6cygrpc_9AioServer_22shutdown, "Gracefully shutdown the Core server.\n\n        Application should only call shutdown once.\n\n        Args:\n          grace: An optional float indicating the length of grace period in\n            seconds.\n        ");
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_23shutdown = {"shutdown", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_23shutdown, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_9AioServer_22shutdown};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_23shutdown(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_grace = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("shutdown (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grace,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_grace)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 1036, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "shutdown") < 0)) __PYX_ERR(9, 1036, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_grace = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("shutdown", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 1036, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_22shutdown(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v_grace);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_22shutdown(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_grace) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("shutdown", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_53_shutdown(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 1036, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_grace = __pyx_v_grace;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_grace);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_grace);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_9AioServer_24generator42, __pyx_codeobj__103, (PyObject *) __pyx_cur_scope, __pyx_n_s_shutdown, __pyx_n_s_AioServer_shutdown, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 1036, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.shutdown", __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_7_cython_6cygrpc_9AioServer_24generator42(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_t_14;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("shutdown", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    case 2: goto __pyx_L16_resume_from_await;
+    case 3: goto __pyx_L20_resume_from_await;
+    case 4: goto __pyx_L21_resume_from_await;
+    case 5: goto __pyx_L24_resume_from_await;
+    case 6: goto __pyx_L31_resume_from_await;
+    case 7: goto __pyx_L34_resume_from_await;
+    case 8: goto __pyx_L36_resume_from_await;
+    case 9: goto __pyx_L47_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1036, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1045
+ *             seconds.
+ *         """
+ *         if self._status == AIO_SERVER_STATUS_READY or self._status == AIO_SERVER_STATUS_STOPPED:             # <<<<<<<<<<<<<<
+ *             return
+ * 
+ */
+  switch (__pyx_cur_scope->__pyx_v_self->_status) {
+    case __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_READY:
+    case __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPED:
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1046
+ *         """
+ *         if self._status == AIO_SERVER_STATUS_READY or self._status == AIO_SERVER_STATUS_STOPPED:
+ *             return             # <<<<<<<<<<<<<<
+ * 
+ *         async with self._shutdown_lock:
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = NULL;
+    goto __pyx_L0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1045
+ *             seconds.
+ *         """
+ *         if self._status == AIO_SERVER_STATUS_READY or self._status == AIO_SERVER_STATUS_STOPPED:             # <<<<<<<<<<<<<<
+ *             return
+ * 
+ */
+    break;
+    default: break;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1048
+ *             return
+ * 
+ *         async with self._shutdown_lock:             # <<<<<<<<<<<<<<
+ *             if self._status == AIO_SERVER_STATUS_RUNNING:
+ *                 self._server.is_shutting_down = True
+ */
+  /*with:*/ {
+    __pyx_t_1 = __Pyx_PyObject_LookupSpecial(__pyx_cur_scope->__pyx_v_self->_shutdown_lock, __pyx_n_s_aexit); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 1048, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_cur_scope->__pyx_v_self->_shutdown_lock, __pyx_n_s_aenter); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1048, __pyx_L4_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_3))) {
+      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+      if (likely(__pyx_t_4)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+        __Pyx_INCREF(__pyx_t_4);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_3, function);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1048, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_t_1);
+      __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L5_resume_from_await:;
+      __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+      __pyx_cur_scope->__pyx_t_0 = 0;
+      __Pyx_XGOTREF(__pyx_t_1);
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1048, __pyx_L4_error)
+      __pyx_t_2 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_2);
+    } else {
+      __pyx_t_2 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_2) < 0) __PYX_ERR(9, 1048, __pyx_L4_error)
+      __Pyx_GOTREF(__pyx_t_2);
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    /*try:*/ {
+      {
+        __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8);
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_8);
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1049
+ * 
+ *         async with self._shutdown_lock:
+ *             if self._status == AIO_SERVER_STATUS_RUNNING:             # <<<<<<<<<<<<<<
+ *                 self._server.is_shutting_down = True
+ *                 self._status = AIO_SERVER_STATUS_STOPPING
+ */
+          __pyx_t_9 = (__pyx_cur_scope->__pyx_v_self->_status == __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_RUNNING);
+          if (__pyx_t_9) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1050
+ *         async with self._shutdown_lock:
+ *             if self._status == AIO_SERVER_STATUS_RUNNING:
+ *                 self._server.is_shutting_down = True             # <<<<<<<<<<<<<<
+ *                 self._status = AIO_SERVER_STATUS_STOPPING
+ *                 await self._start_shutting_down()
+ */
+            __pyx_cur_scope->__pyx_v_self->_server->is_shutting_down = 1;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1051
+ *             if self._status == AIO_SERVER_STATUS_RUNNING:
+ *                 self._server.is_shutting_down = True
+ *                 self._status = AIO_SERVER_STATUS_STOPPING             # <<<<<<<<<<<<<<
+ *                 await self._start_shutting_down()
+ * 
+ */
+            __pyx_cur_scope->__pyx_v_self->_status = __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPING;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1052
+ *                 self._server.is_shutting_down = True
+ *                 self._status = AIO_SERVER_STATUS_STOPPING
+ *                 await self._start_shutting_down()             # <<<<<<<<<<<<<<
+ * 
+ *         if grace is None:
+ */
+            __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_start_shutting_down); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1052, __pyx_L9_error)
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_4 = NULL;
+            __pyx_t_5 = 0;
+            #if CYTHON_UNPACK_METHODS
+            if (likely(PyMethod_Check(__pyx_t_3))) {
+              __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+              if (likely(__pyx_t_4)) {
+                PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+                __Pyx_INCREF(__pyx_t_4);
+                __Pyx_INCREF(function);
+                __Pyx_DECREF_SET(__pyx_t_3, function);
+                __pyx_t_5 = 1;
+              }
+            }
+            #endif
+            {
+              PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
+              __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+              __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+              if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1052, __pyx_L9_error)
+              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            }
+            __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_2);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_XGOTREF(__pyx_r);
+            if (likely(__pyx_r)) {
+              __Pyx_XGIVEREF(__pyx_t_1);
+              __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+              __Pyx_XGIVEREF(__pyx_t_6);
+              __pyx_cur_scope->__pyx_t_1 = __pyx_t_6;
+              __Pyx_XGIVEREF(__pyx_t_7);
+              __pyx_cur_scope->__pyx_t_2 = __pyx_t_7;
+              __Pyx_XGIVEREF(__pyx_t_8);
+              __pyx_cur_scope->__pyx_t_3 = __pyx_t_8;
+              __Pyx_XGIVEREF(__pyx_r);
+              __Pyx_RefNannyFinishContext();
+              __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+              /* return from generator, awaiting value */
+              __pyx_generator->resume_label = 2;
+              return __pyx_r;
+              __pyx_L16_resume_from_await:;
+              __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+              __pyx_cur_scope->__pyx_t_0 = 0;
+              __Pyx_XGOTREF(__pyx_t_1);
+              __pyx_t_6 = __pyx_cur_scope->__pyx_t_1;
+              __pyx_cur_scope->__pyx_t_1 = 0;
+              __Pyx_XGOTREF(__pyx_t_6);
+              __pyx_t_7 = __pyx_cur_scope->__pyx_t_2;
+              __pyx_cur_scope->__pyx_t_2 = 0;
+              __Pyx_XGOTREF(__pyx_t_7);
+              __pyx_t_8 = __pyx_cur_scope->__pyx_t_3;
+              __pyx_cur_scope->__pyx_t_3 = 0;
+              __Pyx_XGOTREF(__pyx_t_8);
+              if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1052, __pyx_L9_error)
+            } else {
+              PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+              if (exc_type) {
+                if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+                else __PYX_ERR(9, 1052, __pyx_L9_error)
+              }
+            }
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1049
+ * 
+ *         async with self._shutdown_lock:
+ *             if self._status == AIO_SERVER_STATUS_RUNNING:             # <<<<<<<<<<<<<<
+ *                 self._server.is_shutting_down = True
+ *                 self._status = AIO_SERVER_STATUS_STOPPING
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1048
+ *             return
+ * 
+ *         async with self._shutdown_lock:             # <<<<<<<<<<<<<<
+ *             if self._status == AIO_SERVER_STATUS_RUNNING:
+ *                 self._server.is_shutting_down = True
+ */
+        }
+        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        /*except:*/ {
+          __Pyx_AddTraceback("_cython.cygrpc.AioServer.shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(9, 1048, __pyx_L11_except_error)
+          __Pyx_XGOTREF(__pyx_t_2);
+          __Pyx_XGOTREF(__pyx_t_3);
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_10 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(9, 1048, __pyx_L11_except_error)
+          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_10, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_11)) __PYX_ERR(9, 1048, __pyx_L11_except_error)
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_11);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __Pyx_XGOTREF(__pyx_r);
+          if (likely(__pyx_r)) {
+            __Pyx_XGIVEREF(__pyx_t_1);
+            __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+            __Pyx_XGIVEREF(__pyx_t_2);
+            __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+            __Pyx_XGIVEREF(__pyx_t_3);
+            __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __pyx_cur_scope->__pyx_t_3 = __pyx_t_4;
+            __Pyx_XGIVEREF(__pyx_t_6);
+            __pyx_cur_scope->__pyx_t_4 = __pyx_t_6;
+            __Pyx_XGIVEREF(__pyx_t_7);
+            __pyx_cur_scope->__pyx_t_5 = __pyx_t_7;
+            __Pyx_XGIVEREF(__pyx_t_8);
+            __pyx_cur_scope->__pyx_t_6 = __pyx_t_8;
+            __Pyx_XGIVEREF(__pyx_t_11);
+            __pyx_cur_scope->__pyx_t_7 = __pyx_t_11;
+            __Pyx_XGIVEREF(__pyx_r);
+            __Pyx_RefNannyFinishContext();
+            __Pyx_Coroutine_SwapException(__pyx_generator);
+            /* return from generator, awaiting value */
+            __pyx_generator->resume_label = 3;
+            return __pyx_r;
+            __pyx_L20_resume_from_await:;
+            __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+            __pyx_cur_scope->__pyx_t_0 = 0;
+            __Pyx_XGOTREF(__pyx_t_1);
+            __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+            __pyx_cur_scope->__pyx_t_1 = 0;
+            __Pyx_XGOTREF(__pyx_t_2);
+            __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+            __pyx_cur_scope->__pyx_t_2 = 0;
+            __Pyx_XGOTREF(__pyx_t_3);
+            __pyx_t_4 = __pyx_cur_scope->__pyx_t_3;
+            __pyx_cur_scope->__pyx_t_3 = 0;
+            __Pyx_XGOTREF(__pyx_t_4);
+            __pyx_t_6 = __pyx_cur_scope->__pyx_t_4;
+            __pyx_cur_scope->__pyx_t_4 = 0;
+            __Pyx_XGOTREF(__pyx_t_6);
+            __pyx_t_7 = __pyx_cur_scope->__pyx_t_5;
+            __pyx_cur_scope->__pyx_t_5 = 0;
+            __Pyx_XGOTREF(__pyx_t_7);
+            __pyx_t_8 = __pyx_cur_scope->__pyx_t_6;
+            __pyx_cur_scope->__pyx_t_6 = 0;
+            __Pyx_XGOTREF(__pyx_t_8);
+            __pyx_t_11 = __pyx_cur_scope->__pyx_t_7;
+            __pyx_cur_scope->__pyx_t_7 = 0;
+            __Pyx_XGOTREF(__pyx_t_11);
+            if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1048, __pyx_L11_except_error)
+            __pyx_t_10 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_10);
+          } else {
+            __pyx_t_10 = NULL;
+            if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_10) < 0) __PYX_ERR(9, 1048, __pyx_L11_except_error)
+            __Pyx_GOTREF(__pyx_t_10);
+          }
+          __pyx_t_11 = __pyx_t_10;
+          __pyx_t_10 = 0;
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          if (__pyx_t_9 < 0) __PYX_ERR(9, 1048, __pyx_L11_except_error)
+          __pyx_t_12 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_12)) {
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_3);
+            __Pyx_XGIVEREF(__pyx_t_4);
+            __Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_3, __pyx_t_4);
+            __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; 
+            __PYX_ERR(9, 1048, __pyx_L11_except_error)
+          }
+          __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L10_exception_handled;
+        }
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        goto __pyx_L1_error;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_XGIVEREF(__pyx_t_8);
+        __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8);
+        __pyx_L14_try_end:;
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_1) {
+          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          if (unlikely(!__pyx_t_8)) __PYX_ERR(9, 1048, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_8);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          __Pyx_XGOTREF(__pyx_r);
+          if (likely(__pyx_r)) {
+            __Pyx_XGIVEREF(__pyx_t_1);
+            __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+            __Pyx_XGIVEREF(__pyx_t_8);
+            __pyx_cur_scope->__pyx_t_1 = __pyx_t_8;
+            __Pyx_XGIVEREF(__pyx_r);
+            __Pyx_RefNannyFinishContext();
+            __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+            /* return from generator, awaiting value */
+            __pyx_generator->resume_label = 4;
+            return __pyx_r;
+            __pyx_L21_resume_from_await:;
+            __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+            __pyx_cur_scope->__pyx_t_0 = 0;
+            __Pyx_XGOTREF(__pyx_t_1);
+            __pyx_t_8 = __pyx_cur_scope->__pyx_t_1;
+            __pyx_cur_scope->__pyx_t_1 = 0;
+            __Pyx_XGOTREF(__pyx_t_8);
+            if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1048, __pyx_L1_error)
+            __pyx_t_4 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_4);
+          } else {
+            __pyx_t_4 = NULL;
+            if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_4) < 0) __PYX_ERR(9, 1048, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_4);
+          }
+          __pyx_t_8 = __pyx_t_4;
+          __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        }
+        goto __pyx_L8;
+      }
+      __pyx_L8:;
+    }
+    goto __pyx_L22;
+    __pyx_L4_error:;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    goto __pyx_L1_error;
+    __pyx_L22:;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1054
+ *                 await self._start_shutting_down()
+ * 
+ *         if grace is None:             # <<<<<<<<<<<<<<
+ *             # Directly cancels all calls
+ *             grpc_server_cancel_all_calls(self._server.c_server)
+ */
+  __pyx_t_12 = (__pyx_cur_scope->__pyx_v_grace == Py_None);
+  if (__pyx_t_12) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1056
+ *         if grace is None:
+ *             # Directly cancels all calls
+ *             grpc_server_cancel_all_calls(self._server.c_server)             # <<<<<<<<<<<<<<
+ *             await self._shutdown_completed
+ *         else:
+ */
+    grpc_server_cancel_all_calls(__pyx_cur_scope->__pyx_v_self->_server->c_server);
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1057
+ *             # Directly cancels all calls
+ *             grpc_server_cancel_all_calls(self._server.c_server)
+ *             await self._shutdown_completed             # <<<<<<<<<<<<<<
+ *         else:
+ *             try:
+ */
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_self->_shutdown_completed);
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 5;
+      return __pyx_r;
+      __pyx_L24_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1057, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 1057, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1054
+ *                 await self._start_shutting_down()
+ * 
+ *         if grace is None:             # <<<<<<<<<<<<<<
+ *             # Directly cancels all calls
+ *             grpc_server_cancel_all_calls(self._server.c_server)
+ */
+    goto __pyx_L23;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1059
+ *             await self._shutdown_completed
+ *         else:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),
+ */
+  /*else*/ {
+    {
+      __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_8, &__pyx_t_7);
+      __Pyx_XGOTREF(__pyx_t_1);
+      __Pyx_XGOTREF(__pyx_t_8);
+      __Pyx_XGOTREF(__pyx_t_7);
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1060
+ *         else:
+ *             try:
+ *                 await asyncio.wait_for(             # <<<<<<<<<<<<<<
+ *                     asyncio.shield(self._shutdown_completed),
+ *                     grace,
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1060, __pyx_L25_error)
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_wait_for); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1060, __pyx_L25_error)
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1061
+ *             try:
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),             # <<<<<<<<<<<<<<
+ *                     grace,
+ *                 )
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_10)) __PYX_ERR(9, 1061, __pyx_L25_error)
+        __Pyx_GOTREF(__pyx_t_10);
+        __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_shield); if (unlikely(!__pyx_t_13)) __PYX_ERR(9, 1061, __pyx_L25_error)
+        __Pyx_GOTREF(__pyx_t_13);
+        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __pyx_t_10 = NULL;
+        __pyx_t_5 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_13))) {
+          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_13);
+          if (likely(__pyx_t_10)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
+            __Pyx_INCREF(__pyx_t_10);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_13, function);
+            __pyx_t_5 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_10, __pyx_cur_scope->__pyx_v_self->_shutdown_completed};
+          __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_13, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+          if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1061, __pyx_L25_error)
+          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1062
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),
+ *                     grace,             # <<<<<<<<<<<<<<
+ *                 )
+ *             except asyncio.TimeoutError:
+ */
+        __pyx_t_13 = NULL;
+        __pyx_t_5 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_2))) {
+          __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_2);
+          if (likely(__pyx_t_13)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+            __Pyx_INCREF(__pyx_t_13);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_2, function);
+            __pyx_t_5 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[3] = {__pyx_t_13, __pyx_t_3, __pyx_cur_scope->__pyx_v_grace};
+          __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5);
+          __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 1060, __pyx_L25_error)
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        }
+        __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_4);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_XGOTREF(__pyx_r);
+        if (likely(__pyx_r)) {
+          __Pyx_XGIVEREF(__pyx_t_1);
+          __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+          __Pyx_XGIVEREF(__pyx_t_7);
+          __pyx_cur_scope->__pyx_t_1 = __pyx_t_7;
+          __Pyx_XGIVEREF(__pyx_t_8);
+          __pyx_cur_scope->__pyx_t_2 = __pyx_t_8;
+          __Pyx_XGIVEREF(__pyx_r);
+          __Pyx_RefNannyFinishContext();
+          __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+          /* return from generator, awaiting value */
+          __pyx_generator->resume_label = 6;
+          return __pyx_r;
+          __pyx_L31_resume_from_await:;
+          __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+          __pyx_cur_scope->__pyx_t_0 = 0;
+          __Pyx_XGOTREF(__pyx_t_1);
+          __pyx_t_7 = __pyx_cur_scope->__pyx_t_1;
+          __pyx_cur_scope->__pyx_t_1 = 0;
+          __Pyx_XGOTREF(__pyx_t_7);
+          __pyx_t_8 = __pyx_cur_scope->__pyx_t_2;
+          __pyx_cur_scope->__pyx_t_2 = 0;
+          __Pyx_XGOTREF(__pyx_t_8);
+          if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1060, __pyx_L25_error)
+        } else {
+          PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+          if (exc_type) {
+            if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+            else __PYX_ERR(9, 1060, __pyx_L25_error)
+          }
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1059
+ *             await self._shutdown_completed
+ *         else:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),
+ */
+      }
+      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L30_try_end;
+      __pyx_L25_error:;
+      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1064
+ *                     grace,
+ *                 )
+ *             except asyncio.TimeoutError:             # <<<<<<<<<<<<<<
+ *                 # Cancels all ongoing calls by the end of grace period.
+ *                 grpc_server_cancel_all_calls(self._server.c_server)
+ */
+      __Pyx_ErrFetch(&__pyx_t_4, &__pyx_t_2, &__pyx_t_3);
+      __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_13)) __PYX_ERR(9, 1064, __pyx_L27_except_error)
+      __Pyx_GOTREF(__pyx_t_13);
+      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_TimeoutError); if (unlikely(!__pyx_t_10)) __PYX_ERR(9, 1064, __pyx_L27_except_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+      __pyx_t_14 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_4, __pyx_t_10);
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __Pyx_ErrRestore(__pyx_t_4, __pyx_t_2, __pyx_t_3);
+      __pyx_t_4 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0;
+      if (__pyx_t_14) {
+        __Pyx_AddTraceback("_cython.cygrpc.AioServer.shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+        if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_4) < 0) __PYX_ERR(9, 1064, __pyx_L27_except_error)
+        __Pyx_XGOTREF(__pyx_t_3);
+        __Pyx_XGOTREF(__pyx_t_2);
+        __Pyx_XGOTREF(__pyx_t_4);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1066
+ *             except asyncio.TimeoutError:
+ *                 # Cancels all ongoing calls by the end of grace period.
+ *                 grpc_server_cancel_all_calls(self._server.c_server)             # <<<<<<<<<<<<<<
+ *                 await self._shutdown_completed
+ * 
+ */
+        grpc_server_cancel_all_calls(__pyx_cur_scope->__pyx_v_self->_server->c_server);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1067
+ *                 # Cancels all ongoing calls by the end of grace period.
+ *                 grpc_server_cancel_all_calls(self._server.c_server)
+ *                 await self._shutdown_completed             # <<<<<<<<<<<<<<
+ * 
+ *         async with self._shutdown_lock:
+ */
+        __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_self->_shutdown_completed);
+        __Pyx_XGOTREF(__pyx_r);
+        if (likely(__pyx_r)) {
+          __Pyx_XGIVEREF(__pyx_t_1);
+          __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+          __Pyx_XGIVEREF(__pyx_t_2);
+          __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+          __Pyx_XGIVEREF(__pyx_t_3);
+          __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+          __Pyx_XGIVEREF(__pyx_t_4);
+          __pyx_cur_scope->__pyx_t_3 = __pyx_t_4;
+          __Pyx_XGIVEREF(__pyx_t_7);
+          __pyx_cur_scope->__pyx_t_4 = __pyx_t_7;
+          __Pyx_XGIVEREF(__pyx_t_8);
+          __pyx_cur_scope->__pyx_t_5 = __pyx_t_8;
+          __Pyx_XGIVEREF(__pyx_r);
+          __Pyx_RefNannyFinishContext();
+          __Pyx_Coroutine_SwapException(__pyx_generator);
+          /* return from generator, awaiting value */
+          __pyx_generator->resume_label = 7;
+          return __pyx_r;
+          __pyx_L34_resume_from_await:;
+          __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+          __pyx_cur_scope->__pyx_t_0 = 0;
+          __Pyx_XGOTREF(__pyx_t_1);
+          __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+          __pyx_cur_scope->__pyx_t_1 = 0;
+          __Pyx_XGOTREF(__pyx_t_2);
+          __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+          __pyx_cur_scope->__pyx_t_2 = 0;
+          __Pyx_XGOTREF(__pyx_t_3);
+          __pyx_t_4 = __pyx_cur_scope->__pyx_t_3;
+          __pyx_cur_scope->__pyx_t_3 = 0;
+          __Pyx_XGOTREF(__pyx_t_4);
+          __pyx_t_7 = __pyx_cur_scope->__pyx_t_4;
+          __pyx_cur_scope->__pyx_t_4 = 0;
+          __Pyx_XGOTREF(__pyx_t_7);
+          __pyx_t_8 = __pyx_cur_scope->__pyx_t_5;
+          __pyx_cur_scope->__pyx_t_5 = 0;
+          __Pyx_XGOTREF(__pyx_t_8);
+          if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1067, __pyx_L27_except_error)
+        } else {
+          PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+          if (exc_type) {
+            if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+            else __PYX_ERR(9, 1067, __pyx_L27_except_error)
+          }
+        }
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        goto __pyx_L26_exception_handled;
+      }
+      goto __pyx_L27_except_error;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1059
+ *             await self._shutdown_completed
+ *         else:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),
+ */
+      __pyx_L27_except_error:;
+      __Pyx_XGIVEREF(__pyx_t_1);
+      __Pyx_XGIVEREF(__pyx_t_8);
+      __Pyx_XGIVEREF(__pyx_t_7);
+      __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_8, __pyx_t_7);
+      goto __pyx_L1_error;
+      __pyx_L26_exception_handled:;
+      __Pyx_XGIVEREF(__pyx_t_1);
+      __Pyx_XGIVEREF(__pyx_t_8);
+      __Pyx_XGIVEREF(__pyx_t_7);
+      __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_8, __pyx_t_7);
+      __pyx_L30_try_end:;
+    }
+  }
+  __pyx_L23:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1069
+ *                 await self._shutdown_completed
+ * 
+ *         async with self._shutdown_lock:             # <<<<<<<<<<<<<<
+ *             if self._status == AIO_SERVER_STATUS_STOPPING:
+ *                 grpc_server_destroy(self._server.c_server)
+ */
+  /*with:*/ {
+    __pyx_t_7 = __Pyx_PyObject_LookupSpecial(__pyx_cur_scope->__pyx_v_self->_shutdown_lock, __pyx_n_s_aexit); if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 1069, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_cur_scope->__pyx_v_self->_shutdown_lock, __pyx_n_s_aenter); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1069, __pyx_L35_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_3 = NULL;
+    __pyx_t_5 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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);
+        __pyx_t_5 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5);
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 1069, __pyx_L35_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    }
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_4);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_t_7);
+      __pyx_cur_scope->__pyx_t_0 = __pyx_t_7;
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 8;
+      return __pyx_r;
+      __pyx_L36_resume_from_await:;
+      __pyx_t_7 = __pyx_cur_scope->__pyx_t_0;
+      __pyx_cur_scope->__pyx_t_0 = 0;
+      __Pyx_XGOTREF(__pyx_t_7);
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1069, __pyx_L35_error)
+      __pyx_t_4 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_4);
+    } else {
+      __pyx_t_4 = NULL;
+      if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_4) < 0) __PYX_ERR(9, 1069, __pyx_L35_error)
+      __Pyx_GOTREF(__pyx_t_4);
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    /*try:*/ {
+      {
+        (void)__pyx_t_8; (void)__pyx_t_1; (void)__pyx_t_6; /* mark used */
+        /*try:*/ {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1070
+ * 
+ *         async with self._shutdown_lock:
+ *             if self._status == AIO_SERVER_STATUS_STOPPING:             # <<<<<<<<<<<<<<
+ *                 grpc_server_destroy(self._server.c_server)
+ *                 self._server.c_server = NULL
+ */
+          __pyx_t_12 = (__pyx_cur_scope->__pyx_v_self->_status == __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPING);
+          if (__pyx_t_12) {
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1071
+ *         async with self._shutdown_lock:
+ *             if self._status == AIO_SERVER_STATUS_STOPPING:
+ *                 grpc_server_destroy(self._server.c_server)             # <<<<<<<<<<<<<<
+ *                 self._server.c_server = NULL
+ *                 self._server.is_shutdown = True
+ */
+            grpc_server_destroy(__pyx_cur_scope->__pyx_v_self->_server->c_server);
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1072
+ *             if self._status == AIO_SERVER_STATUS_STOPPING:
+ *                 grpc_server_destroy(self._server.c_server)
+ *                 self._server.c_server = NULL             # <<<<<<<<<<<<<<
+ *                 self._server.is_shutdown = True
+ *                 self._status = AIO_SERVER_STATUS_STOPPED
+ */
+            __pyx_cur_scope->__pyx_v_self->_server->c_server = NULL;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1073
+ *                 grpc_server_destroy(self._server.c_server)
+ *                 self._server.c_server = NULL
+ *                 self._server.is_shutdown = True             # <<<<<<<<<<<<<<
+ *                 self._status = AIO_SERVER_STATUS_STOPPED
+ * 
+ */
+            __pyx_cur_scope->__pyx_v_self->_server->is_shutdown = 1;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1074
+ *                 self._server.c_server = NULL
+ *                 self._server.is_shutdown = True
+ *                 self._status = AIO_SERVER_STATUS_STOPPED             # <<<<<<<<<<<<<<
+ * 
+ *     async def wait_for_termination(self, object timeout):
+ */
+            __pyx_cur_scope->__pyx_v_self->_status = __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPED;
+
+            /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1070
+ * 
+ *         async with self._shutdown_lock:
+ *             if self._status == AIO_SERVER_STATUS_STOPPING:             # <<<<<<<<<<<<<<
+ *                 grpc_server_destroy(self._server.c_server)
+ *                 self._server.c_server = NULL
+ */
+          }
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1069
+ *                 await self._shutdown_completed
+ * 
+ *         async with self._shutdown_lock:             # <<<<<<<<<<<<<<
+ *             if self._status == AIO_SERVER_STATUS_STOPPING:
+ *                 grpc_server_destroy(self._server.c_server)
+ */
+        }
+      }
+    }
+    /*finally:*/ {
+      /*normal exit:*/{
+        if (__pyx_t_7) {
+          __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple__11, NULL);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 1069, __pyx_L1_error)
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_6);
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          __Pyx_XGOTREF(__pyx_r);
+          if (likely(__pyx_r)) {
+            __Pyx_XGIVEREF(__pyx_t_6);
+            __pyx_cur_scope->__pyx_t_0 = __pyx_t_6;
+            __Pyx_XGIVEREF(__pyx_t_7);
+            __pyx_cur_scope->__pyx_t_1 = __pyx_t_7;
+            __Pyx_XGIVEREF(__pyx_r);
+            __Pyx_RefNannyFinishContext();
+            __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+            /* return from generator, awaiting value */
+            __pyx_generator->resume_label = 9;
+            return __pyx_r;
+            __pyx_L47_resume_from_await:;
+            __pyx_t_6 = __pyx_cur_scope->__pyx_t_0;
+            __pyx_cur_scope->__pyx_t_0 = 0;
+            __Pyx_XGOTREF(__pyx_t_6);
+            __pyx_t_7 = __pyx_cur_scope->__pyx_t_1;
+            __pyx_cur_scope->__pyx_t_1 = 0;
+            __Pyx_XGOTREF(__pyx_t_7);
+            if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1069, __pyx_L1_error)
+            __pyx_t_4 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_4);
+          } else {
+            __pyx_t_4 = NULL;
+            if (__Pyx_PyGen_FetchStopIterationValue(&__pyx_t_4) < 0) __PYX_ERR(9, 1069, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_4);
+          }
+          __pyx_t_6 = __pyx_t_4;
+          __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        }
+        goto __pyx_L39;
+      }
+      __pyx_L39:;
+    }
+    goto __pyx_L48;
+    __pyx_L35_error:;
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    goto __pyx_L1_error;
+    __pyx_L48:;
+  }
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1036
+ *             pass
+ * 
+ *     async def shutdown(self, grace):             # <<<<<<<<<<<<<<
+ *         """Gracefully shutdown the Core server.
+ * 
+ */
+
+  /* function exit code */
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_13);
+  __Pyx_AddTraceback("shutdown", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_7_cython_6cygrpc_9AioServer_27generator43(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1076
+ *                 self._status = AIO_SERVER_STATUS_STOPPED
+ * 
+ *     async def wait_for_termination(self, object timeout):             # <<<<<<<<<<<<<<
+ *         if timeout is None:
+ *             await self._shutdown_completed
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_26wait_for_termination(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_26wait_for_termination = {"wait_for_termination", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_26wait_for_termination, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_26wait_for_termination(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v_timeout = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("wait_for_termination (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_timeout,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_timeout)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(9, 1076, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "wait_for_termination") < 0)) __PYX_ERR(9, 1076, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v_timeout = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("wait_for_termination", 1, 1, 1, __pyx_nargs); __PYX_ERR(9, 1076, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.wait_for_termination", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_25wait_for_termination(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v_timeout);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_25wait_for_termination(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v_timeout) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("wait_for_termination", 0);
+  __pyx_cur_scope = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *)Py_None);
+    __Pyx_INCREF(Py_None);
+    __PYX_ERR(9, 1076, __pyx_L1_error)
+  } else {
+    __Pyx_GOTREF((PyObject *)__pyx_cur_scope);
+  }
+  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_timeout = __pyx_v_timeout;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_timeout);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_timeout);
+  {
+    __pyx_CoroutineObject *gen = __Pyx_Coroutine_New((__pyx_coroutine_body_t) __pyx_gb_7_cython_6cygrpc_9AioServer_27generator43, __pyx_codeobj__104, (PyObject *) __pyx_cur_scope, __pyx_n_s_wait_for_termination, __pyx_n_s_AioServer_wait_for_termination, __pyx_n_s_cython_cygrpc); if (unlikely(!gen)) __PYX_ERR(9, 1076, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.wait_for_termination", __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_7_cython_6cygrpc_9AioServer_27generator43(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *__pyx_cur_scope = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  int __pyx_t_1;
+  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;
+  unsigned int __pyx_t_10;
+  int __pyx_t_11;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("wait_for_termination", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L5_resume_from_await;
+    case 2: goto __pyx_L12_resume_from_await;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1076, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1077
+ * 
+ *     async def wait_for_termination(self, object timeout):
+ *         if timeout is None:             # <<<<<<<<<<<<<<
+ *             await self._shutdown_completed
+ *         else:
+ */
+  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_timeout == Py_None);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1078
+ *     async def wait_for_termination(self, object timeout):
+ *         if timeout is None:
+ *             await self._shutdown_completed             # <<<<<<<<<<<<<<
+ *         else:
+ *             try:
+ */
+    __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_cur_scope->__pyx_v_self->_shutdown_completed);
+    __Pyx_XGOTREF(__pyx_r);
+    if (likely(__pyx_r)) {
+      __Pyx_XGIVEREF(__pyx_r);
+      __Pyx_RefNannyFinishContext();
+      __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+      /* return from generator, awaiting value */
+      __pyx_generator->resume_label = 1;
+      return __pyx_r;
+      __pyx_L5_resume_from_await:;
+      if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1078, __pyx_L1_error)
+    } else {
+      PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+      if (exc_type) {
+        if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+        else __PYX_ERR(9, 1078, __pyx_L1_error)
+      }
+    }
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1077
+ * 
+ *     async def wait_for_termination(self, object timeout):
+ *         if timeout is None:             # <<<<<<<<<<<<<<
+ *             await self._shutdown_completed
+ *         else:
+ */
+    goto __pyx_L4;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1080
+ *             await self._shutdown_completed
+ *         else:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),
+ */
+  /*else*/ {
+    {
+      __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4);
+      __Pyx_XGOTREF(__pyx_t_2);
+      __Pyx_XGOTREF(__pyx_t_3);
+      __Pyx_XGOTREF(__pyx_t_4);
+      /*try:*/ {
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1081
+ *         else:
+ *             try:
+ *                 await asyncio.wait_for(             # <<<<<<<<<<<<<<
+ *                     asyncio.shield(self._shutdown_completed),
+ *                     timeout,
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 1081, __pyx_L6_error)
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_wait_for); if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 1081, __pyx_L6_error)
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1082
+ *             try:
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),             # <<<<<<<<<<<<<<
+ *                     timeout,
+ *                 )
+ */
+        __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_8)) __PYX_ERR(9, 1082, __pyx_L6_error)
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_shield); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 1082, __pyx_L6_error)
+        __Pyx_GOTREF(__pyx_t_9);
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __pyx_t_8 = NULL;
+        __pyx_t_10 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_9))) {
+          __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_9);
+          if (likely(__pyx_t_8)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
+            __Pyx_INCREF(__pyx_t_8);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_9, function);
+            __pyx_t_10 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_cur_scope->__pyx_v_self->_shutdown_completed};
+          __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10);
+          __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 1082, __pyx_L6_error)
+          __Pyx_GOTREF(__pyx_t_6);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1083
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),
+ *                     timeout,             # <<<<<<<<<<<<<<
+ *                 )
+ *             except asyncio.TimeoutError:
+ */
+        __pyx_t_9 = NULL;
+        __pyx_t_10 = 0;
+        #if CYTHON_UNPACK_METHODS
+        if (unlikely(PyMethod_Check(__pyx_t_7))) {
+          __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7);
+          if (likely(__pyx_t_9)) {
+            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+            __Pyx_INCREF(__pyx_t_9);
+            __Pyx_INCREF(function);
+            __Pyx_DECREF_SET(__pyx_t_7, function);
+            __pyx_t_10 = 1;
+          }
+        }
+        #endif
+        {
+          PyObject *__pyx_callargs[3] = {__pyx_t_9, __pyx_t_6, __pyx_cur_scope->__pyx_v_timeout};
+          __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_10, 2+__pyx_t_10);
+          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          if (unlikely(!__pyx_t_5)) __PYX_ERR(9, 1081, __pyx_L6_error)
+          __Pyx_GOTREF(__pyx_t_5);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        }
+        __pyx_r = __Pyx_Coroutine_Yield_From(__pyx_generator, __pyx_t_5);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_XGOTREF(__pyx_r);
+        if (likely(__pyx_r)) {
+          __Pyx_XGIVEREF(__pyx_t_2);
+          __pyx_cur_scope->__pyx_t_0 = __pyx_t_2;
+          __Pyx_XGIVEREF(__pyx_t_3);
+          __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
+          __Pyx_XGIVEREF(__pyx_t_4);
+          __pyx_cur_scope->__pyx_t_2 = __pyx_t_4;
+          __Pyx_XGIVEREF(__pyx_r);
+          __Pyx_RefNannyFinishContext();
+          __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+          /* return from generator, awaiting value */
+          __pyx_generator->resume_label = 2;
+          return __pyx_r;
+          __pyx_L12_resume_from_await:;
+          __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_cur_scope->__pyx_t_1 = 0;
+          __Pyx_XGOTREF(__pyx_t_3);
+          __pyx_t_4 = __pyx_cur_scope->__pyx_t_2;
+          __pyx_cur_scope->__pyx_t_2 = 0;
+          __Pyx_XGOTREF(__pyx_t_4);
+          if (unlikely(!__pyx_sent_value)) __PYX_ERR(9, 1081, __pyx_L6_error)
+        } else {
+          PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType();
+          if (exc_type) {
+            if (likely(exc_type == PyExc_StopIteration || (exc_type != PyExc_GeneratorExit && __Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))) PyErr_Clear();
+            else __PYX_ERR(9, 1081, __pyx_L6_error)
+          }
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1080
+ *             await self._shutdown_completed
+ *         else:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),
+ */
+      }
+      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+      goto __pyx_L11_try_end;
+      __pyx_L6_error:;
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1085
+ *                     timeout,
+ *                 )
+ *             except asyncio.TimeoutError:             # <<<<<<<<<<<<<<
+ *                 if self._crash_exception is not None:
+ *                     raise self._crash_exception
+ */
+      __Pyx_ErrFetch(&__pyx_t_5, &__pyx_t_7, &__pyx_t_6);
+      __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_asyncio); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 1085, __pyx_L8_except_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_TimeoutError); if (unlikely(!__pyx_t_8)) __PYX_ERR(9, 1085, __pyx_L8_except_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_11 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_5, __pyx_t_8);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_ErrRestore(__pyx_t_5, __pyx_t_7, __pyx_t_6);
+      __pyx_t_5 = 0; __pyx_t_7 = 0; __pyx_t_6 = 0;
+      if (__pyx_t_11) {
+        __Pyx_AddTraceback("_cython.cygrpc.AioServer.wait_for_termination", __pyx_clineno, __pyx_lineno, __pyx_filename);
+        if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_7, &__pyx_t_5) < 0) __PYX_ERR(9, 1085, __pyx_L8_except_error)
+        __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
+        __Pyx_XGOTREF(__pyx_t_5);
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1086
+ *                 )
+ *             except asyncio.TimeoutError:
+ *                 if self._crash_exception is not None:             # <<<<<<<<<<<<<<
+ *                     raise self._crash_exception
+ *                 return True
+ */
+        __pyx_t_1 = (__pyx_cur_scope->__pyx_v_self->_crash_exception != Py_None);
+        if (unlikely(__pyx_t_1)) {
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1087
+ *             except asyncio.TimeoutError:
+ *                 if self._crash_exception is not None:
+ *                     raise self._crash_exception             # <<<<<<<<<<<<<<
+ *                 return True
+ *         if self._crash_exception is not None:
+ */
+          __Pyx_Raise(__pyx_cur_scope->__pyx_v_self->_crash_exception, 0, 0, 0);
+          __PYX_ERR(9, 1087, __pyx_L8_except_error)
+
+          /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1086
+ *                 )
+ *             except asyncio.TimeoutError:
+ *                 if self._crash_exception is not None:             # <<<<<<<<<<<<<<
+ *                     raise self._crash_exception
+ *                 return True
+ */
+        }
+
+        /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1088
+ *                 if self._crash_exception is not None:
+ *                     raise self._crash_exception
+ *                 return True             # <<<<<<<<<<<<<<
+ *         if self._crash_exception is not None:
+ *             raise self._crash_exception
+ */
+        __Pyx_XDECREF(__pyx_r);
+        __pyx_r = NULL; __Pyx_ReturnWithStopIteration(Py_True);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L9_except_return;
+      }
+      goto __pyx_L8_except_error;
+
+      /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1080
+ *             await self._shutdown_completed
+ *         else:
+ *             try:             # <<<<<<<<<<<<<<
+ *                 await asyncio.wait_for(
+ *                     asyncio.shield(self._shutdown_completed),
+ */
+      __pyx_L8_except_error:;
+      __Pyx_XGIVEREF(__pyx_t_2);
+      __Pyx_XGIVEREF(__pyx_t_3);
+      __Pyx_XGIVEREF(__pyx_t_4);
+      __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4);
+      goto __pyx_L1_error;
+      __pyx_L9_except_return:;
+      __Pyx_XGIVEREF(__pyx_t_2);
+      __Pyx_XGIVEREF(__pyx_t_3);
+      __Pyx_XGIVEREF(__pyx_t_4);
+      __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4);
+      goto __pyx_L0;
+      __pyx_L11_try_end:;
+    }
+  }
+  __pyx_L4:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1089
+ *                     raise self._crash_exception
+ *                 return True
+ *         if self._crash_exception is not None:             # <<<<<<<<<<<<<<
+ *             raise self._crash_exception
+ *         return False
+ */
+  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_self->_crash_exception != Py_None);
+  if (unlikely(__pyx_t_1)) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1090
+ *                 return True
+ *         if self._crash_exception is not None:
+ *             raise self._crash_exception             # <<<<<<<<<<<<<<
+ *         return False
+ * 
+ */
+    __Pyx_Raise(__pyx_cur_scope->__pyx_v_self->_crash_exception, 0, 0, 0);
+    __PYX_ERR(9, 1090, __pyx_L1_error)
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1089
+ *                     raise self._crash_exception
+ *                 return True
+ *         if self._crash_exception is not None:             # <<<<<<<<<<<<<<
+ *             raise self._crash_exception
+ *         return False
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1091
+ *         if self._crash_exception is not None:
+ *             raise self._crash_exception
+ *         return False             # <<<<<<<<<<<<<<
+ * 
+ *     def __dealloc__(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_r = NULL; __Pyx_ReturnWithStopIteration(Py_False);
+  goto __pyx_L0;
+  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1076
+ *                 self._status = AIO_SERVER_STATUS_STOPPED
+ * 
+ *     async def wait_for_termination(self, object timeout):             # <<<<<<<<<<<<<<
+ *         if timeout is None:
+ *             await self._shutdown_completed
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_Generator_Replace_StopIteration(0);
+  __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("wait_for_termination", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
+  #if !CYTHON_USE_EXC_INFO_STACK
+  __Pyx_Coroutine_ResetAndClearException(__pyx_generator);
+  #endif
+  __pyx_generator->resume_label = -1;
+  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1093
+ *         return False
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         """Deallocation of Core objects are ensured by Python layer."""
+ *         # TODO(lidiz) if users create server, and then dealloc it immediately.
+ */
+
+/* Python wrapper */
+static void __pyx_pw_7_cython_6cygrpc_9AioServer_29__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_7_cython_6cygrpc_9AioServer_29__dealloc__(PyObject *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
+  __pyx_pf_7_cython_6cygrpc_9AioServer_28__dealloc__(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
+
+static void __pyx_pf_7_cython_6cygrpc_9AioServer_28__dealloc__(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  unsigned int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__dealloc__", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1097
+ *         # TODO(lidiz) if users create server, and then dealloc it immediately.
+ *         # There is a potential memory leak of created Core server.
+ *         if self._status != AIO_SERVER_STATUS_STOPPED:             # <<<<<<<<<<<<<<
+ *             _LOGGER.debug(
+ *                 '__dealloc__ called on running server %s with status %d',
+ */
+  __pyx_t_1 = (__pyx_v_self->_status != __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_STOPPED);
+  if (__pyx_t_1) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1098
+ *         # There is a potential memory leak of created Core server.
+ *         if self._status != AIO_SERVER_STATUS_STOPPED:
+ *             _LOGGER.debug(             # <<<<<<<<<<<<<<
+ *                 '__dealloc__ called on running server %s with status %d',
+ *                 self,
+ */
+    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_LOGGER); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1098, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_debug); if (unlikely(!__pyx_t_4)) __PYX_ERR(9, 1098, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1101
+ *                 '__dealloc__ called on running server %s with status %d',
+ *                 self,
+ *                 self._status             # <<<<<<<<<<<<<<
+ *             )
+ *         shutdown_grpc_aio()
+ */
+    __pyx_t_3 = __Pyx_PyInt_From_enum____pyx_t_7_cython_6cygrpc_AioServerStatus(__pyx_v_self->_status); if (unlikely(!__pyx_t_3)) __PYX_ERR(9, 1101, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = NULL;
+    __pyx_t_6 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (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;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[4] = {__pyx_t_5, __pyx_kp_s_dealloc___called_on_running_se, ((PyObject *)__pyx_v_self), __pyx_t_3};
+      __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 3+__pyx_t_6);
+      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1098, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1097
+ *         # TODO(lidiz) if users create server, and then dealloc it immediately.
+ *         # There is a potential memory leak of created Core server.
+ *         if self._status != AIO_SERVER_STATUS_STOPPED:             # <<<<<<<<<<<<<<
+ *             _LOGGER.debug(
+ *                 '__dealloc__ called on running server %s with status %d',
+ */
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1103
+ *                 self._status
+ *             )
+ *         shutdown_grpc_aio()             # <<<<<<<<<<<<<<
+ * 
+ *     cdef thread_pool(self):
+ */
+  __pyx_t_2 = __pyx_f_7_cython_6cygrpc_shutdown_grpc_aio(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 1103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1093
+ *         return False
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         """Deallocation of Core objects are ensured by Python layer."""
+ *         # TODO(lidiz) if users create server, and then dealloc it immediately.
+ */
+
+  /* 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_XDECREF(__pyx_t_5);
+  __Pyx_WriteUnraisable("_cython.cygrpc.AioServer.__dealloc__", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1105
+ *         shutdown_grpc_aio()
+ * 
+ *     cdef thread_pool(self):             # <<<<<<<<<<<<<<
+ *         """Access the thread pool instance."""
+ *         return self._thread_pool
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc_9AioServer_thread_pool(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("thread_pool", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1107
+ *     cdef thread_pool(self):
+ *         """Access the thread pool instance."""
+ *         return self._thread_pool             # <<<<<<<<<<<<<<
+ * 
+ *     def is_running(self):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->_thread_pool);
+  __pyx_r = __pyx_v_self->_thread_pool;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1105
+ *         shutdown_grpc_aio()
+ * 
+ *     cdef thread_pool(self):             # <<<<<<<<<<<<<<
+ *         """Access the thread pool instance."""
+ *         return self._thread_pool
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1109
+ *         return self._thread_pool
+ * 
+ *     def is_running(self):             # <<<<<<<<<<<<<<
+ *         return self._status == AIO_SERVER_STATUS_RUNNING
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_31is_running(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_31is_running = {"is_running", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_31is_running, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_31is_running(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_running (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("is_running", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "is_running", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_30is_running(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_30is_running(struct __pyx_obj_7_cython_6cygrpc_AioServer *__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("is_running", 1);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1110
+ * 
+ *     def is_running(self):
+ *         return self._status == AIO_SERVER_STATUS_RUNNING             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_self->_status == __pyx_e_7_cython_6cygrpc_AIO_SERVER_STATUS_RUNNING)); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 1110, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1109
+ *         return self._thread_pool
+ * 
+ *     def is_running(self):             # <<<<<<<<<<<<<<
+ *         return self._status == AIO_SERVER_STATUS_RUNNING
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.is_running", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_33__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_33__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_33__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_33__reduce_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  if (unlikely(__pyx_nargs > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;}
+  if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_32__reduce_cython__(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self));
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_32__reduce_cython__(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self) {
+  PyObject *__pyx_v_state = 0;
+  PyObject *__pyx_v__dict = 0;
+  int __pyx_v_use_setstate;
+  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;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__reduce_cython__", 1);
+
+  /* "(tree fragment)":5
+ *     cdef object _dict
+ *     cdef bint use_setstate
+ *     state = (self._crash_exception, self._generic_handlers, self._interceptors, self._limiter, self._loop, self._server, self._serving_task, self._shutdown_callback_wrapper, self._shutdown_completed, self._shutdown_lock, self._status, self._thread_pool)             # <<<<<<<<<<<<<<
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_enum____pyx_t_7_cython_6cygrpc_AioServerStatus(__pyx_v_self->_status); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(12); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 5, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_self->_crash_exception);
+  __Pyx_GIVEREF(__pyx_v_self->_crash_exception);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->_crash_exception)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_generic_handlers);
+  __Pyx_GIVEREF(__pyx_v_self->_generic_handlers);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->_generic_handlers)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_interceptors);
+  __Pyx_GIVEREF(__pyx_v_self->_interceptors);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->_interceptors)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->_limiter);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_self->_limiter);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 3, ((PyObject *)__pyx_v_self->_limiter))) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_loop);
+  __Pyx_GIVEREF(__pyx_v_self->_loop);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_v_self->_loop)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->_server);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_self->_server);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 5, ((PyObject *)__pyx_v_self->_server))) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_serving_task);
+  __Pyx_GIVEREF(__pyx_v_self->_serving_task);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 6, __pyx_v_self->_serving_task)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF((PyObject *)__pyx_v_self->_shutdown_callback_wrapper);
+  __Pyx_GIVEREF((PyObject *)__pyx_v_self->_shutdown_callback_wrapper);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 7, ((PyObject *)__pyx_v_self->_shutdown_callback_wrapper))) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_shutdown_completed);
+  __Pyx_GIVEREF(__pyx_v_self->_shutdown_completed);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 8, __pyx_v_self->_shutdown_completed)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_shutdown_lock);
+  __Pyx_GIVEREF(__pyx_v_self->_shutdown_lock);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 9, __pyx_v_self->_shutdown_lock)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_1);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 10, __pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_v_self->_thread_pool);
+  __Pyx_GIVEREF(__pyx_v_self->_thread_pool);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 11, __pyx_v_self->_thread_pool)) __PYX_ERR(10, 5, __pyx_L1_error);
+  __pyx_t_1 = 0;
+  __pyx_v_state = ((PyObject*)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "(tree fragment)":6
+ *     cdef bint use_setstate
+ *     state = (self._crash_exception, self._generic_handlers, self._interceptors, self._limiter, self._loop, self._server, self._serving_task, self._shutdown_callback_wrapper, self._shutdown_completed, self._shutdown_lock, self._status, self._thread_pool)
+ *     _dict = getattr(self, '__dict__', None)             # <<<<<<<<<<<<<<
+ *     if _dict is not None:
+ *         state += (_dict,)
+ */
+  __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 6, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_v__dict = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+  /* "(tree fragment)":7
+ *     state = (self._crash_exception, self._generic_handlers, self._interceptors, self._limiter, self._loop, self._server, self._serving_task, self._shutdown_callback_wrapper, self._shutdown_completed, self._shutdown_lock, self._status, self._thread_pool)
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+  __pyx_t_3 = (__pyx_v__dict != Py_None);
+  if (__pyx_t_3) {
+
+    /* "(tree fragment)":8
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:
+ *         state += (_dict,)             # <<<<<<<<<<<<<<
+ *         use_setstate = True
+ *     else:
+ */
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF(__pyx_v__dict);
+    __Pyx_GIVEREF(__pyx_v__dict);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict)) __PYX_ERR(10, 8, __pyx_L1_error);
+    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 8, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1));
+    __pyx_t_1 = 0;
+
+    /* "(tree fragment)":9
+ *     if _dict is not None:
+ *         state += (_dict,)
+ *         use_setstate = True             # <<<<<<<<<<<<<<
+ *     else:
+ *         use_setstate = self._crash_exception is not None or self._generic_handlers is not None or self._interceptors is not None or self._limiter is not None or self._loop is not None or self._server is not None or self._serving_task is not None or self._shutdown_callback_wrapper is not None or self._shutdown_completed is not None or self._shutdown_lock is not None or self._thread_pool is not None
+ */
+    __pyx_v_use_setstate = 1;
+
+    /* "(tree fragment)":7
+ *     state = (self._crash_exception, self._generic_handlers, self._interceptors, self._limiter, self._loop, self._server, self._serving_task, self._shutdown_callback_wrapper, self._shutdown_completed, self._shutdown_lock, self._status, self._thread_pool)
+ *     _dict = getattr(self, '__dict__', None)
+ *     if _dict is not None:             # <<<<<<<<<<<<<<
+ *         state += (_dict,)
+ *         use_setstate = True
+ */
+    goto __pyx_L3;
+  }
+
+  /* "(tree fragment)":11
+ *         use_setstate = True
+ *     else:
+ *         use_setstate = self._crash_exception is not None or self._generic_handlers is not None or self._interceptors is not None or self._limiter is not None or self._loop is not None or self._server is not None or self._serving_task is not None or self._shutdown_callback_wrapper is not None or self._shutdown_completed is not None or self._shutdown_lock is not None or self._thread_pool is not None             # <<<<<<<<<<<<<<
+ *     if use_setstate:
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, None), state
+ */
+  /*else*/ {
+    __pyx_t_4 = (__pyx_v_self->_crash_exception != Py_None);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (__pyx_v_self->_generic_handlers != ((PyObject*)Py_None));
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (__pyx_v_self->_interceptors != ((PyObject*)Py_None));
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (((PyObject *)__pyx_v_self->_limiter) != Py_None);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (__pyx_v_self->_loop != Py_None);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (((PyObject *)__pyx_v_self->_server) != Py_None);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (__pyx_v_self->_serving_task != Py_None);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (((PyObject *)__pyx_v_self->_shutdown_callback_wrapper) != Py_None);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (__pyx_v_self->_shutdown_completed != Py_None);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (__pyx_v_self->_shutdown_lock != Py_None);
+    if (!__pyx_t_4) {
+    } else {
+      __pyx_t_3 = __pyx_t_4;
+      goto __pyx_L4_bool_binop_done;
+    }
+    __pyx_t_4 = (__pyx_v_self->_thread_pool != Py_None);
+    __pyx_t_3 = __pyx_t_4;
+    __pyx_L4_bool_binop_done:;
+    __pyx_v_use_setstate = __pyx_t_3;
+  }
+  __pyx_L3:;
+
+  /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = self._crash_exception is not None or self._generic_handlers is not None or self._interceptors is not None or self._limiter is not None or self._loop is not None or self._server is not None or self._serving_task is not None or self._shutdown_callback_wrapper is not None or self._shutdown_completed is not None or self._shutdown_lock is not None or self._thread_pool is not None
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, None), state
+ *     else:
+ */
+  if (__pyx_v_use_setstate) {
+
+    /* "(tree fragment)":13
+ *         use_setstate = self._crash_exception is not None or self._generic_handlers is not None or self._interceptors is not None or self._limiter is not None or self._loop is not None or self._server is not None or self._serving_task is not None or self._shutdown_callback_wrapper is not None or self._shutdown_completed is not None or self._shutdown_lock is not None or self._thread_pool is not None
+ *     if use_setstate:
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, None), state             # <<<<<<<<<<<<<<
+ *     else:
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, state)
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle_AioServer); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_171651213);
+    __Pyx_GIVEREF(__pyx_int_171651213);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_171651213)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GIVEREF(__pyx_t_1);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_2);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state)) __PYX_ERR(10, 13, __pyx_L1_error);
+    __pyx_t_1 = 0;
+    __pyx_t_2 = 0;
+    __pyx_r = __pyx_t_5;
+    __pyx_t_5 = 0;
+    goto __pyx_L0;
+
+    /* "(tree fragment)":12
+ *     else:
+ *         use_setstate = self._crash_exception is not None or self._generic_handlers is not None or self._interceptors is not None or self._limiter is not None or self._loop is not None or self._server is not None or self._serving_task is not None or self._shutdown_callback_wrapper is not None or self._shutdown_completed is not None or self._shutdown_lock is not None or self._thread_pool is not None
+ *     if use_setstate:             # <<<<<<<<<<<<<<
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, None), state
+ *     else:
+ */
+  }
+
+  /* "(tree fragment)":15
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, None), state
+ *     else:
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, state)             # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle_AioServer__set_state(self, __pyx_state)
+ */
+  /*else*/ {
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_AioServer); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_int_171651213);
+    __Pyx_GIVEREF(__pyx_int_171651213);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_171651213)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_INCREF(__pyx_v_state);
+    __Pyx_GIVEREF(__pyx_v_state);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 15, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GIVEREF(__pyx_t_5);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __Pyx_GIVEREF(__pyx_t_2);
+    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2)) __PYX_ERR(10, 15, __pyx_L1_error);
+    __pyx_t_5 = 0;
+    __pyx_t_2 = 0;
+    __pyx_r = __pyx_t_1;
+    __pyx_t_1 = 0;
+    goto __pyx_L0;
+  }
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_state);
+  __Pyx_XDECREF(__pyx_v__dict);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_AioServer__set_state(self, __pyx_state)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_35__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_9AioServer_35__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_35__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_9AioServer_35__setstate_cython__(PyObject *__pyx_v_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[1] = {0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 16, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(10, 16, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 1)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+    }
+    __pyx_v___pyx_state = values[0];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(10, 16, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_9AioServer_34__setstate_cython__(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v_self), __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_9AioServer_34__setstate_cython__(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+  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("__setstate_cython__", 1);
+
+  /* "(tree fragment)":17
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, state)
+ * def __setstate_cython__(self, __pyx_state):
+ *     __pyx_unpickle_AioServer__set_state(self, __pyx_state)             # <<<<<<<<<<<<<<
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 17, __pyx_L1_error)
+  __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle_AioServer__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_AioServer__set_state(self, __pyx_state)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("_cython.cygrpc.AioServer.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "_cython/cygrpc.pyx":83
+ * # initialize gRPC
+ * #
+ * cdef _initialize():             # <<<<<<<<<<<<<<
+ *   grpc_set_ssl_roots_override_callback(
+ *           <grpc_ssl_roots_override_callback>ssl_roots_override_callback)
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc__initialize(void) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("_initialize", 1);
+
+  /* "_cython/cygrpc.pyx":84
+ * #
+ * cdef _initialize():
+ *   grpc_set_ssl_roots_override_callback(             # <<<<<<<<<<<<<<
+ *           <grpc_ssl_roots_override_callback>ssl_roots_override_callback)
+ * 
+ */
+  grpc_set_ssl_roots_override_callback(((grpc_ssl_roots_override_callback)__pyx_f_7_cython_6cygrpc_ssl_roots_override_callback));
+
+  /* "_cython/cygrpc.pyx":83
+ * # initialize gRPC
+ * #
+ * cdef _initialize():             # <<<<<<<<<<<<<<
+ *   grpc_set_ssl_roots_override_callback(
+ *           <grpc_ssl_roots_override_callback>ssl_roots_override_callback)
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __pyx_unpickle_ChannelCredentials(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_189__pyx_unpickle_ChannelCredentials(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_189__pyx_unpickle_ChannelCredentials = {"__pyx_unpickle_ChannelCredentials", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_189__pyx_unpickle_ChannelCredentials, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_189__pyx_unpickle_ChannelCredentials(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_type = 0;
+  long __pyx_v___pyx_checksum;
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__pyx_unpickle_ChannelCredentials (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ChannelCredentials", 1, 3, 3, 1); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ChannelCredentials", 1, 3, 3, 2); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_ChannelCredentials") < 0)) __PYX_ERR(10, 1, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v___pyx_type = values[0];
+    __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+    __pyx_v___pyx_state = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_ChannelCredentials", 1, 3, 3, __pyx_nargs); __PYX_ERR(10, 1, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_ChannelCredentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_188__pyx_unpickle_ChannelCredentials(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_188__pyx_unpickle_ChannelCredentials(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_v___pyx_PickleError = 0;
+  PyObject *__pyx_v___pyx_result = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle_ChannelCredentials", 1);
+
+  /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__105, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":5
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):
+ *         from pickle import PickleError as __pyx_PickleError             # <<<<<<<<<<<<<<
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = ChannelCredentials.__new__(__pyx_type)
+ */
+    __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_n_s_PickleError);
+    __Pyx_GIVEREF(__pyx_n_s_PickleError);
+    if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(10, 5, __pyx_L1_error);
+    __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_t_1);
+    __pyx_v___pyx_PickleError = __pyx_t_1;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "(tree fragment)":6
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum             # <<<<<<<<<<<<<<
+ *     __pyx_result = ChannelCredentials.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ */
+    __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(10, 6, __pyx_L1_error)
+
+    /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  }
+
+  /* "(tree fragment)":7
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = ChannelCredentials.__new__(__pyx_type)             # <<<<<<<<<<<<<<
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_ChannelCredentials__set_state(<ChannelCredentials> __pyx_result, __pyx_state)
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 7, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 7, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v___pyx_result = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = ChannelCredentials.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle_ChannelCredentials__set_state(<ChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  __pyx_t_2 = (__pyx_v___pyx_state != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":9
+ *     __pyx_result = ChannelCredentials.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_ChannelCredentials__set_state(<ChannelCredentials> __pyx_result, __pyx_state)             # <<<<<<<<<<<<<<
+ *     return __pyx_result
+ * cdef __pyx_unpickle_ChannelCredentials__set_state(ChannelCredentials __pyx_result, tuple __pyx_state):
+ */
+    if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 9, __pyx_L1_error)
+    __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle_ChannelCredentials__set_state(((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 9, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = ChannelCredentials.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle_ChannelCredentials__set_state(<ChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  }
+
+  /* "(tree fragment)":10
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_ChannelCredentials__set_state(<ChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result             # <<<<<<<<<<<<<<
+ * cdef __pyx_unpickle_ChannelCredentials__set_state(ChannelCredentials __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v___pyx_result);
+  __pyx_r = __pyx_v___pyx_result;
+  goto __pyx_L0;
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle_ChannelCredentials(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_ChannelCredentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v___pyx_PickleError);
+  __Pyx_XDECREF(__pyx_v___pyx_result);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":11
+ *         __pyx_unpickle_ChannelCredentials__set_state(<ChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_ChannelCredentials__set_state(ChannelCredentials __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle_ChannelCredentials__set_state(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  unsigned int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle_ChannelCredentials__set_state", 1);
+
+  /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle_ChannelCredentials__set_state(ChannelCredentials __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __pyx_t_3 = (__pyx_t_2 > 0);
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_1 = __pyx_t_3;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_3 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_L4_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "(tree fragment)":13
+ * cdef __pyx_unpickle_ChannelCredentials__set_state(ChannelCredentials __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])             # <<<<<<<<<<<<<<
+ */
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(__pyx_v___pyx_state == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      __PYX_ERR(10, 13, __pyx_L1_error)
+    }
+    __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_7 = NULL;
+    __pyx_t_8 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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);
+        __pyx_t_8 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 13, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle_ChannelCredentials__set_state(ChannelCredentials __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  }
+
+  /* "(tree fragment)":11
+ *         __pyx_unpickle_ChannelCredentials__set_state(<ChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_ChannelCredentials__set_state(ChannelCredentials __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __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("_cython.cygrpc.__pyx_unpickle_ChannelCredentials__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __pyx_unpickle_InsecureChannelCredentials(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_191__pyx_unpickle_InsecureChannelCredentials(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_191__pyx_unpickle_InsecureChannelCredentials = {"__pyx_unpickle_InsecureChannelCredentials", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_191__pyx_unpickle_InsecureChannelCredentials, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_191__pyx_unpickle_InsecureChannelCredentials(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_type = 0;
+  long __pyx_v___pyx_checksum;
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__pyx_unpickle_InsecureChannelCredentials (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_InsecureChannelCredentials", 1, 3, 3, 1); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_InsecureChannelCredentials", 1, 3, 3, 2); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_InsecureChannelCredentials") < 0)) __PYX_ERR(10, 1, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v___pyx_type = values[0];
+    __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+    __pyx_v___pyx_state = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_InsecureChannelCredentials", 1, 3, 3, __pyx_nargs); __PYX_ERR(10, 1, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_InsecureChannelCredentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_190__pyx_unpickle_InsecureChannelCredentials(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_190__pyx_unpickle_InsecureChannelCredentials(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_v___pyx_PickleError = 0;
+  PyObject *__pyx_v___pyx_result = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle_InsecureChannelCredentials", 1);
+
+  /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__105, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":5
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):
+ *         from pickle import PickleError as __pyx_PickleError             # <<<<<<<<<<<<<<
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = InsecureChannelCredentials.__new__(__pyx_type)
+ */
+    __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_n_s_PickleError);
+    __Pyx_GIVEREF(__pyx_n_s_PickleError);
+    if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(10, 5, __pyx_L1_error);
+    __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_t_1);
+    __pyx_v___pyx_PickleError = __pyx_t_1;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "(tree fragment)":6
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum             # <<<<<<<<<<<<<<
+ *     __pyx_result = InsecureChannelCredentials.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ */
+    __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(10, 6, __pyx_L1_error)
+
+    /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  }
+
+  /* "(tree fragment)":7
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = InsecureChannelCredentials.__new__(__pyx_type)             # <<<<<<<<<<<<<<
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_InsecureChannelCredentials__set_state(<InsecureChannelCredentials> __pyx_result, __pyx_state)
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 7, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 7, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v___pyx_result = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = InsecureChannelCredentials.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle_InsecureChannelCredentials__set_state(<InsecureChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  __pyx_t_2 = (__pyx_v___pyx_state != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":9
+ *     __pyx_result = InsecureChannelCredentials.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_InsecureChannelCredentials__set_state(<InsecureChannelCredentials> __pyx_result, __pyx_state)             # <<<<<<<<<<<<<<
+ *     return __pyx_result
+ * cdef __pyx_unpickle_InsecureChannelCredentials__set_state(InsecureChannelCredentials __pyx_result, tuple __pyx_state):
+ */
+    if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 9, __pyx_L1_error)
+    __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle_InsecureChannelCredentials__set_state(((struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 9, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = InsecureChannelCredentials.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle_InsecureChannelCredentials__set_state(<InsecureChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  }
+
+  /* "(tree fragment)":10
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_InsecureChannelCredentials__set_state(<InsecureChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result             # <<<<<<<<<<<<<<
+ * cdef __pyx_unpickle_InsecureChannelCredentials__set_state(InsecureChannelCredentials __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v___pyx_result);
+  __pyx_r = __pyx_v___pyx_result;
+  goto __pyx_L0;
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle_InsecureChannelCredentials(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_InsecureChannelCredentials", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v___pyx_PickleError);
+  __Pyx_XDECREF(__pyx_v___pyx_result);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":11
+ *         __pyx_unpickle_InsecureChannelCredentials__set_state(<InsecureChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_InsecureChannelCredentials__set_state(InsecureChannelCredentials __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle_InsecureChannelCredentials__set_state(struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  unsigned int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle_InsecureChannelCredentials__set_state", 1);
+
+  /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle_InsecureChannelCredentials__set_state(InsecureChannelCredentials __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __pyx_t_3 = (__pyx_t_2 > 0);
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_1 = __pyx_t_3;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_3 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_L4_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "(tree fragment)":13
+ * cdef __pyx_unpickle_InsecureChannelCredentials__set_state(InsecureChannelCredentials __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])             # <<<<<<<<<<<<<<
+ */
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(__pyx_v___pyx_state == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      __PYX_ERR(10, 13, __pyx_L1_error)
+    }
+    __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_7 = NULL;
+    __pyx_t_8 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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);
+        __pyx_t_8 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 13, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle_InsecureChannelCredentials__set_state(InsecureChannelCredentials __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  }
+
+  /* "(tree fragment)":11
+ *         __pyx_unpickle_InsecureChannelCredentials__set_state(<InsecureChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_InsecureChannelCredentials__set_state(InsecureChannelCredentials __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __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("_cython.cygrpc.__pyx_unpickle_InsecureChannelCredentials__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __pyx_unpickle__Tag(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_193__pyx_unpickle__Tag(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_193__pyx_unpickle__Tag = {"__pyx_unpickle__Tag", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_193__pyx_unpickle__Tag, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_193__pyx_unpickle__Tag(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_type = 0;
+  long __pyx_v___pyx_checksum;
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__pyx_unpickle__Tag (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Tag", 1, 3, 3, 1); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Tag", 1, 3, 3, 2); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle__Tag") < 0)) __PYX_ERR(10, 1, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v___pyx_type = values[0];
+    __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+    __pyx_v___pyx_state = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Tag", 1, 3, 3, __pyx_nargs); __PYX_ERR(10, 1, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle__Tag", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_192__pyx_unpickle__Tag(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_192__pyx_unpickle__Tag(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_v___pyx_PickleError = 0;
+  PyObject *__pyx_v___pyx_result = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle__Tag", 1);
+
+  /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__105, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":5
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):
+ *         from pickle import PickleError as __pyx_PickleError             # <<<<<<<<<<<<<<
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = _Tag.__new__(__pyx_type)
+ */
+    __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_n_s_PickleError);
+    __Pyx_GIVEREF(__pyx_n_s_PickleError);
+    if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(10, 5, __pyx_L1_error);
+    __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_t_1);
+    __pyx_v___pyx_PickleError = __pyx_t_1;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "(tree fragment)":6
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum             # <<<<<<<<<<<<<<
+ *     __pyx_result = _Tag.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ */
+    __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(10, 6, __pyx_L1_error)
+
+    /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  }
+
+  /* "(tree fragment)":7
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = _Tag.__new__(__pyx_type)             # <<<<<<<<<<<<<<
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle__Tag__set_state(<_Tag> __pyx_result, __pyx_state)
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7_cython_6cygrpc__Tag), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 7, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 7, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v___pyx_result = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = _Tag.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle__Tag__set_state(<_Tag> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  __pyx_t_2 = (__pyx_v___pyx_state != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":9
+ *     __pyx_result = _Tag.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle__Tag__set_state(<_Tag> __pyx_result, __pyx_state)             # <<<<<<<<<<<<<<
+ *     return __pyx_result
+ * cdef __pyx_unpickle__Tag__set_state(_Tag __pyx_result, tuple __pyx_state):
+ */
+    if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 9, __pyx_L1_error)
+    __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle__Tag__set_state(((struct __pyx_obj_7_cython_6cygrpc__Tag *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 9, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = _Tag.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle__Tag__set_state(<_Tag> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  }
+
+  /* "(tree fragment)":10
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle__Tag__set_state(<_Tag> __pyx_result, __pyx_state)
+ *     return __pyx_result             # <<<<<<<<<<<<<<
+ * cdef __pyx_unpickle__Tag__set_state(_Tag __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v___pyx_result);
+  __pyx_r = __pyx_v___pyx_result;
+  goto __pyx_L0;
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle__Tag(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle__Tag", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v___pyx_PickleError);
+  __Pyx_XDECREF(__pyx_v___pyx_result);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":11
+ *         __pyx_unpickle__Tag__set_state(<_Tag> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle__Tag__set_state(_Tag __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle__Tag__set_state(struct __pyx_obj_7_cython_6cygrpc__Tag *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  unsigned int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle__Tag__set_state", 1);
+
+  /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle__Tag__set_state(_Tag __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __pyx_t_3 = (__pyx_t_2 > 0);
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_1 = __pyx_t_3;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_3 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_L4_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "(tree fragment)":13
+ * cdef __pyx_unpickle__Tag__set_state(_Tag __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])             # <<<<<<<<<<<<<<
+ */
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(__pyx_v___pyx_state == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      __PYX_ERR(10, 13, __pyx_L1_error)
+    }
+    __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_7 = NULL;
+    __pyx_t_8 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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);
+        __pyx_t_8 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 13, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle__Tag__set_state(_Tag __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  }
+
+  /* "(tree fragment)":11
+ *         __pyx_unpickle__Tag__set_state(<_Tag> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle__Tag__set_state(_Tag __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __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("_cython.cygrpc.__pyx_unpickle__Tag__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __pyx_unpickle_CensusContext(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_195__pyx_unpickle_CensusContext(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_195__pyx_unpickle_CensusContext = {"__pyx_unpickle_CensusContext", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_195__pyx_unpickle_CensusContext, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_195__pyx_unpickle_CensusContext(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_type = 0;
+  long __pyx_v___pyx_checksum;
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__pyx_unpickle_CensusContext (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_CensusContext", 1, 3, 3, 1); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_CensusContext", 1, 3, 3, 2); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_CensusContext") < 0)) __PYX_ERR(10, 1, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v___pyx_type = values[0];
+    __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+    __pyx_v___pyx_state = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_CensusContext", 1, 3, 3, __pyx_nargs); __PYX_ERR(10, 1, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_CensusContext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_194__pyx_unpickle_CensusContext(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_194__pyx_unpickle_CensusContext(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_v___pyx_PickleError = 0;
+  PyObject *__pyx_v___pyx_result = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle_CensusContext", 1);
+
+  /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__105, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":5
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):
+ *         from pickle import PickleError as __pyx_PickleError             # <<<<<<<<<<<<<<
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = CensusContext.__new__(__pyx_type)
+ */
+    __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_n_s_PickleError);
+    __Pyx_GIVEREF(__pyx_n_s_PickleError);
+    if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(10, 5, __pyx_L1_error);
+    __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_t_1);
+    __pyx_v___pyx_PickleError = __pyx_t_1;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "(tree fragment)":6
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum             # <<<<<<<<<<<<<<
+ *     __pyx_result = CensusContext.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ */
+    __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(10, 6, __pyx_L1_error)
+
+    /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  }
+
+  /* "(tree fragment)":7
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = CensusContext.__new__(__pyx_type)             # <<<<<<<<<<<<<<
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_CensusContext__set_state(<CensusContext> __pyx_result, __pyx_state)
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CensusContext), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 7, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 7, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v___pyx_result = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = CensusContext.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle_CensusContext__set_state(<CensusContext> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  __pyx_t_2 = (__pyx_v___pyx_state != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":9
+ *     __pyx_result = CensusContext.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_CensusContext__set_state(<CensusContext> __pyx_result, __pyx_state)             # <<<<<<<<<<<<<<
+ *     return __pyx_result
+ * cdef __pyx_unpickle_CensusContext__set_state(CensusContext __pyx_result, tuple __pyx_state):
+ */
+    if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 9, __pyx_L1_error)
+    __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle_CensusContext__set_state(((struct __pyx_obj_7_cython_6cygrpc_CensusContext *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 9, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ *     __pyx_result = CensusContext.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle_CensusContext__set_state(<CensusContext> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  }
+
+  /* "(tree fragment)":10
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_CensusContext__set_state(<CensusContext> __pyx_result, __pyx_state)
+ *     return __pyx_result             # <<<<<<<<<<<<<<
+ * cdef __pyx_unpickle_CensusContext__set_state(CensusContext __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v___pyx_result);
+  __pyx_r = __pyx_v___pyx_result;
+  goto __pyx_L0;
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle_CensusContext(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_CensusContext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v___pyx_PickleError);
+  __Pyx_XDECREF(__pyx_v___pyx_result);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":11
+ *         __pyx_unpickle_CensusContext__set_state(<CensusContext> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_CensusContext__set_state(CensusContext __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle_CensusContext__set_state(struct __pyx_obj_7_cython_6cygrpc_CensusContext *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  unsigned int __pyx_t_8;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle_CensusContext__set_state", 1);
+
+  /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle_CensusContext__set_state(CensusContext __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_2 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __pyx_t_3 = (__pyx_t_2 > 0);
+  if (__pyx_t_3) {
+  } else {
+    __pyx_t_1 = __pyx_t_3;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_3 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_L4_bool_binop_done:;
+  if (__pyx_t_1) {
+
+    /* "(tree fragment)":13
+ * cdef __pyx_unpickle_CensusContext__set_state(CensusContext __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])             # <<<<<<<<<<<<<<
+ */
+    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (unlikely(__pyx_v___pyx_state == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      __PYX_ERR(10, 13, __pyx_L1_error)
+    }
+    __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(10, 13, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_7 = NULL;
+    __pyx_t_8 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(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);
+        __pyx_t_8 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5};
+      __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
+      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (unlikely(!__pyx_t_4)) __PYX_ERR(10, 13, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+    /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle_CensusContext__set_state(CensusContext __pyx_result, tuple __pyx_state):
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  }
+
+  /* "(tree fragment)":11
+ *         __pyx_unpickle_CensusContext__set_state(<CensusContext> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_CensusContext__set_state(CensusContext __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+
+  /* function exit code */
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __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("_cython.cygrpc.__pyx_unpickle_CensusContext__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __pyx_unpickle_AioServer(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7_cython_6cygrpc_197__pyx_unpickle_AioServer(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+); /*proto*/
+static PyMethodDef __pyx_mdef_7_cython_6cygrpc_197__pyx_unpickle_AioServer = {"__pyx_unpickle_AioServer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_197__pyx_unpickle_AioServer, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_7_cython_6cygrpc_197__pyx_unpickle_AioServer(PyObject *__pyx_self, 
+#if CYTHON_METH_FASTCALL
+PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
+#else
+PyObject *__pyx_args, PyObject *__pyx_kwds
+#endif
+) {
+  PyObject *__pyx_v___pyx_type = 0;
+  long __pyx_v___pyx_checksum;
+  PyObject *__pyx_v___pyx_state = 0;
+  #if !CYTHON_METH_FASTCALL
+  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
+  #endif
+  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
+  PyObject* values[3] = {0,0,0};
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__pyx_unpickle_AioServer (wrapper)", 0);
+  #if !CYTHON_METH_FASTCALL
+  #if CYTHON_ASSUME_SAFE_MACROS
+  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
+  #else
+  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
+  #endif
+  #endif
+  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
+  {
+    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0};
+    if (__pyx_kwds) {
+      Py_ssize_t kw_args;
+      switch (__pyx_nargs) {
+        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
+      switch (__pyx_nargs) {
+        case  0:
+        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_AioServer", 1, 3, 3, 1); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) {
+          (void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
+          kw_args--;
+        }
+        else if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+        else {
+          __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_AioServer", 1, 3, 3, 2); __PYX_ERR(10, 1, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        const Py_ssize_t kwd_pos_args = __pyx_nargs;
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_AioServer") < 0)) __PYX_ERR(10, 1, __pyx_L3_error)
+      }
+    } else if (unlikely(__pyx_nargs != 3)) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
+      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
+      values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
+    }
+    __pyx_v___pyx_type = values[0];
+    __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(10, 1, __pyx_L3_error)
+    __pyx_v___pyx_state = values[2];
+  }
+  goto __pyx_L6_skip;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_AioServer", 1, 3, 3, __pyx_nargs); __PYX_ERR(10, 1, __pyx_L3_error)
+  __pyx_L6_skip:;
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_AioServer", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7_cython_6cygrpc_196__pyx_unpickle_AioServer(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state);
+
+  /* function exit code */
+  {
+    Py_ssize_t __pyx_temp;
+    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
+      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
+    }
+  }
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7_cython_6cygrpc_196__pyx_unpickle_AioServer(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_v___pyx_PickleError = 0;
+  PyObject *__pyx_v___pyx_result = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  unsigned int __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle_AioServer", 1);
+
+  /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xa3b308d, 0x7117f7c, 0xa3714dd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa3b308d, 0x7117f7c, 0xa3714dd) = (_crash_exception, _generic_handlers, _interceptors, _limiter, _loop, _server, _serving_task, _shutdown_callback_wrapper, _shutdown_completed, _shutdown_lock, _status, _thread_pool))" % __pyx_checksum
+ */
+  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__106, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":5
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xa3b308d, 0x7117f7c, 0xa3714dd):
+ *         from pickle import PickleError as __pyx_PickleError             # <<<<<<<<<<<<<<
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa3b308d, 0x7117f7c, 0xa3714dd) = (_crash_exception, _generic_handlers, _interceptors, _limiter, _loop, _server, _serving_task, _shutdown_callback_wrapper, _shutdown_completed, _shutdown_lock, _status, _thread_pool))" % __pyx_checksum
+ *     __pyx_result = AioServer.__new__(__pyx_type)
+ */
+    __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_n_s_PickleError);
+    __Pyx_GIVEREF(__pyx_n_s_PickleError);
+    if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(10, 5, __pyx_L1_error);
+    __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 5, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_t_1);
+    __pyx_v___pyx_PickleError = __pyx_t_1;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+    /* "(tree fragment)":6
+ *     if __pyx_checksum not in (0xa3b308d, 0x7117f7c, 0xa3714dd):
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa3b308d, 0x7117f7c, 0xa3714dd) = (_crash_exception, _generic_handlers, _interceptors, _limiter, _loop, _server, _serving_task, _shutdown_callback_wrapper, _shutdown_completed, _shutdown_lock, _status, _thread_pool))" % __pyx_checksum             # <<<<<<<<<<<<<<
+ *     __pyx_result = AioServer.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ */
+    __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 6, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __PYX_ERR(10, 6, __pyx_L1_error)
+
+    /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xa3b308d, 0x7117f7c, 0xa3714dd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa3b308d, 0x7117f7c, 0xa3714dd) = (_crash_exception, _generic_handlers, _interceptors, _limiter, _loop, _server, _serving_task, _shutdown_callback_wrapper, _shutdown_completed, _shutdown_lock, _status, _thread_pool))" % __pyx_checksum
+ */
+  }
+
+  /* "(tree fragment)":7
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa3b308d, 0x7117f7c, 0xa3714dd) = (_crash_exception, _generic_handlers, _interceptors, _limiter, _loop, _server, _serving_task, _shutdown_callback_wrapper, _shutdown_completed, _shutdown_lock, _status, _thread_pool))" % __pyx_checksum
+ *     __pyx_result = AioServer.__new__(__pyx_type)             # <<<<<<<<<<<<<<
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_AioServer__set_state(<AioServer> __pyx_result, __pyx_state)
+ */
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(10, 7, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  __pyx_t_5 = 0;
+  #if CYTHON_UNPACK_METHODS
+  if (likely(PyMethod_Check(__pyx_t_3))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_3, function);
+      __pyx_t_5 = 1;
+    }
+  }
+  #endif
+  {
+    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type};
+    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 7, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  }
+  __pyx_v___pyx_result = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa3b308d, 0x7117f7c, 0xa3714dd) = (_crash_exception, _generic_handlers, _interceptors, _limiter, _loop, _server, _serving_task, _shutdown_callback_wrapper, _shutdown_completed, _shutdown_lock, _status, _thread_pool))" % __pyx_checksum
+ *     __pyx_result = AioServer.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle_AioServer__set_state(<AioServer> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  __pyx_t_2 = (__pyx_v___pyx_state != Py_None);
+  if (__pyx_t_2) {
+
+    /* "(tree fragment)":9
+ *     __pyx_result = AioServer.__new__(__pyx_type)
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_AioServer__set_state(<AioServer> __pyx_result, __pyx_state)             # <<<<<<<<<<<<<<
+ *     return __pyx_result
+ * cdef __pyx_unpickle_AioServer__set_state(AioServer __pyx_result, tuple __pyx_state):
+ */
+    if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(10, 9, __pyx_L1_error)
+    __pyx_t_1 = __pyx_f_7_cython_6cygrpc___pyx_unpickle_AioServer__set_state(((struct __pyx_obj_7_cython_6cygrpc_AioServer *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 9, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "(tree fragment)":8
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xa3b308d, 0x7117f7c, 0xa3714dd) = (_crash_exception, _generic_handlers, _interceptors, _limiter, _loop, _server, _serving_task, _shutdown_callback_wrapper, _shutdown_completed, _shutdown_lock, _status, _thread_pool))" % __pyx_checksum
+ *     __pyx_result = AioServer.__new__(__pyx_type)
+ *     if __pyx_state is not None:             # <<<<<<<<<<<<<<
+ *         __pyx_unpickle_AioServer__set_state(<AioServer> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ */
+  }
+
+  /* "(tree fragment)":10
+ *     if __pyx_state is not None:
+ *         __pyx_unpickle_AioServer__set_state(<AioServer> __pyx_result, __pyx_state)
+ *     return __pyx_result             # <<<<<<<<<<<<<<
+ * cdef __pyx_unpickle_AioServer__set_state(AioServer __pyx_result, tuple __pyx_state):
+ *     __pyx_result._crash_exception = __pyx_state[0]; __pyx_result._generic_handlers = __pyx_state[1]; __pyx_result._interceptors = __pyx_state[2]; __pyx_result._limiter = __pyx_state[3]; __pyx_result._loop = __pyx_state[4]; __pyx_result._server = __pyx_state[5]; __pyx_result._serving_task = __pyx_state[6]; __pyx_result._shutdown_callback_wrapper = __pyx_state[7]; __pyx_result._shutdown_completed = __pyx_state[8]; __pyx_result._shutdown_lock = __pyx_state[9]; __pyx_result._status = __pyx_state[10]; __pyx_result._thread_pool = __pyx_state[11]
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v___pyx_result);
+  __pyx_r = __pyx_v___pyx_result;
+  goto __pyx_L0;
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle_AioServer(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_AioServer", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v___pyx_PickleError);
+  __Pyx_XDECREF(__pyx_v___pyx_result);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "(tree fragment)":11
+ *         __pyx_unpickle_AioServer__set_state(<AioServer> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_AioServer__set_state(AioServer __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_result._crash_exception = __pyx_state[0]; __pyx_result._generic_handlers = __pyx_state[1]; __pyx_result._interceptors = __pyx_state[2]; __pyx_result._limiter = __pyx_state[3]; __pyx_result._loop = __pyx_state[4]; __pyx_result._server = __pyx_state[5]; __pyx_result._serving_task = __pyx_state[6]; __pyx_result._shutdown_callback_wrapper = __pyx_state[7]; __pyx_result._shutdown_completed = __pyx_state[8]; __pyx_result._shutdown_lock = __pyx_state[9]; __pyx_result._status = __pyx_state[10]; __pyx_result._thread_pool = __pyx_state[11]
+ *     if len(__pyx_state) > 12 and hasattr(__pyx_result, '__dict__'):
+ */
+
+static PyObject *__pyx_f_7_cython_6cygrpc___pyx_unpickle_AioServer__set_state(struct __pyx_obj_7_cython_6cygrpc_AioServer *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  enum __pyx_t_7_cython_6cygrpc_AioServerStatus __pyx_t_2;
+  int __pyx_t_3;
+  Py_ssize_t __pyx_t_4;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  unsigned int __pyx_t_9;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__pyx_unpickle_AioServer__set_state", 1);
+
+  /* "(tree fragment)":12
+ *     return __pyx_result
+ * cdef __pyx_unpickle_AioServer__set_state(AioServer __pyx_result, tuple __pyx_state):
+ *     __pyx_result._crash_exception = __pyx_state[0]; __pyx_result._generic_handlers = __pyx_state[1]; __pyx_result._interceptors = __pyx_state[2]; __pyx_result._limiter = __pyx_state[3]; __pyx_result._loop = __pyx_state[4]; __pyx_result._server = __pyx_state[5]; __pyx_result._serving_task = __pyx_state[6]; __pyx_result._shutdown_callback_wrapper = __pyx_state[7]; __pyx_result._shutdown_completed = __pyx_state[8]; __pyx_result._shutdown_lock = __pyx_state[9]; __pyx_result._status = __pyx_state[10]; __pyx_result._thread_pool = __pyx_state[11]             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 12 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[12])
+ */
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v___pyx_result->_crash_exception);
+  __Pyx_DECREF(__pyx_v___pyx_result->_crash_exception);
+  __pyx_v___pyx_result->_crash_exception = __pyx_t_1;
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(PyList_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("list", __pyx_t_1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v___pyx_result->_generic_handlers);
+  __Pyx_DECREF(__pyx_v___pyx_result->_generic_handlers);
+  __pyx_v___pyx_result->_generic_handlers = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(PyTuple_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_1))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v___pyx_result->_interceptors);
+  __Pyx_DECREF(__pyx_v___pyx_result->_interceptors);
+  __pyx_v___pyx_result->_interceptors = ((PyObject*)__pyx_t_1);
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter))))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v___pyx_result->_limiter);
+  __Pyx_DECREF((PyObject *)__pyx_v___pyx_result->_limiter);
+  __pyx_v___pyx_result->_limiter = ((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)__pyx_t_1);
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v___pyx_result->_loop);
+  __Pyx_DECREF(__pyx_v___pyx_result->_loop);
+  __pyx_v___pyx_result->_loop = __pyx_t_1;
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7_cython_6cygrpc_Server))))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v___pyx_result->_server);
+  __Pyx_DECREF((PyObject *)__pyx_v___pyx_result->_server);
+  __pyx_v___pyx_result->_server = ((struct __pyx_obj_7_cython_6cygrpc_Server *)__pyx_t_1);
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v___pyx_result->_serving_task);
+  __Pyx_DECREF(__pyx_v___pyx_result->_serving_task);
+  __pyx_v___pyx_result->_serving_task = __pyx_t_1;
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7_cython_6cygrpc_CallbackWrapper))))) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF((PyObject *)__pyx_v___pyx_result->_shutdown_callback_wrapper);
+  __Pyx_DECREF((PyObject *)__pyx_v___pyx_result->_shutdown_callback_wrapper);
+  __pyx_v___pyx_result->_shutdown_callback_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)__pyx_t_1);
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v___pyx_result->_shutdown_completed);
+  __Pyx_DECREF(__pyx_v___pyx_result->_shutdown_completed);
+  __pyx_v___pyx_result->_shutdown_completed = __pyx_t_1;
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v___pyx_result->_shutdown_lock);
+  __Pyx_DECREF(__pyx_v___pyx_result->_shutdown_lock);
+  __pyx_v___pyx_result->_shutdown_lock = __pyx_t_1;
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 10, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = ((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)__Pyx_PyInt_As_enum____pyx_t_7_cython_6cygrpc_AioServerStatus(__pyx_t_1)); if (unlikely(PyErr_Occurred())) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_v___pyx_result->_status = __pyx_t_2;
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+    __PYX_ERR(10, 12, __pyx_L1_error)
+  }
+  __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 11, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 12, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v___pyx_result->_thread_pool);
+  __Pyx_DECREF(__pyx_v___pyx_result->_thread_pool);
+  __pyx_v___pyx_result->_thread_pool = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "(tree fragment)":13
+ * cdef __pyx_unpickle_AioServer__set_state(AioServer __pyx_result, tuple __pyx_state):
+ *     __pyx_result._crash_exception = __pyx_state[0]; __pyx_result._generic_handlers = __pyx_state[1]; __pyx_result._interceptors = __pyx_state[2]; __pyx_result._limiter = __pyx_state[3]; __pyx_result._loop = __pyx_state[4]; __pyx_result._server = __pyx_state[5]; __pyx_result._serving_task = __pyx_state[6]; __pyx_result._shutdown_callback_wrapper = __pyx_state[7]; __pyx_result._shutdown_completed = __pyx_state[8]; __pyx_result._shutdown_lock = __pyx_state[9]; __pyx_result._status = __pyx_state[10]; __pyx_result._thread_pool = __pyx_state[11]
+ *     if len(__pyx_state) > 12 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[12])
+ */
+  if (unlikely(__pyx_v___pyx_state == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+    __PYX_ERR(10, 13, __pyx_L1_error)
+  }
+  __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(10, 13, __pyx_L1_error)
+  __pyx_t_5 = (__pyx_t_4 > 12);
+  if (__pyx_t_5) {
+  } else {
+    __pyx_t_3 = __pyx_t_5;
+    goto __pyx_L4_bool_binop_done;
+  }
+  __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(10, 13, __pyx_L1_error)
+  __pyx_t_3 = __pyx_t_5;
+  __pyx_L4_bool_binop_done:;
+  if (__pyx_t_3) {
+
+    /* "(tree fragment)":14
+ *     __pyx_result._crash_exception = __pyx_state[0]; __pyx_result._generic_handlers = __pyx_state[1]; __pyx_result._interceptors = __pyx_state[2]; __pyx_result._limiter = __pyx_state[3]; __pyx_result._loop = __pyx_state[4]; __pyx_result._server = __pyx_state[5]; __pyx_result._serving_task = __pyx_state[6]; __pyx_result._shutdown_callback_wrapper = __pyx_state[7]; __pyx_result._shutdown_completed = __pyx_state[8]; __pyx_result._shutdown_lock = __pyx_state[9]; __pyx_result._status = __pyx_state[10]; __pyx_result._thread_pool = __pyx_state[11]
+ *     if len(__pyx_state) > 12 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[12])             # <<<<<<<<<<<<<<
+ */
+    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(10, 14, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 14, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_7);
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (unlikely(__pyx_v___pyx_state == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      __PYX_ERR(10, 14, __pyx_L1_error)
+    }
+    __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 12, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(10, 14, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_8 = NULL;
+    __pyx_t_9 = 0;
+    #if CYTHON_UNPACK_METHODS
+    if (likely(PyMethod_Check(__pyx_t_7))) {
+      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
+      if (likely(__pyx_t_8)) {
+        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+        __Pyx_INCREF(__pyx_t_8);
+        __Pyx_INCREF(function);
+        __Pyx_DECREF_SET(__pyx_t_7, function);
+        __pyx_t_9 = 1;
+      }
+    }
+    #endif
+    {
+      PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6};
+      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9);
+      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      if (unlikely(!__pyx_t_1)) __PYX_ERR(10, 14, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+    /* "(tree fragment)":13
+ * cdef __pyx_unpickle_AioServer__set_state(AioServer __pyx_result, tuple __pyx_state):
+ *     __pyx_result._crash_exception = __pyx_state[0]; __pyx_result._generic_handlers = __pyx_state[1]; __pyx_result._interceptors = __pyx_state[2]; __pyx_result._limiter = __pyx_state[3]; __pyx_result._loop = __pyx_state[4]; __pyx_result._server = __pyx_state[5]; __pyx_result._serving_task = __pyx_state[6]; __pyx_result._shutdown_callback_wrapper = __pyx_state[7]; __pyx_result._shutdown_completed = __pyx_state[8]; __pyx_result._shutdown_lock = __pyx_state[9]; __pyx_result._status = __pyx_state[10]; __pyx_result._thread_pool = __pyx_state[11]
+ *     if len(__pyx_state) > 12 and hasattr(__pyx_result, '__dict__'):             # <<<<<<<<<<<<<<
+ *         __pyx_result.__dict__.update(__pyx_state[12])
+ */
+  }
+
+  /* "(tree fragment)":11
+ *         __pyx_unpickle_AioServer__set_state(<AioServer> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_AioServer__set_state(AioServer __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_result._crash_exception = __pyx_state[0]; __pyx_result._generic_handlers = __pyx_state[1]; __pyx_result._interceptors = __pyx_state[2]; __pyx_result._limiter = __pyx_state[3]; __pyx_result._loop = __pyx_state[4]; __pyx_result._server = __pyx_state[5]; __pyx_result._serving_task = __pyx_state[6]; __pyx_result._shutdown_callback_wrapper = __pyx_state[7]; __pyx_result._shutdown_completed = __pyx_state[8]; __pyx_result._shutdown_lock = __pyx_state[9]; __pyx_result._status = __pyx_state[10]; __pyx_result._thread_pool = __pyx_state[11]
+ *     if len(__pyx_state) > 12 and hasattr(__pyx_result, '__dict__'):
+ */
+
+  /* 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_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("_cython.cygrpc.__pyx_unpickle_AioServer__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArg __pyx_vtable_7_cython_6cygrpc__ChannelArg;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ChannelArg(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArg *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__ChannelArg *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc__ChannelArg;
+  new((void*)&(p->c_argument)) grpc_arg();
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__ChannelArg(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArg *p = (struct __pyx_obj_7_cython_6cygrpc__ChannelArg *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__ChannelArg) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  __Pyx_call_destructor(p->c_argument);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__ChannelArg[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11_ChannelArg_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11_ChannelArg_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__ChannelArg_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__ChannelArg},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__ChannelArg},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__ChannelArg},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__ChannelArg_spec = {
+  "_cython.cygrpc._ChannelArg",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ChannelArg),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc__ChannelArg_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__ChannelArg = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_ChannelArg", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ChannelArg), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__ChannelArg, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__ChannelArg, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__ChannelArg, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc__ChannelArgs __pyx_vtable_7_cython_6cygrpc__ChannelArgs;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ChannelArgs(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc__ChannelArgs;
+  new((void*)&(p->_c_arguments)) grpc_channel_args();
+  p->_arguments = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_channel_args = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__ChannelArgs(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *p = (struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__ChannelArgs) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_12_ChannelArgs_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  __Pyx_call_destructor(p->_c_arguments);
+  Py_CLEAR(p->_arguments);
+  Py_CLEAR(p->_channel_args);
+  Py_CLEAR(p->_references);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__ChannelArgs(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *p = (struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)o;
+  if (p->_arguments) {
+    e = (*v)(p->_arguments, a); if (e) return e;
+  }
+  if (p->_channel_args) {
+    e = (*v)(p->_channel_args, a); if (e) return e;
+  }
+  if (p->_references) {
+    e = (*v)(p->_references, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__ChannelArgs(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *p = (struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *)o;
+  tmp = ((PyObject*)p->_arguments);
+  p->_arguments = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_channel_args);
+  p->_channel_args = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_references);
+  p->_references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_12_ChannelArgs__arguments(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_12_ChannelArgs_10_arguments_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_12_ChannelArgs__references(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_12_ChannelArgs_11_references_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__ChannelArgs[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12_ChannelArgs_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc__ChannelArgs[] = {
+  {(char *)"_arguments", __pyx_getprop_7_cython_6cygrpc_12_ChannelArgs__arguments, 0, (char *)0, 0},
+  {(char *)"_references", __pyx_getprop_7_cython_6cygrpc_12_ChannelArgs__references, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__ChannelArgs_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__ChannelArgs},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__ChannelArgs},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__ChannelArgs},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__ChannelArgs},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc__ChannelArgs},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__ChannelArgs},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__ChannelArgs_spec = {
+  "_cython.cygrpc._ChannelArgs",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__ChannelArgs_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__ChannelArgs = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_ChannelArgs", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__ChannelArgs, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__ChannelArgs, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__ChannelArgs, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__ChannelArgs, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc__ChannelArgs, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__ChannelArgs, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_Call(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_Call *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_Call *)o);
+  p->references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_4Call_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_Call(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_Call *p = (struct __pyx_obj_7_cython_6cygrpc_Call *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_Call) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_4Call_15__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->references);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_Call(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_Call *p = (struct __pyx_obj_7_cython_6cygrpc_Call *)o;
+  if (p->references) {
+    e = (*v)(p->references, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_Call(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_Call *p = (struct __pyx_obj_7_cython_6cygrpc_Call *)o;
+  tmp = ((PyObject*)p->references);
+  p->references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_4Call_is_valid(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_4Call_8is_valid_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_Call[] = {
+  {"_start_batch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_3_start_batch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"start_client_batch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_5start_client_batch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"start_server_batch", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_7start_server_batch, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"cancel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_9cancel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_credentials", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_11set_credentials, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"peer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_13peer, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"_custom_op_on_c_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_17_custom_op_on_c_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_19__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4Call_21__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_Call[] = {
+  {(char *)"is_valid", __pyx_getprop_7_cython_6cygrpc_4Call_is_valid, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_Call_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_Call},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_Call},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_Call},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_Call},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_Call},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_Call},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_Call_spec = {
+  "_cython.cygrpc.Call",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_Call),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_Call_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_Call = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""Call", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_Call), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_Call, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_Call, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_Call, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_Call, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_Call, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_Call, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc__CallState __pyx_vtable_7_cython_6cygrpc__CallState;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__CallState(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__CallState *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc__CallState;
+  p->due = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->call_tracer_capsule = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_10_CallState_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__CallState(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__CallState *p = (struct __pyx_obj_7_cython_6cygrpc__CallState *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__CallState) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->due);
+  Py_CLEAR(p->call_tracer_capsule);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__CallState(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__CallState *p = (struct __pyx_obj_7_cython_6cygrpc__CallState *)o;
+  if (p->due) {
+    e = (*v)(p->due, a); if (e) return e;
+  }
+  if (p->call_tracer_capsule) {
+    e = (*v)(p->call_tracer_capsule, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__CallState(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__CallState *p = (struct __pyx_obj_7_cython_6cygrpc__CallState *)o;
+  tmp = ((PyObject*)p->due);
+  p->due = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->call_tracer_capsule);
+  p->call_tracer_capsule = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__CallState[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10_CallState_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10_CallState_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__CallState_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__CallState},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__CallState},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__CallState},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__CallState},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__CallState},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__CallState_spec = {
+  "_cython.cygrpc._CallState",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__CallState),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__CallState_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__CallState = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_CallState", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__CallState), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__CallState, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__CallState, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__CallState, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__CallState, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__CallState, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ChannelState(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)o);
+  p->target = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->condition = Py_None; Py_INCREF(Py_None);
+  p->open = Py_None; Py_INCREF(Py_None);
+  p->closed_reason = Py_None; Py_INCREF(Py_None);
+  p->integrated_call_states = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->segregated_call_states = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->connectivity_due = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_13_ChannelState_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__ChannelState(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *p = (struct __pyx_obj_7_cython_6cygrpc__ChannelState *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__ChannelState) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->target);
+  Py_CLEAR(p->condition);
+  Py_CLEAR(p->open);
+  Py_CLEAR(p->closed_reason);
+  Py_CLEAR(p->integrated_call_states);
+  Py_CLEAR(p->segregated_call_states);
+  Py_CLEAR(p->connectivity_due);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__ChannelState(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *p = (struct __pyx_obj_7_cython_6cygrpc__ChannelState *)o;
+  if (p->condition) {
+    e = (*v)(p->condition, a); if (e) return e;
+  }
+  if (p->open) {
+    e = (*v)(p->open, a); if (e) return e;
+  }
+  if (p->closed_reason) {
+    e = (*v)(p->closed_reason, a); if (e) return e;
+  }
+  if (p->integrated_call_states) {
+    e = (*v)(p->integrated_call_states, a); if (e) return e;
+  }
+  if (p->segregated_call_states) {
+    e = (*v)(p->segregated_call_states, a); if (e) return e;
+  }
+  if (p->connectivity_due) {
+    e = (*v)(p->connectivity_due, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__ChannelState(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__ChannelState *p = (struct __pyx_obj_7_cython_6cygrpc__ChannelState *)o;
+  tmp = ((PyObject*)p->condition);
+  p->condition = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->open);
+  p->open = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->closed_reason);
+  p->closed_reason = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->integrated_call_states);
+  p->integrated_call_states = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->segregated_call_states);
+  p->segregated_call_states = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->connectivity_due);
+  p->connectivity_due = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__ChannelState[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13_ChannelState_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13_ChannelState_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__ChannelState_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__ChannelState},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__ChannelState},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__ChannelState},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__ChannelState},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__ChannelState},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__ChannelState_spec = {
+  "_cython.cygrpc._ChannelState",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ChannelState),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__ChannelState_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__ChannelState = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_ChannelState", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ChannelState), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__ChannelState, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__ChannelState, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__ChannelState, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__ChannelState, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__ChannelState, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_IntegratedCall(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)o);
+  p->_channel_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)Py_None); Py_INCREF(Py_None);
+  p->_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_14IntegratedCall_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_IntegratedCall(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *p = (struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_IntegratedCall) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_channel_state);
+  Py_CLEAR(p->_call_state);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_IntegratedCall(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *p = (struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)o;
+  if (p->_channel_state) {
+    e = (*v)(((PyObject *)p->_channel_state), a); if (e) return e;
+  }
+  if (p->_call_state) {
+    e = (*v)(((PyObject *)p->_call_state), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_IntegratedCall(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *p = (struct __pyx_obj_7_cython_6cygrpc_IntegratedCall *)o;
+  tmp = ((PyObject*)p->_channel_state);
+  p->_channel_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_call_state);
+  p->_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_IntegratedCall[] = {
+  {"operate", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14IntegratedCall_3operate, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"cancel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14IntegratedCall_5cancel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14IntegratedCall_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14IntegratedCall_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_IntegratedCall_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_IntegratedCall},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_IntegratedCall},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_IntegratedCall},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_IntegratedCall},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_IntegratedCall},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_IntegratedCall_spec = {
+  "_cython.cygrpc.IntegratedCall",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_IntegratedCall),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_IntegratedCall_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_IntegratedCall = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""IntegratedCall", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_IntegratedCall), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_IntegratedCall, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_IntegratedCall, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_IntegratedCall, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_IntegratedCall, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_IntegratedCall, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SegregatedCall(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)o);
+  p->_channel_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)Py_None); Py_INCREF(Py_None);
+  p->_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_14SegregatedCall_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_SegregatedCall(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *p = (struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_SegregatedCall) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_channel_state);
+  Py_CLEAR(p->_call_state);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_SegregatedCall(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *p = (struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)o;
+  if (p->_channel_state) {
+    e = (*v)(((PyObject *)p->_channel_state), a); if (e) return e;
+  }
+  if (p->_call_state) {
+    e = (*v)(((PyObject *)p->_call_state), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_SegregatedCall(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *p = (struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)o;
+  tmp = ((PyObject*)p->_channel_state);
+  p->_channel_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_call_state);
+  p->_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_SegregatedCall[] = {
+  {"operate", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_3operate, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"cancel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_5cancel, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"next_event", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_7next_event, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_9__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_14SegregatedCall_11__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_SegregatedCall_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_SegregatedCall},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_SegregatedCall},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_SegregatedCall},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_SegregatedCall},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_SegregatedCall},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_SegregatedCall_spec = {
+  "_cython.cygrpc.SegregatedCall",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_SegregatedCall_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_SegregatedCall = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""SegregatedCall", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SegregatedCall), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_SegregatedCall, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_SegregatedCall, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_SegregatedCall, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_SegregatedCall, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_SegregatedCall, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_Channel(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_Channel *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_Channel *)o);
+  p->_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)Py_None); Py_INCREF(Py_None);
+  p->_registered_call_handles = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_arguments = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_7Channel_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_Channel(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_Channel *p = (struct __pyx_obj_7_cython_6cygrpc_Channel *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_Channel) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_state);
+  Py_CLEAR(p->_registered_call_handles);
+  Py_CLEAR(p->_arguments);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_Channel(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_Channel *p = (struct __pyx_obj_7_cython_6cygrpc_Channel *)o;
+  if (p->_state) {
+    e = (*v)(((PyObject *)p->_state), a); if (e) return e;
+  }
+  if (p->_registered_call_handles) {
+    e = (*v)(p->_registered_call_handles, a); if (e) return e;
+  }
+  if (p->_arguments) {
+    e = (*v)(p->_arguments, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_Channel(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_Channel *p = (struct __pyx_obj_7_cython_6cygrpc_Channel *)o;
+  tmp = ((PyObject*)p->_state);
+  p->_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_registered_call_handles);
+  p->_registered_call_handles = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_arguments);
+  p->_arguments = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_Channel[] = {
+  {"target", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_3target, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"integrated_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_5integrated_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"next_call_event", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_7next_call_event, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"segregated_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_9segregated_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"check_connectivity_state", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_11check_connectivity_state, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"watch_connectivity_state", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_13watch_connectivity_state, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"close", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_15close, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"close_on_fork", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_17close_on_fork, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"get_registered_call_handle", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_19get_registered_call_handle, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_7Channel_18get_registered_call_handle},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_21__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_7Channel_23__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_Channel_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_Channel},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_Channel},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_Channel},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_Channel},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_Channel},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_Channel_spec = {
+  "_cython.cygrpc.Channel",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_Channel),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_Channel_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_Channel = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""Channel", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_Channel), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_Channel, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_Channel, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_Channel, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_Channel, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_Channel, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallHandle(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CallHandle *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CallHandle *)o);
+  p->method = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_10CallHandle_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CallHandle(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_CallHandle *p = (struct __pyx_obj_7_cython_6cygrpc_CallHandle *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CallHandle) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_10CallHandle_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->method);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_CallHandle(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_CallHandle *p = (struct __pyx_obj_7_cython_6cygrpc_CallHandle *)o;
+  if (p->method) {
+    e = (*v)(p->method, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_CallHandle(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_CallHandle *p = (struct __pyx_obj_7_cython_6cygrpc_CallHandle *)o;
+  tmp = ((PyObject*)p->method);
+  p->method = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_10CallHandle_call_handle(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_10CallHandle_11call_handle_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CallHandle[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10CallHandle_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10CallHandle_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_CallHandle[] = {
+  {(char *)"call_handle", __pyx_getprop_7_cython_6cygrpc_10CallHandle_call_handle, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CallHandle_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CallHandle},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_CallHandle},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_CallHandle},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CallHandle},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_CallHandle},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CallHandle},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CallHandle_spec = {
+  "_cython.cygrpc.CallHandle",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallHandle),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_CallHandle_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CallHandle = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CallHandle", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallHandle), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CallHandle, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_CallHandle, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_CallHandle, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CallHandle, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_CallHandle, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CallHandle, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials __pyx_vtable_7_cython_6cygrpc_CallCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallCredentials(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CallCredentials *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CallCredentials *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_CallCredentials;
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CallCredentials(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CallCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CallCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CallCredentials_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CallCredentials_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CallCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CallCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CallCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CallCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CallCredentials_spec = {
+  "_cython.cygrpc.CallCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_CallCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CallCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CallCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CallCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CallCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CallCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_MetadataPluginCallCredentials __pyx_vtable_7_cython_6cygrpc_MetadataPluginCallCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_MetadataPluginCallCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_CallCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials*)__pyx_vtabptr_7_cython_6cygrpc_MetadataPluginCallCredentials;
+  p->_metadata_plugin = Py_None; Py_INCREF(Py_None);
+  p->_name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_MetadataPluginCallCredentials(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_MetadataPluginCallCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_metadata_plugin);
+  Py_CLEAR(p->_name);
+  __pyx_tp_dealloc_7_cython_6cygrpc_CallCredentials(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_MetadataPluginCallCredentials(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_CallCredentials)) ? ((__pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_MetadataPluginCallCredentials)); if (e) return e;
+  if (p->_metadata_plugin) {
+    e = (*v)(p->_metadata_plugin, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_MetadataPluginCallCredentials(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_CallCredentials)) { if (__pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_clear) __pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_MetadataPluginCallCredentials);
+  tmp = ((PyObject*)p->_metadata_plugin);
+  p->_metadata_plugin = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_29MetadataPluginCallCredentials__metadata_plugin(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_16_metadata_plugin_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_29MetadataPluginCallCredentials__name(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_5_name_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_MetadataPluginCallCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29MetadataPluginCallCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_MetadataPluginCallCredentials[] = {
+  {(char *)"_metadata_plugin", __pyx_getprop_7_cython_6cygrpc_29MetadataPluginCallCredentials__metadata_plugin, 0, (char *)0, 0},
+  {(char *)"_name", __pyx_getprop_7_cython_6cygrpc_29MetadataPluginCallCredentials__name, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_MetadataPluginCallCredentials},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_MetadataPluginCallCredentials},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_MetadataPluginCallCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_MetadataPluginCallCredentials},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_MetadataPluginCallCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_MetadataPluginCallCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials_spec = {
+  "_cython.cygrpc.MetadataPluginCallCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""MetadataPluginCallCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_MetadataPluginCallCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_MetadataPluginCallCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_MetadataPluginCallCredentials, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_MetadataPluginCallCredentials, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_MetadataPluginCallCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_MetadataPluginCallCredentials, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_MetadataPluginCallCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CompositeCallCredentials __pyx_vtable_7_cython_6cygrpc_CompositeCallCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CompositeCallCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_CallCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_CallCredentials*)__pyx_vtabptr_7_cython_6cygrpc_CompositeCallCredentials;
+  p->_call_credentialses = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CompositeCallCredentials(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CompositeCallCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_call_credentialses);
+  __pyx_tp_dealloc_7_cython_6cygrpc_CallCredentials(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_CompositeCallCredentials(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_CallCredentials)) ? ((__pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_CompositeCallCredentials)); if (e) return e;
+  if (p->_call_credentialses) {
+    e = (*v)(p->_call_credentialses, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_CompositeCallCredentials(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_CallCredentials)) { if (__pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_clear) __pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_CompositeCallCredentials);
+  tmp = ((PyObject*)p->_call_credentialses);
+  p->_call_credentialses = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_24CompositeCallCredentials__call_credentialses(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_19_call_credentialses_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CompositeCallCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_24CompositeCallCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_CompositeCallCredentials[] = {
+  {(char *)"_call_credentialses", __pyx_getprop_7_cython_6cygrpc_24CompositeCallCredentials__call_credentialses, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CompositeCallCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CompositeCallCredentials},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_CompositeCallCredentials},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_CompositeCallCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CompositeCallCredentials},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_CompositeCallCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CompositeCallCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CompositeCallCredentials_spec = {
+  "_cython.cygrpc.CompositeCallCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_CompositeCallCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CompositeCallCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CompositeCallCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CompositeCallCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CompositeCallCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_CompositeCallCredentials, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_CompositeCallCredentials, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CompositeCallCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_CompositeCallCredentials, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CompositeCallCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials __pyx_vtable_7_cython_6cygrpc_ChannelCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ChannelCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18ChannelCredentials_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18ChannelCredentials_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ChannelCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ChannelCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ChannelCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ChannelCredentials_spec = {
+  "_cython.cygrpc.ChannelCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_ChannelCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ChannelCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ChannelCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ChannelCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ChannelCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SSLSessionCacheLRU(PyTypeObject *t, PyObject *a, PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_SSLSessionCacheLRU(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_SSLSessionCacheLRU) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_5__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_SSLSessionCacheLRU[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_SSLSessionCacheLRU},
+  {Py_nb_int, (void *)__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_3__int__},
+  #if PY_MAJOR_VERSION < 3
+  {Py_nb_long, (void *)__pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_3__int__},
+  #endif
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_SSLSessionCacheLRU},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_SSLSessionCacheLRU},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU_spec = {
+  "_cython.cygrpc.SSLSessionCacheLRU",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU_slots,
+};
+#else
+
+static PyNumberMethods __pyx_tp_as_number_SSLSessionCacheLRU = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_bool*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
+  0, /*nb_coerce*/
+  #endif
+  __pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_3__int__, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  __pyx_pw_7_cython_6cygrpc_18SSLSessionCacheLRU_3__int__, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3 || (CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x03050000)
+  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*/
+  0, /*nb_floor_divide*/
+  0, /*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_7_cython_6cygrpc_SSLSessionCacheLRU = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""SSLSessionCacheLRU", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SSLSessionCacheLRU), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_SSLSessionCacheLRU, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_SSLSessionCacheLRU, /*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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_SSLSessionCacheLRU, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_SSLSessionCacheLRU, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SSLChannelCredentials __pyx_vtable_7_cython_6cygrpc_SSLChannelCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SSLChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials*)__pyx_vtabptr_7_cython_6cygrpc_SSLChannelCredentials;
+  p->_pem_root_certificates = Py_None; Py_INCREF(Py_None);
+  p->_private_key = Py_None; Py_INCREF(Py_None);
+  p->_certificate_chain = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_SSLChannelCredentials(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_SSLChannelCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_pem_root_certificates);
+  Py_CLEAR(p->_private_key);
+  Py_CLEAR(p->_certificate_chain);
+  __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_SSLChannelCredentials(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials)) ? ((__pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_SSLChannelCredentials)); if (e) return e;
+  if (p->_pem_root_certificates) {
+    e = (*v)(p->_pem_root_certificates, a); if (e) return e;
+  }
+  if (p->_private_key) {
+    e = (*v)(p->_private_key, a); if (e) return e;
+  }
+  if (p->_certificate_chain) {
+    e = (*v)(p->_certificate_chain, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_SSLChannelCredentials(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials)) { if (__pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_clear) __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_SSLChannelCredentials);
+  tmp = ((PyObject*)p->_pem_root_certificates);
+  p->_pem_root_certificates = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_private_key);
+  p->_private_key = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_certificate_chain);
+  p->_certificate_chain = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_21SSLChannelCredentials__pem_root_certificates(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_22_pem_root_certificates_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_21SSLChannelCredentials__private_key(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_12_private_key_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_21SSLChannelCredentials__certificate_chain(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_18_certificate_chain_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_SSLChannelCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21SSLChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_SSLChannelCredentials[] = {
+  {(char *)"_pem_root_certificates", __pyx_getprop_7_cython_6cygrpc_21SSLChannelCredentials__pem_root_certificates, 0, (char *)0, 0},
+  {(char *)"_private_key", __pyx_getprop_7_cython_6cygrpc_21SSLChannelCredentials__private_key, 0, (char *)0, 0},
+  {(char *)"_certificate_chain", __pyx_getprop_7_cython_6cygrpc_21SSLChannelCredentials__certificate_chain, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_SSLChannelCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_SSLChannelCredentials},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_SSLChannelCredentials},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_SSLChannelCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_SSLChannelCredentials},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_SSLChannelCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_SSLChannelCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_SSLChannelCredentials_spec = {
+  "_cython.cygrpc.SSLChannelCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_SSLChannelCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_SSLChannelCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""SSLChannelCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SSLChannelCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_SSLChannelCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_SSLChannelCredentials, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_SSLChannelCredentials, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_SSLChannelCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_SSLChannelCredentials, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_SSLChannelCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CompositeChannelCredentials __pyx_vtable_7_cython_6cygrpc_CompositeChannelCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CompositeChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials*)__pyx_vtabptr_7_cython_6cygrpc_CompositeChannelCredentials;
+  p->_call_credentialses = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_channel_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CompositeChannelCredentials(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CompositeChannelCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_call_credentialses);
+  Py_CLEAR(p->_channel_credentials);
+  __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_CompositeChannelCredentials(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials)) ? ((__pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_CompositeChannelCredentials)); if (e) return e;
+  if (p->_call_credentialses) {
+    e = (*v)(p->_call_credentialses, a); if (e) return e;
+  }
+  if (p->_channel_credentials) {
+    e = (*v)(((PyObject *)p->_channel_credentials), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_CompositeChannelCredentials(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials)) { if (__pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_clear) __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_CompositeChannelCredentials);
+  tmp = ((PyObject*)p->_call_credentialses);
+  p->_call_credentialses = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_channel_credentials);
+  p->_channel_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_27CompositeChannelCredentials__call_credentialses(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_19_call_credentialses_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_27CompositeChannelCredentials__channel_credentials(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_20_channel_credentials_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CompositeChannelCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_27CompositeChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_CompositeChannelCredentials[] = {
+  {(char *)"_call_credentialses", __pyx_getprop_7_cython_6cygrpc_27CompositeChannelCredentials__call_credentialses, 0, (char *)0, 0},
+  {(char *)"_channel_credentials", __pyx_getprop_7_cython_6cygrpc_27CompositeChannelCredentials__channel_credentials, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CompositeChannelCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CompositeChannelCredentials},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_CompositeChannelCredentials},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_CompositeChannelCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CompositeChannelCredentials},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_CompositeChannelCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CompositeChannelCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CompositeChannelCredentials_spec = {
+  "_cython.cygrpc.CompositeChannelCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_CompositeChannelCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CompositeChannelCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CompositeChannelCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CompositeChannelCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CompositeChannelCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_CompositeChannelCredentials, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_CompositeChannelCredentials, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CompositeChannelCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_CompositeChannelCredentials, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CompositeChannelCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_XDSChannelCredentials __pyx_vtable_7_cython_6cygrpc_XDSChannelCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_XDSChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials*)__pyx_vtabptr_7_cython_6cygrpc_XDSChannelCredentials;
+  p->_fallback_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_XDSChannelCredentials(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_XDSChannelCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_fallback_credentials);
+  __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_XDSChannelCredentials(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials)) ? ((__pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_XDSChannelCredentials)); if (e) return e;
+  if (p->_fallback_credentials) {
+    e = (*v)(((PyObject *)p->_fallback_credentials), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_XDSChannelCredentials(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials)) { if (__pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_clear) __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_XDSChannelCredentials);
+  tmp = ((PyObject*)p->_fallback_credentials);
+  p->_fallback_credentials = ((struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_21XDSChannelCredentials__fallback_credentials(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_21_fallback_credentials_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_XDSChannelCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21XDSChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_XDSChannelCredentials[] = {
+  {(char *)"_fallback_credentials", __pyx_getprop_7_cython_6cygrpc_21XDSChannelCredentials__fallback_credentials, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_XDSChannelCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_XDSChannelCredentials},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_XDSChannelCredentials},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_XDSChannelCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_XDSChannelCredentials},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_XDSChannelCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_XDSChannelCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_XDSChannelCredentials_spec = {
+  "_cython.cygrpc.XDSChannelCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_XDSChannelCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_XDSChannelCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""XDSChannelCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_XDSChannelCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_XDSChannelCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_XDSChannelCredentials, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_XDSChannelCredentials, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_XDSChannelCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_XDSChannelCredentials, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_XDSChannelCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ServerCertificateConfig(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)o);
+  p->references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ServerCertificateConfig(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *p = (struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ServerCertificateConfig) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->references);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_ServerCertificateConfig(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *p = (struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)o;
+  if (p->references) {
+    e = (*v)(p->references, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_ServerCertificateConfig(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *p = (struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig *)o;
+  tmp = ((PyObject*)p->references);
+  p->references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ServerCertificateConfig[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ServerCertificateConfig_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ServerCertificateConfig_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ServerCertificateConfig},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_ServerCertificateConfig},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_ServerCertificateConfig},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ServerCertificateConfig},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ServerCertificateConfig},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ServerCertificateConfig_spec = {
+  "_cython.cygrpc.ServerCertificateConfig",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_ServerCertificateConfig_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ServerCertificateConfig = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ServerCertificateConfig", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ServerCertificateConfig), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ServerCertificateConfig, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_ServerCertificateConfig, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_ServerCertificateConfig, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ServerCertificateConfig, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ServerCertificateConfig, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ServerCredentials(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)o);
+  p->references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->initial_cert_config = Py_None; Py_INCREF(Py_None);
+  p->cert_config_fetcher = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_17ServerCredentials_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ServerCredentials(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ServerCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_17ServerCredentials_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->references);
+  Py_CLEAR(p->initial_cert_config);
+  Py_CLEAR(p->cert_config_fetcher);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_ServerCredentials(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)o;
+  if (p->references) {
+    e = (*v)(p->references, a); if (e) return e;
+  }
+  if (p->initial_cert_config) {
+    e = (*v)(p->initial_cert_config, a); if (e) return e;
+  }
+  if (p->cert_config_fetcher) {
+    e = (*v)(p->cert_config_fetcher, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_ServerCredentials(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *p = (struct __pyx_obj_7_cython_6cygrpc_ServerCredentials *)o;
+  tmp = ((PyObject*)p->references);
+  p->references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->initial_cert_config);
+  p->initial_cert_config = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->cert_config_fetcher);
+  p->cert_config_fetcher = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ServerCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ServerCredentials_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ServerCredentials_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ServerCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ServerCredentials},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_ServerCredentials},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_ServerCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ServerCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ServerCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ServerCredentials_spec = {
+  "_cython.cygrpc.ServerCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ServerCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_ServerCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ServerCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ServerCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ServerCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ServerCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_ServerCredentials, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_ServerCredentials, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ServerCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ServerCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_LocalChannelCredentials __pyx_vtable_7_cython_6cygrpc_LocalChannelCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_LocalChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials*)__pyx_vtabptr_7_cython_6cygrpc_LocalChannelCredentials;
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_LocalChannelCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23LocalChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_LocalChannelCredentials_slots[] = {
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_LocalChannelCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_LocalChannelCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_LocalChannelCredentials_spec = {
+  "_cython.cygrpc.LocalChannelCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_LocalChannelCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_LocalChannelCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""LocalChannelCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_LocalChannelCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_LocalChannelCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_LocalChannelCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ALTSChannelCredentials __pyx_vtable_7_cython_6cygrpc_ALTSChannelCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ALTSChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials*)__pyx_vtabptr_7_cython_6cygrpc_ALTSChannelCredentials;
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ALTSChannelCredentials(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ALTSChannelCredentials) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ALTSChannelCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_22ALTSChannelCredentials_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ALTSChannelCredentials_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ALTSChannelCredentials},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ALTSChannelCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ALTSChannelCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ALTSChannelCredentials_spec = {
+  "_cython.cygrpc.ALTSChannelCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_ALTSChannelCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ALTSChannelCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ALTSChannelCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ALTSChannelCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ALTSChannelCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ALTSChannelCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ALTSChannelCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__LatentEventArg(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *)o);
+  p->deadline = Py_None; Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__LatentEventArg(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *p = (struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__LatentEventArg) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->deadline);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__LatentEventArg(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *p = (struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *)o;
+  if (p->deadline) {
+    e = (*v)(p->deadline, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__LatentEventArg(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *p = (struct __pyx_obj_7_cython_6cygrpc__LatentEventArg *)o;
+  tmp = ((PyObject*)p->deadline);
+  p->deadline = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__LatentEventArg_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__LatentEventArg},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__LatentEventArg},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__LatentEventArg},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__LatentEventArg},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__LatentEventArg_spec = {
+  "_cython.cygrpc._LatentEventArg",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__LatentEventArg),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc__LatentEventArg_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__LatentEventArg = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_LatentEventArg", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__LatentEventArg), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__LatentEventArg, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__LatentEventArg, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__LatentEventArg, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__LatentEventArg, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CompletionQueue __pyx_vtable_7_cython_6cygrpc_CompletionQueue;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CompletionQueue(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_CompletionQueue;
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_15CompletionQueue_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CompletionQueue(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CompletionQueue) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_15CompletionQueue_11__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CompletionQueue[] = {
+  {"_internal_poll", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_3_internal_poll, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"poll", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_5poll, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"shutdown", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_7shutdown, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"clear", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_9clear, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_13__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CompletionQueue_15__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CompletionQueue_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CompletionQueue},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CompletionQueue},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CompletionQueue},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CompletionQueue_spec = {
+  "_cython.cygrpc.CompletionQueue",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_CompletionQueue_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CompletionQueue = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CompletionQueue", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CompletionQueue, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CompletionQueue, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CompletionQueue, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_BaseEvent(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_BaseEvent(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_BaseEvent) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_BaseEvent_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_BaseEvent},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_BaseEvent},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_BaseEvent_spec = {
+  "_cython.cygrpc.BaseEvent",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_BaseEvent),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc_BaseEvent_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_BaseEvent = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""BaseEvent", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_BaseEvent), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_BaseEvent, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_BaseEvent, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ConnectivityEvent(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_BaseEvent(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)o);
+  p->tag = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ConnectivityEvent(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *p = (struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ConnectivityEvent) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->tag);
+  __pyx_tp_dealloc_7_cython_6cygrpc_BaseEvent(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_ConnectivityEvent(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *p = (struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_BaseEvent)) ? ((__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_ConnectivityEvent)); if (e) return e;
+  if (p->tag) {
+    e = (*v)(p->tag, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_ConnectivityEvent(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *p = (struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_BaseEvent)) { if (__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_clear) __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_ConnectivityEvent);
+  tmp = ((PyObject*)p->tag);
+  p->tag = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_17ConnectivityEvent_completion_type(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_15completion_type_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_17ConnectivityEvent_success(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_7success_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_17ConnectivityEvent_tag(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_3tag_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ConnectivityEvent[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17ConnectivityEvent_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_ConnectivityEvent[] = {
+  {(char *)"completion_type", __pyx_getprop_7_cython_6cygrpc_17ConnectivityEvent_completion_type, 0, (char *)0, 0},
+  {(char *)"success", __pyx_getprop_7_cython_6cygrpc_17ConnectivityEvent_success, 0, (char *)0, 0},
+  {(char *)"tag", __pyx_getprop_7_cython_6cygrpc_17ConnectivityEvent_tag, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ConnectivityEvent_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ConnectivityEvent},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_ConnectivityEvent},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_ConnectivityEvent},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ConnectivityEvent},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_ConnectivityEvent},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ConnectivityEvent},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ConnectivityEvent_spec = {
+  "_cython.cygrpc.ConnectivityEvent",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc_ConnectivityEvent_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ConnectivityEvent = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ConnectivityEvent", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ConnectivityEvent, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_ConnectivityEvent, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_ConnectivityEvent, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ConnectivityEvent, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_ConnectivityEvent, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ConnectivityEvent, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_RequestCallEvent(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_BaseEvent(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)o);
+  p->tag = Py_None; Py_INCREF(Py_None);
+  p->call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)Py_None); Py_INCREF(Py_None);
+  p->call_details = ((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)Py_None); Py_INCREF(Py_None);
+  p->invocation_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_RequestCallEvent(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *p = (struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_RequestCallEvent) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->tag);
+  Py_CLEAR(p->call);
+  Py_CLEAR(p->call_details);
+  Py_CLEAR(p->invocation_metadata);
+  __pyx_tp_dealloc_7_cython_6cygrpc_BaseEvent(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_RequestCallEvent(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *p = (struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_BaseEvent)) ? ((__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_RequestCallEvent)); if (e) return e;
+  if (p->tag) {
+    e = (*v)(p->tag, a); if (e) return e;
+  }
+  if (p->call) {
+    e = (*v)(((PyObject *)p->call), a); if (e) return e;
+  }
+  if (p->call_details) {
+    e = (*v)(((PyObject *)p->call_details), a); if (e) return e;
+  }
+  if (p->invocation_metadata) {
+    e = (*v)(p->invocation_metadata, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_RequestCallEvent(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *p = (struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_BaseEvent)) { if (__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_clear) __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_RequestCallEvent);
+  tmp = ((PyObject*)p->tag);
+  p->tag = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->call);
+  p->call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->call_details);
+  p->call_details = ((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->invocation_metadata);
+  p->invocation_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_completion_type(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_16RequestCallEvent_15completion_type_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_success(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_16RequestCallEvent_7success_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_tag(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_16RequestCallEvent_3tag_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_call(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_16RequestCallEvent_4call_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_call_details(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_16RequestCallEvent_12call_details_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_invocation_metadata(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_16RequestCallEvent_19invocation_metadata_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_RequestCallEvent[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16RequestCallEvent_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_RequestCallEvent[] = {
+  {(char *)"completion_type", __pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_completion_type, 0, (char *)0, 0},
+  {(char *)"success", __pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_success, 0, (char *)0, 0},
+  {(char *)"tag", __pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_tag, 0, (char *)0, 0},
+  {(char *)"call", __pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_call, 0, (char *)0, 0},
+  {(char *)"call_details", __pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_call_details, 0, (char *)0, 0},
+  {(char *)"invocation_metadata", __pyx_getprop_7_cython_6cygrpc_16RequestCallEvent_invocation_metadata, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_RequestCallEvent_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_RequestCallEvent},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_RequestCallEvent},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_RequestCallEvent},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_RequestCallEvent},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_RequestCallEvent},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_RequestCallEvent},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_RequestCallEvent_spec = {
+  "_cython.cygrpc.RequestCallEvent",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc_RequestCallEvent_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_RequestCallEvent = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""RequestCallEvent", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_RequestCallEvent, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_RequestCallEvent, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_RequestCallEvent, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_RequestCallEvent, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_RequestCallEvent, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_RequestCallEvent, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_BatchOperationEvent(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_BaseEvent(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)o);
+  p->tag = Py_None; Py_INCREF(Py_None);
+  p->batch_operations = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_BatchOperationEvent(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *p = (struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_BatchOperationEvent) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->tag);
+  Py_CLEAR(p->batch_operations);
+  __pyx_tp_dealloc_7_cython_6cygrpc_BaseEvent(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_BatchOperationEvent(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *p = (struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_BaseEvent)) ? ((__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_BatchOperationEvent)); if (e) return e;
+  if (p->tag) {
+    e = (*v)(p->tag, a); if (e) return e;
+  }
+  if (p->batch_operations) {
+    e = (*v)(p->batch_operations, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_BatchOperationEvent(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *p = (struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_BaseEvent)) { if (__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_clear) __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_BatchOperationEvent);
+  tmp = ((PyObject*)p->tag);
+  p->tag = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->batch_operations);
+  p->batch_operations = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19BatchOperationEvent_completion_type(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_15completion_type_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19BatchOperationEvent_success(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_7success_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19BatchOperationEvent_tag(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_3tag_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19BatchOperationEvent_batch_operations(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_16batch_operations_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_BatchOperationEvent[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19BatchOperationEvent_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_BatchOperationEvent[] = {
+  {(char *)"completion_type", __pyx_getprop_7_cython_6cygrpc_19BatchOperationEvent_completion_type, 0, (char *)0, 0},
+  {(char *)"success", __pyx_getprop_7_cython_6cygrpc_19BatchOperationEvent_success, 0, (char *)0, 0},
+  {(char *)"tag", __pyx_getprop_7_cython_6cygrpc_19BatchOperationEvent_tag, 0, (char *)0, 0},
+  {(char *)"batch_operations", __pyx_getprop_7_cython_6cygrpc_19BatchOperationEvent_batch_operations, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_BatchOperationEvent_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_BatchOperationEvent},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_BatchOperationEvent},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_BatchOperationEvent},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_BatchOperationEvent},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_BatchOperationEvent},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_BatchOperationEvent},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_BatchOperationEvent_spec = {
+  "_cython.cygrpc.BatchOperationEvent",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc_BatchOperationEvent_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_BatchOperationEvent = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""BatchOperationEvent", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_BatchOperationEvent, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_BatchOperationEvent, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_BatchOperationEvent, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_BatchOperationEvent, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_BatchOperationEvent, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_BatchOperationEvent, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ServerShutdownEvent(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_BaseEvent(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)o);
+  p->tag = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ServerShutdownEvent(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *p = (struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ServerShutdownEvent) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->tag);
+  __pyx_tp_dealloc_7_cython_6cygrpc_BaseEvent(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_ServerShutdownEvent(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *p = (struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_BaseEvent)) ? ((__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_ServerShutdownEvent)); if (e) return e;
+  if (p->tag) {
+    e = (*v)(p->tag, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_ServerShutdownEvent(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *p = (struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_BaseEvent)) { if (__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_clear) __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_ServerShutdownEvent);
+  tmp = ((PyObject*)p->tag);
+  p->tag = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19ServerShutdownEvent_completion_type(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_15completion_type_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19ServerShutdownEvent_success(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_7success_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19ServerShutdownEvent_tag(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_3tag_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ServerShutdownEvent[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19ServerShutdownEvent_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_ServerShutdownEvent[] = {
+  {(char *)"completion_type", __pyx_getprop_7_cython_6cygrpc_19ServerShutdownEvent_completion_type, 0, (char *)0, 0},
+  {(char *)"success", __pyx_getprop_7_cython_6cygrpc_19ServerShutdownEvent_success, 0, (char *)0, 0},
+  {(char *)"tag", __pyx_getprop_7_cython_6cygrpc_19ServerShutdownEvent_tag, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ServerShutdownEvent_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ServerShutdownEvent},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_ServerShutdownEvent},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_ServerShutdownEvent},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ServerShutdownEvent},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_ServerShutdownEvent},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ServerShutdownEvent},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ServerShutdownEvent_spec = {
+  "_cython.cygrpc.ServerShutdownEvent",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc_ServerShutdownEvent_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ServerShutdownEvent = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ServerShutdownEvent", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ServerShutdownEvent, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_ServerShutdownEvent, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_ServerShutdownEvent, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ServerShutdownEvent, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_ServerShutdownEvent, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ServerShutdownEvent, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_Operation __pyx_vtable_7_cython_6cygrpc_Operation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_Operation(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_Operation *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_Operation *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_Operation;
+  new((void*)&(p->c_op)) grpc_op();
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_Operation(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_Operation *p = (struct __pyx_obj_7_cython_6cygrpc_Operation *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_Operation) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  __Pyx_call_destructor(p->c_op);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_Operation[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9Operation_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9Operation_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_Operation_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_Operation},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_Operation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_Operation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_Operation_spec = {
+  "_cython.cygrpc.Operation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_Operation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_Operation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_Operation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""Operation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_Operation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_Operation, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_Operation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SendInitialMetadataOperation __pyx_vtable_7_cython_6cygrpc_SendInitialMetadataOperation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SendInitialMetadataOperation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_Operation(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_Operation*)__pyx_vtabptr_7_cython_6cygrpc_SendInitialMetadataOperation;
+  p->_initial_metadata = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_SendInitialMetadataOperation(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *p = (struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_SendInitialMetadataOperation) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_initial_metadata);
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_SendInitialMetadataOperation(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *p = (struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_Operation)) ? ((__pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_SendInitialMetadataOperation)); if (e) return e;
+  if (p->_initial_metadata) {
+    e = (*v)(p->_initial_metadata, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_SendInitialMetadataOperation(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *p = (struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_Operation)) { if (__pyx_ptype_7_cython_6cygrpc_Operation->tp_clear) __pyx_ptype_7_cython_6cygrpc_Operation->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_SendInitialMetadataOperation);
+  tmp = ((PyObject*)p->_initial_metadata);
+  p->_initial_metadata = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_28SendInitialMetadataOperation__initial_metadata(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_17_initial_metadata_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_28SendInitialMetadataOperation__flags(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_6_flags_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_SendInitialMetadataOperation[] = {
+  {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendInitialMetadataOperation_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_SendInitialMetadataOperation[] = {
+  {(char *)"_initial_metadata", __pyx_getprop_7_cython_6cygrpc_28SendInitialMetadataOperation__initial_metadata, 0, (char *)0, 0},
+  {(char *)"_flags", __pyx_getprop_7_cython_6cygrpc_28SendInitialMetadataOperation__flags, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_SendInitialMetadataOperation},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_SendInitialMetadataOperation},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_SendInitialMetadataOperation},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_SendInitialMetadataOperation},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_SendInitialMetadataOperation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_SendInitialMetadataOperation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation_spec = {
+  "_cython.cygrpc.SendInitialMetadataOperation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""SendInitialMetadataOperation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SendInitialMetadataOperation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_SendInitialMetadataOperation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_SendInitialMetadataOperation, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_SendInitialMetadataOperation, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_SendInitialMetadataOperation, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_SendInitialMetadataOperation, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_SendInitialMetadataOperation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SendMessageOperation __pyx_vtable_7_cython_6cygrpc_SendMessageOperation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SendMessageOperation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_Operation(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_Operation*)__pyx_vtabptr_7_cython_6cygrpc_SendMessageOperation;
+  p->_message = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_SendMessageOperation(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *p = (struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_SendMessageOperation) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  Py_CLEAR(p->_message);
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_20SendMessageOperation__message(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_20SendMessageOperation_8_message_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_20SendMessageOperation__flags(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_20SendMessageOperation_6_flags_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_SendMessageOperation[] = {
+  {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20SendMessageOperation_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_SendMessageOperation[] = {
+  {(char *)"_message", __pyx_getprop_7_cython_6cygrpc_20SendMessageOperation__message, 0, (char *)0, 0},
+  {(char *)"_flags", __pyx_getprop_7_cython_6cygrpc_20SendMessageOperation__flags, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_SendMessageOperation_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_SendMessageOperation},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_SendMessageOperation},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_SendMessageOperation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_SendMessageOperation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_SendMessageOperation_spec = {
+  "_cython.cygrpc.SendMessageOperation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_SendMessageOperation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_SendMessageOperation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""SendMessageOperation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SendMessageOperation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_SendMessageOperation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_SendMessageOperation, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_SendMessageOperation, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_SendMessageOperation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SendCloseFromClientOperation __pyx_vtable_7_cython_6cygrpc_SendCloseFromClientOperation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SendCloseFromClientOperation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_Operation(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_Operation*)__pyx_vtabptr_7_cython_6cygrpc_SendCloseFromClientOperation;
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_28SendCloseFromClientOperation__flags(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_6_flags_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_SendCloseFromClientOperation[] = {
+  {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_28SendCloseFromClientOperation_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_SendCloseFromClientOperation[] = {
+  {(char *)"_flags", __pyx_getprop_7_cython_6cygrpc_28SendCloseFromClientOperation__flags, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation_slots[] = {
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_SendCloseFromClientOperation},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_SendCloseFromClientOperation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_SendCloseFromClientOperation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation_spec = {
+  "_cython.cygrpc.SendCloseFromClientOperation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""SendCloseFromClientOperation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SendCloseFromClientOperation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_SendCloseFromClientOperation, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_SendCloseFromClientOperation, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_SendCloseFromClientOperation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_SendStatusFromServerOperation __pyx_vtable_7_cython_6cygrpc_SendStatusFromServerOperation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SendStatusFromServerOperation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_Operation(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_Operation*)__pyx_vtabptr_7_cython_6cygrpc_SendStatusFromServerOperation;
+  new((void*)&(p->_c_details)) grpc_slice();
+  p->_trailing_metadata = Py_None; Py_INCREF(Py_None);
+  p->_code = Py_None; Py_INCREF(Py_None);
+  p->_details = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_SendStatusFromServerOperation(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *p = (struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_SendStatusFromServerOperation) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->_c_details);
+  Py_CLEAR(p->_trailing_metadata);
+  Py_CLEAR(p->_code);
+  Py_CLEAR(p->_details);
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_SendStatusFromServerOperation(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *p = (struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_Operation)) ? ((__pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_SendStatusFromServerOperation)); if (e) return e;
+  if (p->_trailing_metadata) {
+    e = (*v)(p->_trailing_metadata, a); if (e) return e;
+  }
+  if (p->_code) {
+    e = (*v)(p->_code, a); if (e) return e;
+  }
+  if (p->_details) {
+    e = (*v)(p->_details, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_SendStatusFromServerOperation(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *p = (struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_Operation)) { if (__pyx_ptype_7_cython_6cygrpc_Operation->tp_clear) __pyx_ptype_7_cython_6cygrpc_Operation->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_SendStatusFromServerOperation);
+  tmp = ((PyObject*)p->_trailing_metadata);
+  p->_trailing_metadata = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_code);
+  p->_code = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_details);
+  p->_details = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_29SendStatusFromServerOperation__trailing_metadata(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_18_trailing_metadata_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_29SendStatusFromServerOperation__code(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_5_code_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_29SendStatusFromServerOperation__details(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_8_details_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_29SendStatusFromServerOperation__flags(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_6_flags_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_SendStatusFromServerOperation[] = {
+  {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29SendStatusFromServerOperation_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_SendStatusFromServerOperation[] = {
+  {(char *)"_trailing_metadata", __pyx_getprop_7_cython_6cygrpc_29SendStatusFromServerOperation__trailing_metadata, 0, (char *)0, 0},
+  {(char *)"_code", __pyx_getprop_7_cython_6cygrpc_29SendStatusFromServerOperation__code, 0, (char *)0, 0},
+  {(char *)"_details", __pyx_getprop_7_cython_6cygrpc_29SendStatusFromServerOperation__details, 0, (char *)0, 0},
+  {(char *)"_flags", __pyx_getprop_7_cython_6cygrpc_29SendStatusFromServerOperation__flags, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_SendStatusFromServerOperation},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_SendStatusFromServerOperation},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_SendStatusFromServerOperation},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_SendStatusFromServerOperation},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_SendStatusFromServerOperation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_SendStatusFromServerOperation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation_spec = {
+  "_cython.cygrpc.SendStatusFromServerOperation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""SendStatusFromServerOperation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SendStatusFromServerOperation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_SendStatusFromServerOperation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_SendStatusFromServerOperation, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_SendStatusFromServerOperation, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_SendStatusFromServerOperation, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_SendStatusFromServerOperation, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_SendStatusFromServerOperation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveInitialMetadataOperation __pyx_vtable_7_cython_6cygrpc_ReceiveInitialMetadataOperation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ReceiveInitialMetadataOperation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_Operation(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_Operation*)__pyx_vtabptr_7_cython_6cygrpc_ReceiveInitialMetadataOperation;
+  new((void*)&(p->_c_initial_metadata)) grpc_metadata_array();
+  p->_initial_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveInitialMetadataOperation(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveInitialMetadataOperation) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->_c_initial_metadata);
+  Py_CLEAR(p->_initial_metadata);
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_ReceiveInitialMetadataOperation(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_Operation)) ? ((__pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_ReceiveInitialMetadataOperation)); if (e) return e;
+  if (p->_initial_metadata) {
+    e = (*v)(p->_initial_metadata, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_ReceiveInitialMetadataOperation(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_Operation)) { if (__pyx_ptype_7_cython_6cygrpc_Operation->tp_clear) __pyx_ptype_7_cython_6cygrpc_Operation->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_ReceiveInitialMetadataOperation);
+  tmp = ((PyObject*)p->_initial_metadata);
+  p->_initial_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_31ReceiveInitialMetadataOperation__flags(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_6_flags_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ReceiveInitialMetadataOperation[] = {
+  {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_5initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_ReceiveInitialMetadataOperation[] = {
+  {(char *)"_flags", __pyx_getprop_7_cython_6cygrpc_31ReceiveInitialMetadataOperation__flags, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ReceiveInitialMetadataOperation},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_ReceiveInitialMetadataOperation},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_ReceiveInitialMetadataOperation},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ReceiveInitialMetadataOperation},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_ReceiveInitialMetadataOperation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ReceiveInitialMetadataOperation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation_spec = {
+  "_cython.cygrpc.ReceiveInitialMetadataOperation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ReceiveInitialMetadataOperation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ReceiveInitialMetadataOperation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveInitialMetadataOperation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_ReceiveInitialMetadataOperation, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_ReceiveInitialMetadataOperation, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ReceiveInitialMetadataOperation, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_ReceiveInitialMetadataOperation, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ReceiveInitialMetadataOperation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveMessageOperation __pyx_vtable_7_cython_6cygrpc_ReceiveMessageOperation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ReceiveMessageOperation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_Operation(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_Operation*)__pyx_vtabptr_7_cython_6cygrpc_ReceiveMessageOperation;
+  p->_message = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveMessageOperation(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveMessageOperation) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  Py_CLEAR(p->_message);
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_23ReceiveMessageOperation__flags(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_6_flags_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ReceiveMessageOperation[] = {
+  {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"message", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_5message, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_23ReceiveMessageOperation_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_ReceiveMessageOperation[] = {
+  {(char *)"_flags", __pyx_getprop_7_cython_6cygrpc_23ReceiveMessageOperation__flags, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ReceiveMessageOperation_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ReceiveMessageOperation},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ReceiveMessageOperation},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_ReceiveMessageOperation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ReceiveMessageOperation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ReceiveMessageOperation_spec = {
+  "_cython.cygrpc.ReceiveMessageOperation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_ReceiveMessageOperation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ReceiveMessageOperation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ReceiveMessageOperation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ReceiveMessageOperation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveMessageOperation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ReceiveMessageOperation, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_ReceiveMessageOperation, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ReceiveMessageOperation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveStatusOnClientOperation __pyx_vtable_7_cython_6cygrpc_ReceiveStatusOnClientOperation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ReceiveStatusOnClientOperation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_Operation(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_Operation*)__pyx_vtabptr_7_cython_6cygrpc_ReceiveStatusOnClientOperation;
+  new((void*)&(p->_c_trailing_metadata)) grpc_metadata_array();
+  new((void*)&(p->_c_details)) grpc_slice();
+  p->_trailing_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_code = Py_None; Py_INCREF(Py_None);
+  p->_details = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_error_string = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveStatusOnClientOperation(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveStatusOnClientOperation) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->_c_trailing_metadata);
+  __Pyx_call_destructor(p->_c_details);
+  Py_CLEAR(p->_trailing_metadata);
+  Py_CLEAR(p->_code);
+  Py_CLEAR(p->_details);
+  Py_CLEAR(p->_error_string);
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_ReceiveStatusOnClientOperation(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_Operation)) ? ((__pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_ReceiveStatusOnClientOperation)); if (e) return e;
+  if (p->_trailing_metadata) {
+    e = (*v)(p->_trailing_metadata, a); if (e) return e;
+  }
+  if (p->_code) {
+    e = (*v)(p->_code, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_ReceiveStatusOnClientOperation(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_Operation)) { if (__pyx_ptype_7_cython_6cygrpc_Operation->tp_clear) __pyx_ptype_7_cython_6cygrpc_Operation->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+  tmp = ((PyObject*)p->_trailing_metadata);
+  p->_trailing_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_code);
+  p->_code = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_30ReceiveStatusOnClientOperation__flags(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_6_flags_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ReceiveStatusOnClientOperation[] = {
+  {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_5trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_7code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_9details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"error_string", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_11error_string, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_13__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_15__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_ReceiveStatusOnClientOperation[] = {
+  {(char *)"_flags", __pyx_getprop_7_cython_6cygrpc_30ReceiveStatusOnClientOperation__flags, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ReceiveStatusOnClientOperation},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_ReceiveStatusOnClientOperation},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_ReceiveStatusOnClientOperation},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ReceiveStatusOnClientOperation},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_ReceiveStatusOnClientOperation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ReceiveStatusOnClientOperation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation_spec = {
+  "_cython.cygrpc.ReceiveStatusOnClientOperation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ReceiveStatusOnClientOperation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ReceiveStatusOnClientOperation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveStatusOnClientOperation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_ReceiveStatusOnClientOperation, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_ReceiveStatusOnClientOperation, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ReceiveStatusOnClientOperation, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_ReceiveStatusOnClientOperation, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ReceiveStatusOnClientOperation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ReceiveCloseOnServerOperation __pyx_vtable_7_cython_6cygrpc_ReceiveCloseOnServerOperation;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ReceiveCloseOnServerOperation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_Operation(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_Operation*)__pyx_vtabptr_7_cython_6cygrpc_ReceiveCloseOnServerOperation;
+  p->_cancelled = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveCloseOnServerOperation(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveCloseOnServerOperation) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_cancelled);
+  __pyx_tp_dealloc_7_cython_6cygrpc_Operation(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_ReceiveCloseOnServerOperation(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_Operation)) ? ((__pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_Operation->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_ReceiveCloseOnServerOperation)); if (e) return e;
+  if (p->_cancelled) {
+    e = (*v)(p->_cancelled, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_ReceiveCloseOnServerOperation(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *p = (struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_Operation)) { if (__pyx_ptype_7_cython_6cygrpc_Operation->tp_clear) __pyx_ptype_7_cython_6cygrpc_Operation->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_ReceiveCloseOnServerOperation);
+  tmp = ((PyObject*)p->_cancelled);
+  p->_cancelled = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_29ReceiveCloseOnServerOperation__flags(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_6_flags_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ReceiveCloseOnServerOperation[] = {
+  {"type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_3type, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"cancelled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_5cancelled, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_ReceiveCloseOnServerOperation[] = {
+  {(char *)"_flags", __pyx_getprop_7_cython_6cygrpc_29ReceiveCloseOnServerOperation__flags, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_ReceiveCloseOnServerOperation},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_ReceiveCloseOnServerOperation},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_ReceiveCloseOnServerOperation},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ReceiveCloseOnServerOperation},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_ReceiveCloseOnServerOperation},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ReceiveCloseOnServerOperation},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation_spec = {
+  "_cython.cygrpc.ReceiveCloseOnServerOperation",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ReceiveCloseOnServerOperation", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ReceiveCloseOnServerOperation), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ReceiveCloseOnServerOperation, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_ReceiveCloseOnServerOperation, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_ReceiveCloseOnServerOperation, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ReceiveCloseOnServerOperation, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_ReceiveCloseOnServerOperation, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ReceiveCloseOnServerOperation, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallDetails(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CallDetails *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)o);
+  new((void*)&(p->c_details)) grpc_call_details();
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_11CallDetails_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CallDetails(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_CallDetails *p = (struct __pyx_obj_7_cython_6cygrpc_CallDetails *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CallDetails) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_11CallDetails_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  __Pyx_call_destructor(p->c_details);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_11CallDetails_method(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_11CallDetails_6method_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_11CallDetails_host(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_11CallDetails_4host_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_11CallDetails_deadline(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_11CallDetails_8deadline_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CallDetails[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11CallDetails_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_11CallDetails_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_CallDetails[] = {
+  {(char *)"method", __pyx_getprop_7_cython_6cygrpc_11CallDetails_method, 0, (char *)0, 0},
+  {(char *)"host", __pyx_getprop_7_cython_6cygrpc_11CallDetails_host, 0, (char *)0, 0},
+  {(char *)"deadline", __pyx_getprop_7_cython_6cygrpc_11CallDetails_deadline, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CallDetails_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CallDetails},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CallDetails},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_CallDetails},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CallDetails},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CallDetails_spec = {
+  "_cython.cygrpc.CallDetails",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallDetails),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_CallDetails_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CallDetails = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CallDetails", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallDetails), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CallDetails, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CallDetails, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_CallDetails, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CallDetails, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_SslPemKeyCertPair(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)o);
+  new((void*)&(p->c_pair)) grpc_ssl_pem_key_cert_pair();
+  p->private_key = Py_None; Py_INCREF(Py_None);
+  p->certificate_chain = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_SslPemKeyCertPair(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *p = (struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_SslPemKeyCertPair) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->c_pair);
+  Py_CLEAR(p->private_key);
+  Py_CLEAR(p->certificate_chain);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_SslPemKeyCertPair(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *p = (struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)o;
+  if (p->private_key) {
+    e = (*v)(p->private_key, a); if (e) return e;
+  }
+  if (p->certificate_chain) {
+    e = (*v)(p->certificate_chain, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_SslPemKeyCertPair(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *p = (struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair *)o;
+  tmp = ((PyObject*)p->private_key);
+  p->private_key = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->certificate_chain);
+  p->certificate_chain = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_17SslPemKeyCertPair_private_key(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_11private_key_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_17SslPemKeyCertPair_certificate_chain(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_17certificate_chain_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_SslPemKeyCertPair[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_17SslPemKeyCertPair_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_SslPemKeyCertPair[] = {
+  {(char *)"private_key", __pyx_getprop_7_cython_6cygrpc_17SslPemKeyCertPair_private_key, 0, (char *)0, 0},
+  {(char *)"certificate_chain", __pyx_getprop_7_cython_6cygrpc_17SslPemKeyCertPair_certificate_chain, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_SslPemKeyCertPair_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_SslPemKeyCertPair},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_SslPemKeyCertPair},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_SslPemKeyCertPair},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_SslPemKeyCertPair},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_SslPemKeyCertPair},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_SslPemKeyCertPair},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_SslPemKeyCertPair_spec = {
+  "_cython.cygrpc.SslPemKeyCertPair",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_SslPemKeyCertPair_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_SslPemKeyCertPair = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""SslPemKeyCertPair", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_SslPemKeyCertPair), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_SslPemKeyCertPair, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_SslPemKeyCertPair, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_SslPemKeyCertPair, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_SslPemKeyCertPair, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_SslPemKeyCertPair, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_SslPemKeyCertPair, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CompressionOptions(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)o);
+  new((void*)&(p->c_options)) grpc_compression_options();
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_18CompressionOptions_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CompressionOptions(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *p = (struct __pyx_obj_7_cython_6cygrpc_CompressionOptions *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CompressionOptions) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  __Pyx_call_destructor(p->c_options);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CompressionOptions[] = {
+  {"enable_algorithm", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_3enable_algorithm, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"disable_algorithm", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_5disable_algorithm, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"is_algorithm_enabled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_7is_algorithm_enabled, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"to_channel_arg", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_9to_channel_arg, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_11__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18CompressionOptions_13__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CompressionOptions_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CompressionOptions},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CompressionOptions},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CompressionOptions},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CompressionOptions_spec = {
+  "_cython.cygrpc.CompressionOptions",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_CompressionOptions_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CompressionOptions = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CompressionOptions", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CompressionOptions), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CompressionOptions, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CompressionOptions, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CompressionOptions, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_Server __pyx_vtable_7_cython_6cygrpc_Server;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_Server(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_Server *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_Server *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_Server;
+  p->backup_shutdown_queue = ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)Py_None); Py_INCREF(Py_None);
+  p->references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->registered_completion_queues = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_6Server_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_Server(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_Server *p = (struct __pyx_obj_7_cython_6cygrpc_Server *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_Server) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_6Server_17__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->backup_shutdown_queue);
+  Py_CLEAR(p->references);
+  Py_CLEAR(p->registered_completion_queues);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_Server(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_Server *p = (struct __pyx_obj_7_cython_6cygrpc_Server *)o;
+  if (p->backup_shutdown_queue) {
+    e = (*v)(((PyObject *)p->backup_shutdown_queue), a); if (e) return e;
+  }
+  if (p->references) {
+    e = (*v)(p->references, a); if (e) return e;
+  }
+  if (p->registered_completion_queues) {
+    e = (*v)(p->registered_completion_queues, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_Server(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_Server *p = (struct __pyx_obj_7_cython_6cygrpc_Server *)o;
+  tmp = ((PyObject*)p->backup_shutdown_queue);
+  p->backup_shutdown_queue = ((struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->references);
+  p->references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->registered_completion_queues);
+  p->registered_completion_queues = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_Server[] = {
+  {"request_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_3request_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"register_completion_queue", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_5register_completion_queue, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"start", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_7start, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_6Server_6start},
+  {"add_http2_port", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_9add_http2_port, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"shutdown", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_11shutdown, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"cancel_all_calls", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_13cancel_all_calls, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"destroy", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_15destroy, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_19__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_6Server_21__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_Server_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_Server},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_Server},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_Server},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_Server},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_Server},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_Server_spec = {
+  "_cython.cygrpc.Server",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_Server),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_Server_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_Server = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""Server", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_Server), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_Server, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_Server, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_Server, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_Server, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_Server, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc__Tag __pyx_vtable_7_cython_6cygrpc__Tag;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__Tag(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__Tag *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__Tag *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc__Tag;
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__Tag(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__Tag) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__Tag[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_Tag_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_4_Tag_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__Tag_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__Tag},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__Tag},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__Tag},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__Tag_spec = {
+  "_cython.cygrpc._Tag",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__Tag),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc__Tag_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__Tag = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_Tag", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__Tag), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__Tag, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__Tag, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__Tag, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc__ConnectivityTag __pyx_vtable_7_cython_6cygrpc__ConnectivityTag;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ConnectivityTag(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc__Tag(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc__Tag*)__pyx_vtabptr_7_cython_6cygrpc__ConnectivityTag;
+  p->_user_tag = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__ConnectivityTag(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *p = (struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__ConnectivityTag) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_user_tag);
+  __pyx_tp_dealloc_7_cython_6cygrpc__Tag(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__ConnectivityTag(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *p = (struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc__Tag)) ? ((__pyx_ptype_7_cython_6cygrpc__Tag->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc__Tag->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc__ConnectivityTag)); if (e) return e;
+  if (p->_user_tag) {
+    e = (*v)(p->_user_tag, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__ConnectivityTag(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *p = (struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc__Tag)) { if (__pyx_ptype_7_cython_6cygrpc__Tag->tp_clear) __pyx_ptype_7_cython_6cygrpc__Tag->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc__ConnectivityTag);
+  tmp = ((PyObject*)p->_user_tag);
+  p->_user_tag = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_16_ConnectivityTag__user_tag(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_9_user_tag_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__ConnectivityTag[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ConnectivityTag_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc__ConnectivityTag[] = {
+  {(char *)"_user_tag", __pyx_getprop_7_cython_6cygrpc_16_ConnectivityTag__user_tag, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__ConnectivityTag_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__ConnectivityTag},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__ConnectivityTag},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__ConnectivityTag},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__ConnectivityTag},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc__ConnectivityTag},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__ConnectivityTag},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__ConnectivityTag_spec = {
+  "_cython.cygrpc._ConnectivityTag",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__ConnectivityTag_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__ConnectivityTag = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_ConnectivityTag", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__ConnectivityTag, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__ConnectivityTag, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__ConnectivityTag, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__ConnectivityTag, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc__ConnectivityTag, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__ConnectivityTag, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc__RequestCallTag __pyx_vtable_7_cython_6cygrpc__RequestCallTag;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__RequestCallTag(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc__Tag(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc__Tag*)__pyx_vtabptr_7_cython_6cygrpc__RequestCallTag;
+  new((void*)&(p->c_invocation_metadata)) grpc_metadata_array();
+  p->_user_tag = Py_None; Py_INCREF(Py_None);
+  p->call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)Py_None); Py_INCREF(Py_None);
+  p->call_details = ((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__RequestCallTag(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *p = (struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__RequestCallTag) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->c_invocation_metadata);
+  Py_CLEAR(p->_user_tag);
+  Py_CLEAR(p->call);
+  Py_CLEAR(p->call_details);
+  __pyx_tp_dealloc_7_cython_6cygrpc__Tag(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__RequestCallTag(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *p = (struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc__Tag)) ? ((__pyx_ptype_7_cython_6cygrpc__Tag->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc__Tag->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc__RequestCallTag)); if (e) return e;
+  if (p->_user_tag) {
+    e = (*v)(p->_user_tag, a); if (e) return e;
+  }
+  if (p->call) {
+    e = (*v)(((PyObject *)p->call), a); if (e) return e;
+  }
+  if (p->call_details) {
+    e = (*v)(((PyObject *)p->call_details), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__RequestCallTag(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *p = (struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc__Tag)) { if (__pyx_ptype_7_cython_6cygrpc__Tag->tp_clear) __pyx_ptype_7_cython_6cygrpc__Tag->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc__RequestCallTag);
+  tmp = ((PyObject*)p->_user_tag);
+  p->_user_tag = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->call);
+  p->call = ((struct __pyx_obj_7_cython_6cygrpc_Call *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->call_details);
+  p->call_details = ((struct __pyx_obj_7_cython_6cygrpc_CallDetails *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_15_RequestCallTag__user_tag(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_15_RequestCallTag_9_user_tag_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__RequestCallTag[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_RequestCallTag_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc__RequestCallTag[] = {
+  {(char *)"_user_tag", __pyx_getprop_7_cython_6cygrpc_15_RequestCallTag__user_tag, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__RequestCallTag_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__RequestCallTag},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__RequestCallTag},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__RequestCallTag},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__RequestCallTag},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc__RequestCallTag},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__RequestCallTag},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__RequestCallTag_spec = {
+  "_cython.cygrpc._RequestCallTag",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__RequestCallTag_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__RequestCallTag = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_RequestCallTag", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__RequestCallTag, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__RequestCallTag, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__RequestCallTag, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__RequestCallTag, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc__RequestCallTag, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__RequestCallTag, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc__BatchOperationTag __pyx_vtable_7_cython_6cygrpc__BatchOperationTag;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__BatchOperationTag(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc__Tag(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc__Tag*)__pyx_vtabptr_7_cython_6cygrpc__BatchOperationTag;
+  p->_user_tag = Py_None; Py_INCREF(Py_None);
+  p->_operations = Py_None; Py_INCREF(Py_None);
+  p->_retained_call = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__BatchOperationTag(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *p = (struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__BatchOperationTag) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_user_tag);
+  Py_CLEAR(p->_operations);
+  Py_CLEAR(p->_retained_call);
+  __pyx_tp_dealloc_7_cython_6cygrpc__Tag(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__BatchOperationTag(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *p = (struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc__Tag)) ? ((__pyx_ptype_7_cython_6cygrpc__Tag->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc__Tag->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc__BatchOperationTag)); if (e) return e;
+  if (p->_user_tag) {
+    e = (*v)(p->_user_tag, a); if (e) return e;
+  }
+  if (p->_operations) {
+    e = (*v)(p->_operations, a); if (e) return e;
+  }
+  if (p->_retained_call) {
+    e = (*v)(p->_retained_call, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__BatchOperationTag(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *p = (struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc__Tag)) { if (__pyx_ptype_7_cython_6cygrpc__Tag->tp_clear) __pyx_ptype_7_cython_6cygrpc__Tag->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc__BatchOperationTag);
+  tmp = ((PyObject*)p->_user_tag);
+  p->_user_tag = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_operations);
+  p->_operations = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_retained_call);
+  p->_retained_call = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_18_BatchOperationTag__operations(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_11_operations_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_18_BatchOperationTag__retained_call(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_14_retained_call_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__BatchOperationTag[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_BatchOperationTag_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc__BatchOperationTag[] = {
+  {(char *)"_operations", __pyx_getprop_7_cython_6cygrpc_18_BatchOperationTag__operations, 0, (char *)0, 0},
+  {(char *)"_retained_call", __pyx_getprop_7_cython_6cygrpc_18_BatchOperationTag__retained_call, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__BatchOperationTag_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__BatchOperationTag},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__BatchOperationTag},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__BatchOperationTag},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__BatchOperationTag},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc__BatchOperationTag},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__BatchOperationTag},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__BatchOperationTag_spec = {
+  "_cython.cygrpc._BatchOperationTag",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__BatchOperationTag_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__BatchOperationTag = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_BatchOperationTag", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__BatchOperationTag, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__BatchOperationTag, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__BatchOperationTag, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__BatchOperationTag, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc__BatchOperationTag, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__BatchOperationTag, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc__ServerShutdownTag __pyx_vtable_7_cython_6cygrpc__ServerShutdownTag;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ServerShutdownTag(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc__Tag(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc__Tag*)__pyx_vtabptr_7_cython_6cygrpc__ServerShutdownTag;
+  p->_user_tag = Py_None; Py_INCREF(Py_None);
+  p->_shutting_down_server = ((struct __pyx_obj_7_cython_6cygrpc_Server *)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__ServerShutdownTag(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *p = (struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__ServerShutdownTag) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_user_tag);
+  Py_CLEAR(p->_shutting_down_server);
+  __pyx_tp_dealloc_7_cython_6cygrpc__Tag(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__ServerShutdownTag(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *p = (struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc__Tag)) ? ((__pyx_ptype_7_cython_6cygrpc__Tag->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc__Tag->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc__ServerShutdownTag)); if (e) return e;
+  if (p->_user_tag) {
+    e = (*v)(p->_user_tag, a); if (e) return e;
+  }
+  if (p->_shutting_down_server) {
+    e = (*v)(((PyObject *)p->_shutting_down_server), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__ServerShutdownTag(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *p = (struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc__Tag)) { if (__pyx_ptype_7_cython_6cygrpc__Tag->tp_clear) __pyx_ptype_7_cython_6cygrpc__Tag->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc__ServerShutdownTag);
+  tmp = ((PyObject*)p->_user_tag);
+  p->_user_tag = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_shutting_down_server);
+  p->_shutting_down_server = ((struct __pyx_obj_7_cython_6cygrpc_Server *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_18_ServerShutdownTag__user_tag(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_9_user_tag_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_18_ServerShutdownTag__shutting_down_server(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_21_shutting_down_server_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__ServerShutdownTag[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_18_ServerShutdownTag_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc__ServerShutdownTag[] = {
+  {(char *)"_user_tag", __pyx_getprop_7_cython_6cygrpc_18_ServerShutdownTag__user_tag, 0, (char *)0, 0},
+  {(char *)"_shutting_down_server", __pyx_getprop_7_cython_6cygrpc_18_ServerShutdownTag__shutting_down_server, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__ServerShutdownTag_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__ServerShutdownTag},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__ServerShutdownTag},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__ServerShutdownTag},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__ServerShutdownTag},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc__ServerShutdownTag},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__ServerShutdownTag},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__ServerShutdownTag_spec = {
+  "_cython.cygrpc._ServerShutdownTag",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__ServerShutdownTag_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__ServerShutdownTag = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_ServerShutdownTag", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__ServerShutdownTag, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__ServerShutdownTag, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__ServerShutdownTag, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__ServerShutdownTag, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc__ServerShutdownTag, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__ServerShutdownTag, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_BaseCompletionQueue __pyx_vtable_7_cython_6cygrpc_BaseCompletionQueue;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_BaseCompletionQueue(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_BaseCompletionQueue;
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_BaseCompletionQueue(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_BaseCompletionQueue) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_BaseCompletionQueue[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19BaseCompletionQueue_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19BaseCompletionQueue_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_BaseCompletionQueue_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_BaseCompletionQueue},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_BaseCompletionQueue},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_BaseCompletionQueue},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_BaseCompletionQueue_spec = {
+  "_cython.cygrpc.BaseCompletionQueue",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_BaseCompletionQueue_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_BaseCompletionQueue = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""BaseCompletionQueue", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_BaseCompletionQueue, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_BaseCompletionQueue, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_BaseCompletionQueue, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__BoundEventLoop(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)o);
+  p->loop = Py_None; Py_INCREF(Py_None);
+  p->read_socket = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__BoundEventLoop(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *p = (struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__BoundEventLoop) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->loop);
+  Py_CLEAR(p->read_socket);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__BoundEventLoop(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *p = (struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)o;
+  if (p->loop) {
+    e = (*v)(p->loop, a); if (e) return e;
+  }
+  if (p->read_socket) {
+    e = (*v)(p->read_socket, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__BoundEventLoop(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *p = (struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop *)o;
+  tmp = ((PyObject*)p->loop);
+  p->loop = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->read_socket);
+  p->read_socket = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_15_BoundEventLoop_loop(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_4loop_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_15_BoundEventLoop_read_socket(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_11read_socket_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__BoundEventLoop[] = {
+  {"close", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_3close, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_BoundEventLoop_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc__BoundEventLoop[] = {
+  {(char *)"loop", __pyx_getprop_7_cython_6cygrpc_15_BoundEventLoop_loop, 0, (char *)0, 0},
+  {(char *)"read_socket", __pyx_getprop_7_cython_6cygrpc_15_BoundEventLoop_read_socket, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__BoundEventLoop_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__BoundEventLoop},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__BoundEventLoop},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__BoundEventLoop},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__BoundEventLoop},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc__BoundEventLoop},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__BoundEventLoop},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__BoundEventLoop_spec = {
+  "_cython.cygrpc._BoundEventLoop",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__BoundEventLoop_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__BoundEventLoop = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_BoundEventLoop", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__BoundEventLoop), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__BoundEventLoop, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__BoundEventLoop, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__BoundEventLoop, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__BoundEventLoop, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc__BoundEventLoop, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__BoundEventLoop, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_PollerCompletionQueue __pyx_vtable_7_cython_6cygrpc_PollerCompletionQueue;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_PollerCompletionQueue(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_BaseCompletionQueue(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_BaseCompletionQueue*)__pyx_vtabptr_7_cython_6cygrpc_PollerCompletionQueue;
+  new((void*)&(p->_queue)) __pyx_t_7_cython_6cygrpc_cpp_event_queue();
+  new((void*)&(p->_queue_mutex)) std::mutex();
+  p->_poller_thread = Py_None; Py_INCREF(Py_None);
+  p->_read_socket = Py_None; Py_INCREF(Py_None);
+  p->_write_socket = Py_None; Py_INCREF(Py_None);
+  p->_loops = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_PollerCompletionQueue(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *p = (struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_PollerCompletionQueue) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->_queue);
+  __Pyx_call_destructor(p->_queue_mutex);
+  Py_CLEAR(p->_poller_thread);
+  Py_CLEAR(p->_read_socket);
+  Py_CLEAR(p->_write_socket);
+  Py_CLEAR(p->_loops);
+  __pyx_tp_dealloc_7_cython_6cygrpc_BaseCompletionQueue(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_PollerCompletionQueue(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *p = (struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue)) ? ((__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_PollerCompletionQueue)); if (e) return e;
+  if (p->_poller_thread) {
+    e = (*v)(p->_poller_thread, a); if (e) return e;
+  }
+  if (p->_read_socket) {
+    e = (*v)(p->_read_socket, a); if (e) return e;
+  }
+  if (p->_write_socket) {
+    e = (*v)(p->_write_socket, a); if (e) return e;
+  }
+  if (p->_loops) {
+    e = (*v)(p->_loops, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_PollerCompletionQueue(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *p = (struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue)) { if (__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue->tp_clear) __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_PollerCompletionQueue);
+  tmp = ((PyObject*)p->_poller_thread);
+  p->_poller_thread = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_read_socket);
+  p->_read_socket = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_write_socket);
+  p->_write_socket = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_loops);
+  p->_loops = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_PollerCompletionQueue[] = {
+  {"bind_loop", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_3bind_loop, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"_poll_wrapper", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_5_poll_wrapper, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"_handle_events", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_7_handle_events, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_9__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21PollerCompletionQueue_11__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_PollerCompletionQueue_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_PollerCompletionQueue},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_PollerCompletionQueue},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_PollerCompletionQueue},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_PollerCompletionQueue},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_PollerCompletionQueue},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_PollerCompletionQueue_spec = {
+  "_cython.cygrpc.PollerCompletionQueue",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_PollerCompletionQueue_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_PollerCompletionQueue = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""PollerCompletionQueue", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_PollerCompletionQueue, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_PollerCompletionQueue, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_PollerCompletionQueue, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_PollerCompletionQueue, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_PollerCompletionQueue, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_AioRpcStatus __pyx_vtable_7_cython_6cygrpc_AioRpcStatus;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_AioRpcStatus(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *p;
+  PyObject *o = __Pyx_PyType_GetSlot((&((PyTypeObject*)PyExc_Exception)[0]), tp_new, newfunc)(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_AioRpcStatus;
+  p->_details = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_trailing_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_debug_error_string = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_AioRpcStatus(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *p = (struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_AioRpcStatus) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_details);
+  Py_CLEAR(p->_trailing_metadata);
+  Py_CLEAR(p->_debug_error_string);
+  PyObject_GC_Track(o);
+  __Pyx_PyType_GetSlot((&((PyTypeObject*)PyExc_Exception)[0]), tp_dealloc, destructor)(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_AioRpcStatus(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *p = (struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)o;
+  if (!(&((PyTypeObject*)PyExc_Exception)[0])->tp_traverse); else { e = (&((PyTypeObject*)PyExc_Exception)[0])->tp_traverse(o,v,a); if (e) return e; }
+  if (p->_trailing_metadata) {
+    e = (*v)(p->_trailing_metadata, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_AioRpcStatus(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *p = (struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)o;
+  if (!(&((PyTypeObject*)PyExc_Exception)[0])->tp_clear); else (&((PyTypeObject*)PyExc_Exception)[0])->tp_clear(o);
+  tmp = ((PyObject*)p->_trailing_metadata);
+  p->_trailing_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_12AioRpcStatus__code(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_5_code_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_12AioRpcStatus__details(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_8_details_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_12AioRpcStatus__trailing_metadata(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_18_trailing_metadata_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_12AioRpcStatus__debug_error_string(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_12AioRpcStatus_19_debug_error_string_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_AioRpcStatus[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_11__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_12AioRpcStatus_13__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc_AioRpcStatus[] = {
+  {(char *)"_code", __pyx_getprop_7_cython_6cygrpc_12AioRpcStatus__code, 0, (char *)0, 0},
+  {(char *)"_details", __pyx_getprop_7_cython_6cygrpc_12AioRpcStatus__details, 0, (char *)0, 0},
+  {(char *)"_trailing_metadata", __pyx_getprop_7_cython_6cygrpc_12AioRpcStatus__trailing_metadata, 0, (char *)0, 0},
+  {(char *)"_debug_error_string", __pyx_getprop_7_cython_6cygrpc_12AioRpcStatus__debug_error_string, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_AioRpcStatus_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_AioRpcStatus},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_AioRpcStatus},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_AioRpcStatus},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_AioRpcStatus},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc_AioRpcStatus},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_AioRpcStatus},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_AioRpcStatus_spec = {
+  "_cython.cygrpc.AioRpcStatus",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc_AioRpcStatus_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_AioRpcStatus = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""AioRpcStatus", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_AioRpcStatus, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_AioRpcStatus, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_AioRpcStatus, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_AioRpcStatus, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc_AioRpcStatus, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_AioRpcStatus, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__AioState(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__AioState *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__AioState *)o);
+  p->lock = Py_None; Py_INCREF(Py_None);
+  p->engine = Py_None; Py_INCREF(Py_None);
+  p->cq = ((struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_9_AioState_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__AioState(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__AioState *p = (struct __pyx_obj_7_cython_6cygrpc__AioState *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__AioState) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->lock);
+  Py_CLEAR(p->engine);
+  Py_CLEAR(p->cq);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__AioState(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__AioState *p = (struct __pyx_obj_7_cython_6cygrpc__AioState *)o;
+  if (p->lock) {
+    e = (*v)(p->lock, a); if (e) return e;
+  }
+  if (p->engine) {
+    e = (*v)(p->engine, a); if (e) return e;
+  }
+  if (p->cq) {
+    e = (*v)(((PyObject *)p->cq), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__AioState(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__AioState *p = (struct __pyx_obj_7_cython_6cygrpc__AioState *)o;
+  tmp = ((PyObject*)p->lock);
+  p->lock = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->engine);
+  p->engine = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->cq);
+  p->cq = ((struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__AioState[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9_AioState_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9_AioState_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__AioState_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__AioState},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__AioState},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__AioState},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__AioState},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__AioState},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__AioState_spec = {
+  "_cython.cygrpc._AioState",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__AioState),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__AioState_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__AioState = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_AioState", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__AioState), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__AioState, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__AioState, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__AioState, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__AioState, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__AioState, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackFailureHandler __pyx_vtable_7_cython_6cygrpc_CallbackFailureHandler;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallbackFailureHandler(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_CallbackFailureHandler;
+  p->_core_function_name = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_error_details = Py_None; Py_INCREF(Py_None);
+  p->_exception_type = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CallbackFailureHandler(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *p = (struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CallbackFailureHandler) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_core_function_name);
+  Py_CLEAR(p->_error_details);
+  Py_CLEAR(p->_exception_type);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_CallbackFailureHandler(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *p = (struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)o;
+  if (p->_error_details) {
+    e = (*v)(p->_error_details, a); if (e) return e;
+  }
+  if (p->_exception_type) {
+    e = (*v)(p->_exception_type, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_CallbackFailureHandler(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *p = (struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)o;
+  tmp = ((PyObject*)p->_error_details);
+  p->_error_details = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_exception_type);
+  p->_exception_type = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CallbackFailureHandler[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_22CallbackFailureHandler_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CallbackFailureHandler_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CallbackFailureHandler},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_CallbackFailureHandler},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_CallbackFailureHandler},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CallbackFailureHandler},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CallbackFailureHandler},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CallbackFailureHandler_spec = {
+  "_cython.cygrpc.CallbackFailureHandler",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_CallbackFailureHandler_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CallbackFailureHandler = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CallbackFailureHandler", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CallbackFailureHandler, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_CallbackFailureHandler, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_CallbackFailureHandler, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CallbackFailureHandler, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CallbackFailureHandler, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_CallbackWrapper __pyx_vtable_7_cython_6cygrpc_CallbackWrapper;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CallbackWrapper(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_CallbackWrapper;
+  new((void*)&(p->context)) struct __pyx_t_7_cython_6cygrpc_CallbackContext();
+  p->_reference_of_future = Py_None; Py_INCREF(Py_None);
+  p->_reference_of_failure_handler = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CallbackWrapper(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *p = (struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CallbackWrapper) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->context);
+  Py_CLEAR(p->_reference_of_future);
+  Py_CLEAR(p->_reference_of_failure_handler);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_CallbackWrapper(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *p = (struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)o;
+  if (p->_reference_of_future) {
+    e = (*v)(p->_reference_of_future, a); if (e) return e;
+  }
+  if (p->_reference_of_failure_handler) {
+    e = (*v)(p->_reference_of_failure_handler, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_CallbackWrapper(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *p = (struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)o;
+  tmp = ((PyObject*)p->_reference_of_future);
+  p->_reference_of_future = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_reference_of_failure_handler);
+  p->_reference_of_failure_handler = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CallbackWrapper[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15CallbackWrapper_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CallbackWrapper_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CallbackWrapper},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_CallbackWrapper},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_CallbackWrapper},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CallbackWrapper},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CallbackWrapper},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CallbackWrapper_spec = {
+  "_cython.cygrpc.CallbackWrapper",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_CallbackWrapper_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CallbackWrapper = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CallbackWrapper", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CallbackWrapper, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_CallbackWrapper, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_CallbackWrapper, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CallbackWrapper, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CallbackWrapper, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_GrpcCallWrapper(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_GrpcCallWrapper(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_GrpcCallWrapper) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_GrpcCallWrapper_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_GrpcCallWrapper},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_GrpcCallWrapper},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_GrpcCallWrapper_spec = {
+  "_cython.cygrpc.GrpcCallWrapper",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc_GrpcCallWrapper_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_GrpcCallWrapper = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""GrpcCallWrapper", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_GrpcCallWrapper), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_GrpcCallWrapper, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_GrpcCallWrapper, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc__AioCall __pyx_vtable_7_cython_6cygrpc__AioCall;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__AioCall(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_GrpcCallWrapper(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc__AioCall *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc__AioCall;
+  p->_channel = ((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)Py_None); Py_INCREF(Py_None);
+  p->_references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_deadline = Py_None; Py_INCREF(Py_None);
+  p->_done_callbacks = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_loop = Py_None; Py_INCREF(Py_None);
+  p->_status = ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)Py_None); Py_INCREF(Py_None);
+  p->_initial_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_waiters_status = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_waiters_initial_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_8_AioCall_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__AioCall(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *p = (struct __pyx_obj_7_cython_6cygrpc__AioCall *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__AioCall) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_8_AioCall_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->_channel);
+  Py_CLEAR(p->_references);
+  Py_CLEAR(p->_deadline);
+  Py_CLEAR(p->_done_callbacks);
+  Py_CLEAR(p->_loop);
+  Py_CLEAR(p->_status);
+  Py_CLEAR(p->_initial_metadata);
+  Py_CLEAR(p->_waiters_status);
+  Py_CLEAR(p->_waiters_initial_metadata);
+  __pyx_tp_dealloc_7_cython_6cygrpc_GrpcCallWrapper(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__AioCall(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *p = (struct __pyx_obj_7_cython_6cygrpc__AioCall *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper)) ? ((__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc__AioCall)); if (e) return e;
+  if (p->_channel) {
+    e = (*v)(((PyObject *)p->_channel), a); if (e) return e;
+  }
+  if (p->_references) {
+    e = (*v)(p->_references, a); if (e) return e;
+  }
+  if (p->_deadline) {
+    e = (*v)(p->_deadline, a); if (e) return e;
+  }
+  if (p->_done_callbacks) {
+    e = (*v)(p->_done_callbacks, a); if (e) return e;
+  }
+  if (p->_loop) {
+    e = (*v)(p->_loop, a); if (e) return e;
+  }
+  if (p->_status) {
+    e = (*v)(((PyObject *)p->_status), a); if (e) return e;
+  }
+  if (p->_initial_metadata) {
+    e = (*v)(p->_initial_metadata, a); if (e) return e;
+  }
+  if (p->_waiters_status) {
+    e = (*v)(p->_waiters_status, a); if (e) return e;
+  }
+  if (p->_waiters_initial_metadata) {
+    e = (*v)(p->_waiters_initial_metadata, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__AioCall(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__AioCall *p = (struct __pyx_obj_7_cython_6cygrpc__AioCall *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper)) { if (__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_clear) __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc__AioCall);
+  tmp = ((PyObject*)p->_channel);
+  p->_channel = ((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_references);
+  p->_references = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_deadline);
+  p->_deadline = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_done_callbacks);
+  p->_done_callbacks = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_loop);
+  p->_loop = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_status);
+  p->_status = ((struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_initial_metadata);
+  p->_initial_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_waiters_status);
+  p->_waiters_status = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_waiters_initial_metadata);
+  p->_waiters_initial_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_8_AioCall__channel(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_8_AioCall_8_channel_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_8_AioCall__status(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_8_AioCall_7_status_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_8_AioCall__initial_metadata(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_8_AioCall_17_initial_metadata_1__get__(o);
+}
+
+static PyObject *__pyx_specialmethod___pyx_pw_7_cython_6cygrpc_8_AioCall_7__repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) {
+  return __pyx_pw_7_cython_6cygrpc_8_AioCall_7__repr__(self);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__AioCall[] = {
+  {"_repr", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_5_repr, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_4_repr},
+  {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_pw_7_cython_6cygrpc_8_AioCall_7__repr__, METH_NOARGS|METH_COEXIST, 0},
+  {"add_done_callback", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_11add_done_callback, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"time_remaining", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_13time_remaining, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"cancel", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_15cancel, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_14cancel},
+  {"done", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_17done, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_16done},
+  {"cancelled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_19cancelled, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_18cancelled},
+  {"status", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_21status, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_20status},
+  {"is_ok", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_24is_ok, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_23is_ok},
+  {"initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_26initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_25initial_metadata},
+  {"is_locally_cancelled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_29is_locally_cancelled, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_28is_locally_cancelled},
+  {"set_internal_error", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_31set_internal_error, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"unary_unary", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_33unary_unary, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_32unary_unary},
+  {"_handle_status_once_received", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_36_handle_status_once_received, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_35_handle_status_once_received},
+  {"receive_serialized_message", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_39receive_serialized_message, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_38receive_serialized_message},
+  {"send_serialized_message", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_42send_serialized_message, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_41send_serialized_message},
+  {"send_receive_close", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_45send_receive_close, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_44send_receive_close},
+  {"initiate_unary_stream", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_48initiate_unary_stream, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_47initiate_unary_stream},
+  {"stream_unary", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_51stream_unary, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_50stream_unary},
+  {"initiate_stream_stream", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_54initiate_stream_stream, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_8_AioCall_53initiate_stream_stream},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_57__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8_AioCall_59__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc__AioCall[] = {
+  {(char *)"_channel", __pyx_getprop_7_cython_6cygrpc_8_AioCall__channel, 0, (char *)0, 0},
+  {(char *)"_status", __pyx_getprop_7_cython_6cygrpc_8_AioCall__status, 0, (char *)0, 0},
+  {(char *)"_initial_metadata", __pyx_getprop_7_cython_6cygrpc_8_AioCall__initial_metadata, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__AioCall_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__AioCall},
+  {Py_tp_repr, (void *)__pyx_pw_7_cython_6cygrpc_8_AioCall_7__repr__},
+  {Py_tp_str, (void *)__pyx_pw_7_cython_6cygrpc_8_AioCall_9__str__},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__AioCall},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__AioCall},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__AioCall},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc__AioCall},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__AioCall},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__AioCall_spec = {
+  "_cython.cygrpc._AioCall",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__AioCall),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc__AioCall_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__AioCall = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_AioCall", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__AioCall), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__AioCall, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #endif
+  __pyx_pw_7_cython_6cygrpc_8_AioCall_7__repr__, /*tp_repr*/
+  0, /*tp_as_number*/
+  0, /*tp_as_sequence*/
+  0, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  __pyx_pw_7_cython_6cygrpc_8_AioCall_9__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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__AioCall, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__AioCall, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__AioCall, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc__AioCall, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__AioCall, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_AioChannel(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_AioChannel *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_AioChannel *)o);
+  p->loop = Py_None; Py_INCREF(Py_None);
+  p->_target = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_10AioChannel_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_AioChannel(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_AioChannel *p = (struct __pyx_obj_7_cython_6cygrpc_AioChannel *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_AioChannel) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_10AioChannel_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->loop);
+  Py_CLEAR(p->_target);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_AioChannel(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_AioChannel *p = (struct __pyx_obj_7_cython_6cygrpc_AioChannel *)o;
+  if (p->loop) {
+    e = (*v)(p->loop, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_AioChannel(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_AioChannel *p = (struct __pyx_obj_7_cython_6cygrpc_AioChannel *)o;
+  tmp = ((PyObject*)p->loop);
+  p->loop = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_specialmethod___pyx_pw_7_cython_6cygrpc_10AioChannel_5__repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) {
+  return __pyx_pw_7_cython_6cygrpc_10AioChannel_5__repr__(self);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_AioChannel[] = {
+  {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_pw_7_cython_6cygrpc_10AioChannel_5__repr__, METH_NOARGS|METH_COEXIST, 0},
+  {"check_connectivity_state", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_7check_connectivity_state, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_10AioChannel_6check_connectivity_state},
+  {"watch_connectivity_state", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_9watch_connectivity_state, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_10AioChannel_8watch_connectivity_state},
+  {"closing", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_12closing, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"close", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_14close, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"closed", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_16closed, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_18call, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_10AioChannel_17call},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_20__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_10AioChannel_22__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_AioChannel_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_AioChannel},
+  {Py_tp_repr, (void *)__pyx_pw_7_cython_6cygrpc_10AioChannel_5__repr__},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_AioChannel},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_AioChannel},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_AioChannel},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_AioChannel},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_AioChannel_spec = {
+  "_cython.cygrpc.AioChannel",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_AioChannel),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_AioChannel_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_AioChannel = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""AioChannel", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_AioChannel), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_AioChannel, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #endif
+  __pyx_pw_7_cython_6cygrpc_10AioChannel_5__repr__, /*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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_AioChannel, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_AioChannel, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_AioChannel, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_AioChannel, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__HandlerCallDetails(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)o);
+  p->method = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->invocation_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__HandlerCallDetails(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *p = (struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__HandlerCallDetails) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->method);
+  Py_CLEAR(p->invocation_metadata);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__HandlerCallDetails(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *p = (struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)o;
+  if (p->invocation_metadata) {
+    e = (*v)(p->invocation_metadata, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__HandlerCallDetails(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *p = (struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails *)o;
+  tmp = ((PyObject*)p->invocation_metadata);
+  p->invocation_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19_HandlerCallDetails_method(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_6method_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_7_cython_6cygrpc_19_HandlerCallDetails_invocation_metadata(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_19invocation_metadata_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__HandlerCallDetails[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_19_HandlerCallDetails_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_7_cython_6cygrpc__HandlerCallDetails[] = {
+  {(char *)"method", __pyx_getprop_7_cython_6cygrpc_19_HandlerCallDetails_method, 0, (char *)0, 0},
+  {(char *)"invocation_metadata", __pyx_getprop_7_cython_6cygrpc_19_HandlerCallDetails_invocation_metadata, 0, (char *)0, 0},
+  {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__HandlerCallDetails_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__HandlerCallDetails},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__HandlerCallDetails},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__HandlerCallDetails},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__HandlerCallDetails},
+  {Py_tp_getset, (void *)__pyx_getsets_7_cython_6cygrpc__HandlerCallDetails},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__HandlerCallDetails},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__HandlerCallDetails_spec = {
+  "_cython.cygrpc._HandlerCallDetails",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__HandlerCallDetails_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__HandlerCallDetails = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_HandlerCallDetails", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__HandlerCallDetails), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__HandlerCallDetails, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__HandlerCallDetails, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__HandlerCallDetails, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__HandlerCallDetails, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_7_cython_6cygrpc__HandlerCallDetails, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__HandlerCallDetails, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_RPCState __pyx_vtable_7_cython_6cygrpc_RPCState;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_RPCState(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_GrpcCallWrapper(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_RPCState;
+  new((void*)&(p->details)) grpc_call_details();
+  new((void*)&(p->request_metadata)) grpc_metadata_array();
+  p->server = ((struct __pyx_obj_7_cython_6cygrpc_AioServer *)Py_None); Py_INCREF(Py_None);
+  p->abort_exception = Py_None; Py_INCREF(Py_None);
+  p->py_status_code = Py_None; Py_INCREF(Py_None);
+  p->status_details = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->trailing_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->compression_algorithm = Py_None; Py_INCREF(Py_None);
+  p->callbacks = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_8RPCState_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_RPCState(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *p = (struct __pyx_obj_7_cython_6cygrpc_RPCState *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_RPCState) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_8RPCState_3__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  __Pyx_call_destructor(p->details);
+  __Pyx_call_destructor(p->request_metadata);
+  Py_CLEAR(p->server);
+  Py_CLEAR(p->abort_exception);
+  Py_CLEAR(p->py_status_code);
+  Py_CLEAR(p->status_details);
+  Py_CLEAR(p->trailing_metadata);
+  Py_CLEAR(p->compression_algorithm);
+  Py_CLEAR(p->callbacks);
+  __pyx_tp_dealloc_7_cython_6cygrpc_GrpcCallWrapper(o);
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_RPCState(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *p = (struct __pyx_obj_7_cython_6cygrpc_RPCState *)o;
+  e = ((likely(__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper)) ? ((__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_traverse) ? __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_7_cython_6cygrpc_RPCState)); if (e) return e;
+  if (p->server) {
+    e = (*v)(((PyObject *)p->server), a); if (e) return e;
+  }
+  if (p->abort_exception) {
+    e = (*v)(p->abort_exception, a); if (e) return e;
+  }
+  if (p->py_status_code) {
+    e = (*v)(p->py_status_code, a); if (e) return e;
+  }
+  if (p->trailing_metadata) {
+    e = (*v)(p->trailing_metadata, a); if (e) return e;
+  }
+  if (p->compression_algorithm) {
+    e = (*v)(p->compression_algorithm, a); if (e) return e;
+  }
+  if (p->callbacks) {
+    e = (*v)(p->callbacks, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_RPCState(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_RPCState *p = (struct __pyx_obj_7_cython_6cygrpc_RPCState *)o;
+  if (likely(__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper)) { if (__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_clear) __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_7_cython_6cygrpc_RPCState);
+  tmp = ((PyObject*)p->server);
+  p->server = ((struct __pyx_obj_7_cython_6cygrpc_AioServer *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->abort_exception);
+  p->abort_exception = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->py_status_code);
+  p->py_status_code = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->trailing_metadata);
+  p->trailing_metadata = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->compression_algorithm);
+  p->compression_algorithm = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->callbacks);
+  p->callbacks = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_RPCState[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8RPCState_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_8RPCState_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_RPCState_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_RPCState},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_RPCState},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_RPCState},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_RPCState},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_RPCState},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_RPCState_spec = {
+  "_cython.cygrpc.RPCState",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_RPCState),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc_RPCState_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_RPCState = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""RPCState", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_RPCState), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_RPCState, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_RPCState, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_RPCState, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_RPCState, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_RPCState, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ServicerContext(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)o);
+  p->_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)Py_None); Py_INCREF(Py_None);
+  p->_loop = Py_None; Py_INCREF(Py_None);
+  p->_request_deserializer = Py_None; Py_INCREF(Py_None);
+  p->_response_serializer = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_16_ServicerContext_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__ServicerContext(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *p = (struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__ServicerContext) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_rpc_state);
+  Py_CLEAR(p->_loop);
+  Py_CLEAR(p->_request_deserializer);
+  Py_CLEAR(p->_response_serializer);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__ServicerContext(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *p = (struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)o;
+  if (p->_rpc_state) {
+    e = (*v)(((PyObject *)p->_rpc_state), a); if (e) return e;
+  }
+  if (p->_loop) {
+    e = (*v)(p->_loop, a); if (e) return e;
+  }
+  if (p->_request_deserializer) {
+    e = (*v)(p->_request_deserializer, a); if (e) return e;
+  }
+  if (p->_response_serializer) {
+    e = (*v)(p->_response_serializer, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__ServicerContext(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__ServicerContext *p = (struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)o;
+  tmp = ((PyObject*)p->_rpc_state);
+  p->_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_loop);
+  p->_loop = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_request_deserializer);
+  p->_request_deserializer = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_response_serializer);
+  p->_response_serializer = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__ServicerContext[] = {
+  {"read", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_3read, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"write", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_6write, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"send_initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_9send_initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"abort", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_12abort, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"abort_with_status", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_15abort_with_status, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_18set_trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_20trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"invocation_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_22invocation_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_24set_code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_26code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_28set_details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_30details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_compression", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_32set_compression, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"disable_next_message_compression", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_34disable_next_message_compression, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"peer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_36peer, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"peer_identities", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_38peer_identities, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"peer_identity_key", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_40peer_identity_key, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"auth_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_42auth_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"time_remaining", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_44time_remaining, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"add_done_callback", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_46add_done_callback, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"done", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_48done, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"cancelled", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_50cancelled, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_52__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_ServicerContext_54__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__ServicerContext_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__ServicerContext},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__ServicerContext},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__ServicerContext},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__ServicerContext},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__ServicerContext},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__ServicerContext_spec = {
+  "_cython.cygrpc._ServicerContext",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ServicerContext),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__ServicerContext_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__ServicerContext = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_ServicerContext", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ServicerContext), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__ServicerContext, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__ServicerContext, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__ServicerContext, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__ServicerContext, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__ServicerContext, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__SyncServicerContext(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)o);
+  p->_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)Py_None); Py_INCREF(Py_None);
+  p->_callbacks = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_loop = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__SyncServicerContext(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *p = (struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__SyncServicerContext) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_context);
+  Py_CLEAR(p->_callbacks);
+  Py_CLEAR(p->_loop);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__SyncServicerContext(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *p = (struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)o;
+  if (p->_context) {
+    e = (*v)(((PyObject *)p->_context), a); if (e) return e;
+  }
+  if (p->_callbacks) {
+    e = (*v)(p->_callbacks, a); if (e) return e;
+  }
+  if (p->_loop) {
+    e = (*v)(p->_loop, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__SyncServicerContext(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *p = (struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext *)o;
+  tmp = ((PyObject*)p->_context);
+  p->_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_callbacks);
+  p->_callbacks = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_loop);
+  p->_loop = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__SyncServicerContext[] = {
+  {"abort", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_3abort, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"send_initial_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_5send_initial_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_trailing_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_7set_trailing_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"invocation_metadata", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_9invocation_metadata, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_code", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_11set_code, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_details", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_13set_details, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"set_compression", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_15set_compression, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"disable_next_message_compression", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_17disable_next_message_compression, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"add_callback", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_19add_callback, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"peer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_21peer, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"peer_identities", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_23peer_identities, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"peer_identity_key", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_25peer_identity_key, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"auth_context", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_27auth_context, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"time_remaining", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_29time_remaining, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_31__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_20_SyncServicerContext_33__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__SyncServicerContext_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__SyncServicerContext},
+  {Py_tp_doc, (void *)PyDoc_STR("Sync servicer context for sync handler compatibility.")},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__SyncServicerContext},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__SyncServicerContext},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__SyncServicerContext},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__SyncServicerContext},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__SyncServicerContext_spec = {
+  "_cython.cygrpc._SyncServicerContext",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__SyncServicerContext_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__SyncServicerContext = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_SyncServicerContext", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__SyncServicerContext), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__SyncServicerContext, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  PyDoc_STR("Sync servicer context for sync handler compatibility."), /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__SyncServicerContext, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__SyncServicerContext, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__SyncServicerContext, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__SyncServicerContext, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__MessageReceiver(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)o);
+  p->_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)Py_None); Py_INCREF(Py_None);
+  p->_agen = Py_None; Py_INCREF(Py_None);
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__MessageReceiver(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *p = (struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__MessageReceiver) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->_servicer_context);
+  Py_CLEAR(p->_agen);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc__MessageReceiver(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *p = (struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)o;
+  if (p->_servicer_context) {
+    e = (*v)(((PyObject *)p->_servicer_context), a); if (e) return e;
+  }
+  if (p->_agen) {
+    e = (*v)(p->_agen, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc__MessageReceiver(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *p = (struct __pyx_obj_7_cython_6cygrpc__MessageReceiver *)o;
+  tmp = ((PyObject*)p->_servicer_context);
+  p->_servicer_context = ((struct __pyx_obj_7_cython_6cygrpc__ServicerContext *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_agen);
+  p->_agen = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_specialmethod___pyx_pw_7_cython_6cygrpc_16_MessageReceiver_6__aiter__(PyObject *self, CYTHON_UNUSED PyObject *arg) {
+  return __pyx_pw_7_cython_6cygrpc_16_MessageReceiver_6__aiter__(self);
+}
+static PyObject *__pyx_specialmethod___pyx_pw_7_cython_6cygrpc_16_MessageReceiver_8__anext__(PyObject *self, CYTHON_UNUSED PyObject *arg) {
+  return __pyx_pw_7_cython_6cygrpc_16_MessageReceiver_8__anext__(self);
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__MessageReceiver[] = {
+  {"_async_message_receiver", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_3_async_message_receiver, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_16_MessageReceiver_2_async_message_receiver},
+  {"__aiter__", (PyCFunction)__pyx_specialmethod___pyx_pw_7_cython_6cygrpc_16_MessageReceiver_6__aiter__, METH_NOARGS|METH_COEXIST, 0},
+  {"__anext__", (PyCFunction)__pyx_specialmethod___pyx_pw_7_cython_6cygrpc_16_MessageReceiver_8__anext__, METH_NOARGS|METH_COEXIST, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_11__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_13__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__MessageReceiver_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__MessageReceiver},
+  {Py_am_aiter, (void *)__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_6__aiter__},
+  {Py_am_anext, (void *)__pyx_pw_7_cython_6cygrpc_16_MessageReceiver_8__anext__},
+  {Py_tp_doc, (void *)PyDoc_STR("Bridge between the async generator API and the reader-writer API.")},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc__MessageReceiver},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc__MessageReceiver},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__MessageReceiver},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__MessageReceiver},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__MessageReceiver_spec = {
+  "_cython.cygrpc._MessageReceiver",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc__MessageReceiver_slots,
+};
+#else
+
+#if PY_MAJOR_VERSION >= 3
+static __Pyx_PyAsyncMethodsStruct __pyx_tp_as_async__MessageReceiver = {
+  0, /*am_await*/
+  __pyx_pw_7_cython_6cygrpc_16_MessageReceiver_6__aiter__, /*am_aiter*/
+  __pyx_pw_7_cython_6cygrpc_16_MessageReceiver_8__anext__, /*am_anext*/
+  #if PY_VERSION_HEX >= 0x030A00A3
+  0, /*am_send*/
+  #endif
+};
+#endif
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__MessageReceiver = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_MessageReceiver", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__MessageReceiver), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__MessageReceiver, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  &__pyx_tp_as_async__MessageReceiver, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  PyDoc_STR("Bridge between the async generator API and the reader-writer API."), /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc__MessageReceiver, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc__MessageReceiver, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__MessageReceiver, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__MessageReceiver, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__ConcurrentRpcLimiter(PyTypeObject *t, PyObject *a, PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__ConcurrentRpcLimiter(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__ConcurrentRpcLimiter) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__ConcurrentRpcLimiter[] = {
+  {"check_before_request_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_3check_before_request_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"_decrease_active_rpcs_count", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_5_decrease_active_rpcs_count, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"decrease_once_finished", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_7decrease_once_finished, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_9__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_21_ConcurrentRpcLimiter_11__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__ConcurrentRpcLimiter},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__ConcurrentRpcLimiter},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__ConcurrentRpcLimiter},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter_spec = {
+  "_cython.cygrpc._ConcurrentRpcLimiter",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_ConcurrentRpcLimiter", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__ConcurrentRpcLimiter, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__ConcurrentRpcLimiter, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__ConcurrentRpcLimiter, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_AioServer __pyx_vtable_7_cython_6cygrpc_AioServer;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_AioServer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc_AioServer *)o);
+  p->__pyx_vtab = __pyx_vtabptr_7_cython_6cygrpc_AioServer;
+  p->_server = ((struct __pyx_obj_7_cython_6cygrpc_Server *)Py_None); Py_INCREF(Py_None);
+  p->_generic_handlers = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_loop = Py_None; Py_INCREF(Py_None);
+  p->_serving_task = Py_None; Py_INCREF(Py_None);
+  p->_shutdown_lock = Py_None; Py_INCREF(Py_None);
+  p->_shutdown_completed = Py_None; Py_INCREF(Py_None);
+  p->_shutdown_callback_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)Py_None); Py_INCREF(Py_None);
+  p->_crash_exception = Py_None; Py_INCREF(Py_None);
+  p->_interceptors = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  p->_thread_pool = Py_None; Py_INCREF(Py_None);
+  p->_limiter = ((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)Py_None); Py_INCREF(Py_None);
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_AioServer(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *p = (struct __pyx_obj_7_cython_6cygrpc_AioServer *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_AioServer) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
+    __pyx_pw_7_cython_6cygrpc_9AioServer_29__dealloc__(o);
+    __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->_server);
+  Py_CLEAR(p->_generic_handlers);
+  Py_CLEAR(p->_loop);
+  Py_CLEAR(p->_serving_task);
+  Py_CLEAR(p->_shutdown_lock);
+  Py_CLEAR(p->_shutdown_completed);
+  Py_CLEAR(p->_shutdown_callback_wrapper);
+  Py_CLEAR(p->_crash_exception);
+  Py_CLEAR(p->_interceptors);
+  Py_CLEAR(p->_thread_pool);
+  Py_CLEAR(p->_limiter);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc_AioServer(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *p = (struct __pyx_obj_7_cython_6cygrpc_AioServer *)o;
+  if (p->_server) {
+    e = (*v)(((PyObject *)p->_server), a); if (e) return e;
+  }
+  if (p->_generic_handlers) {
+    e = (*v)(p->_generic_handlers, a); if (e) return e;
+  }
+  if (p->_loop) {
+    e = (*v)(p->_loop, a); if (e) return e;
+  }
+  if (p->_serving_task) {
+    e = (*v)(p->_serving_task, a); if (e) return e;
+  }
+  if (p->_shutdown_lock) {
+    e = (*v)(p->_shutdown_lock, a); if (e) return e;
+  }
+  if (p->_shutdown_completed) {
+    e = (*v)(p->_shutdown_completed, a); if (e) return e;
+  }
+  if (p->_shutdown_callback_wrapper) {
+    e = (*v)(((PyObject *)p->_shutdown_callback_wrapper), a); if (e) return e;
+  }
+  if (p->_crash_exception) {
+    e = (*v)(p->_crash_exception, a); if (e) return e;
+  }
+  if (p->_interceptors) {
+    e = (*v)(p->_interceptors, a); if (e) return e;
+  }
+  if (p->_thread_pool) {
+    e = (*v)(p->_thread_pool, a); if (e) return e;
+  }
+  if (p->_limiter) {
+    e = (*v)(((PyObject *)p->_limiter), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc_AioServer(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc_AioServer *p = (struct __pyx_obj_7_cython_6cygrpc_AioServer *)o;
+  tmp = ((PyObject*)p->_server);
+  p->_server = ((struct __pyx_obj_7_cython_6cygrpc_Server *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_generic_handlers);
+  p->_generic_handlers = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_loop);
+  p->_loop = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_serving_task);
+  p->_serving_task = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_shutdown_lock);
+  p->_shutdown_lock = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_shutdown_completed);
+  p->_shutdown_completed = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_shutdown_callback_wrapper);
+  p->_shutdown_callback_wrapper = ((struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_crash_exception);
+  p->_crash_exception = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_interceptors);
+  p->_interceptors = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_thread_pool);
+  p->_thread_pool = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->_limiter);
+  p->_limiter = ((struct __pyx_obj_7_cython_6cygrpc__ConcurrentRpcLimiter *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_AioServer[] = {
+  {"add_generic_rpc_handlers", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_3add_generic_rpc_handlers, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"add_insecure_port", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_5add_insecure_port, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"add_secure_port", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_7add_secure_port, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"_request_call", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_9_request_call, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"_server_main_loop", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_12_server_main_loop, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"_serving_task_crash_handler", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_15_serving_task_crash_handler, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_9AioServer_14_serving_task_crash_handler},
+  {"start", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_17start, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"_start_shutting_down", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_20_start_shutting_down, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_9AioServer_19_start_shutting_down},
+  {"shutdown", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_23shutdown, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7_cython_6cygrpc_9AioServer_22shutdown},
+  {"wait_for_termination", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_26wait_for_termination, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"is_running", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_31is_running, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_33__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_9AioServer_35__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_AioServer_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_AioServer},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc_AioServer},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc_AioServer},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_AioServer},
+  {Py_tp_init, (void *)__pyx_pw_7_cython_6cygrpc_9AioServer_1__init__},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_AioServer},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_AioServer_spec = {
+  "_cython.cygrpc.AioServer",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_AioServer),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
+  __pyx_type_7_cython_6cygrpc_AioServer_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_AioServer = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""AioServer", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_AioServer), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_AioServer, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc_AioServer, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc_AioServer, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_AioServer, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  __pyx_pw_7_cython_6cygrpc_9AioServer_1__init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_AioServer, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc__GrpcArgWrapper(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *)o);
+  new((void*)&(p->arg)) grpc_arg();
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc__GrpcArgWrapper(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *p = (struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc__GrpcArgWrapper) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  __Pyx_call_destructor(p->arg);
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc__GrpcArgWrapper[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_GrpcArgWrapper_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_15_GrpcArgWrapper_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc__GrpcArgWrapper_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc__GrpcArgWrapper},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc__GrpcArgWrapper},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc__GrpcArgWrapper},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc__GrpcArgWrapper_spec = {
+  "_cython.cygrpc._GrpcArgWrapper",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc__GrpcArgWrapper_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc__GrpcArgWrapper = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""_GrpcArgWrapper", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc__GrpcArgWrapper), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc__GrpcArgWrapper, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc__GrpcArgWrapper, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc__GrpcArgWrapper, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_InsecureChannelCredentials __pyx_vtable_7_cython_6cygrpc_InsecureChannelCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_InsecureChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials*)__pyx_vtabptr_7_cython_6cygrpc_InsecureChannelCredentials;
+  return o;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_InsecureChannelCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_26InsecureChannelCredentials_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_26InsecureChannelCredentials_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_InsecureChannelCredentials_slots[] = {
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_InsecureChannelCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_InsecureChannelCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_InsecureChannelCredentials_spec = {
+  "_cython.cygrpc.InsecureChannelCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_InsecureChannelCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_InsecureChannelCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""InsecureChannelCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_InsecureChannelCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_InsecureChannelCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_InsecureChannelCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+static struct __pyx_vtabstruct_7_cython_6cygrpc_ComputeEngineChannelCredentials __pyx_vtable_7_cython_6cygrpc_ComputeEngineChannelCredentials;
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_ComputeEngineChannelCredentials(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *p;
+  PyObject *o = __pyx_tp_new_7_cython_6cygrpc_ChannelCredentials(t, a, k);
+  if (unlikely(!o)) return 0;
+  p = ((struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials *)o);
+  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7_cython_6cygrpc_ChannelCredentials*)__pyx_vtabptr_7_cython_6cygrpc_ComputeEngineChannelCredentials;
+  if (unlikely(__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_1__cinit__(o, a, k) < 0)) goto bad;
+  return o;
+  bad:
+  Py_DECREF(o); o = 0;
+  return NULL;
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_ComputeEngineChannelCredentials[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_31ComputeEngineChannelCredentials_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials_slots[] = {
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_ComputeEngineChannelCredentials},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_ComputeEngineChannelCredentials},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials_spec = {
+  "_cython.cygrpc.ComputeEngineChannelCredentials",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""ComputeEngineChannelCredentials", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_ComputeEngineChannelCredentials), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_ChannelCredentials, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_ComputeEngineChannelCredentials, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_ComputeEngineChannelCredentials, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc_CensusContext(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
+  if (unlikely(!o)) return 0;
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc_CensusContext(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc_CensusContext) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+  (*Py_TYPE(o)->tp_free)(o);
+  #else
+  {
+    freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+    if (tp_free) tp_free(o);
+  }
+  #endif
+}
+
+static PyMethodDef __pyx_methods_7_cython_6cygrpc_CensusContext[] = {
+  {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13CensusContext_1__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7_cython_6cygrpc_13CensusContext_3__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc_CensusContext_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc_CensusContext},
+  {Py_tp_methods, (void *)__pyx_methods_7_cython_6cygrpc_CensusContext},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc_CensusContext},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc_CensusContext_spec = {
+  "_cython.cygrpc.CensusContext",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CensusContext),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE,
+  __pyx_type_7_cython_6cygrpc_CensusContext_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc_CensusContext = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""CensusContext", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc_CensusContext), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc_CensusContext, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_7_cython_6cygrpc_CensusContext, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc_CensusContext, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_call_state);
+  Py_CLEAR(p->__pyx_v_state);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *)o;
+  if (p->__pyx_v_call_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_call_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_state), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call *)o;
+  tmp = ((PyObject*)p->__pyx_v_call_state);
+  p->__pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_state);
+  p->__pyx_v_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call_spec = {
+  "_cython.cygrpc.__pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_1_next_event[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_1_next_event = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_1_next_event(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_1_next_event > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_1_next_event[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_1_next_event];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_1_next_event(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_1_next_event) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_1_next_event < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_1_next_event[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_1_next_event++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_1_next_event(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_1_next_event(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event *)o;
+  tmp = ((PyObject*)p->__pyx_v_self);
+  p->__pyx_v_self = ((struct __pyx_obj_7_cython_6cygrpc_SegregatedCall *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_1_next_event},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_1_next_event},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_1_next_event},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_1_next_event},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_1_next_event",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_1_next_event", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_1_next_event), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_1_next_event, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_1_next_event, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_1_next_event, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_1_next_event, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_call_state);
+  Py_CLEAR(p->__pyx_v_state);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *)o;
+  if (p->__pyx_v_call_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_call_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_state), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call *)o;
+  tmp = ((PyObject*)p->__pyx_v_call_state);
+  p->__pyx_v_call_state = ((struct __pyx_obj_7_cython_6cygrpc__CallState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_state);
+  p->__pyx_v_state = ((struct __pyx_obj_7_cython_6cygrpc__ChannelState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event *)o;
+  tmp = ((PyObject*)p->__pyx_v_self);
+  p->__pyx_v_self = ((struct __pyx_obj_7_cython_6cygrpc_Channel *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_3_next_call_event",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_3_next_call_event", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata));
+    (void) PyObject_INIT(o, t);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata));
+    (void) PyObject_INIT(o, t);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_6_genexpr[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_6_genexpr = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_6_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_6_genexpr > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_6_genexpr[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_6_genexpr];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_6_genexpr(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_6_genexpr) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_6_genexpr < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_6_genexpr[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_6_genexpr++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_6_genexpr(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject *)p->__pyx_outer_scope), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_6_genexpr},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_6_genexpr},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_6_genexpr},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_6_genexpr",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_6_genexpr", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_6_genexpr), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_6_genexpr, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_6_genexpr, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_6_genexpr, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_ctx);
+  Py_CLEAR(p->__pyx_v_target);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *)o;
+  if (p->__pyx_v_ctx) {
+    e = (*v)(p->__pyx_v_ctx, a); if (e) return e;
+  }
+  if (p->__pyx_v_target) {
+    e = (*v)(p->__pyx_v_target, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context *)o;
+  tmp = ((PyObject*)p->__pyx_v_ctx);
+  p->__pyx_v_ctx = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_target);
+  p->__pyx_v_target = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_7__run_with_context",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_7__run_with_context", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_target);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *)o;
+  if (p->__pyx_v_target) {
+    e = (*v)(p->__pyx_v_target, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context *)o;
+  tmp = ((PyObject*)p->__pyx_v_target);
+  p->__pyx_v_target = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_8__run_with_context",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_8__run_with_context", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_9___init__[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_9___init__ = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_9___init__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_9___init__ > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_9___init__[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_9___init__];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_9___init__(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_9___init__) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_target);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_9___init__ < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_9___init__[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_9___init__++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_9___init__(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *)o;
+  if (p->__pyx_v_target) {
+    e = (*v)(p->__pyx_v_target, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_9___init__(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__ *)o;
+  tmp = ((PyObject*)p->__pyx_v_target);
+  p->__pyx_v_target = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init___slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_9___init__},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_9___init__},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_9___init__},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_9___init__},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init___spec = {
+  "_cython.cygrpc.__pyx_scope_struct_9___init__",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init___slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init__ = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_9___init__", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_9___init__), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_9___init__, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_9___init__, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_9___init__, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_9___init__, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_agen);
+  Py_CLEAR(p->__pyx_v_future);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_response);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator *)o;
+  if (p->__pyx_v_agen) {
+    e = (*v)(p->__pyx_v_agen, a); if (e) return e;
+  }
+  if (p->__pyx_v_future) {
+    e = (*v)(p->__pyx_v_future, a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_response) {
+    e = (*v)(p->__pyx_v_response, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_10_async_generator_to_generator",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_10_async_generator_to_generator", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_future);
+  Py_CLEAR(p->__pyx_v_gen);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_queue);
+  Py_CLEAR(p->__pyx_v_response);
+  Py_CLEAR(p->__pyx_v_thread_pool);
+  Py_CLEAR(p->__pyx_v_yield_to_queue);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator *)o;
+  if (p->__pyx_v_future) {
+    e = (*v)(p->__pyx_v_future, a); if (e) return e;
+  }
+  if (p->__pyx_v_gen) {
+    e = (*v)(p->__pyx_v_gen, a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_queue) {
+    e = (*v)(p->__pyx_v_queue, a); if (e) return e;
+  }
+  if (p->__pyx_v_response) {
+    e = (*v)(p->__pyx_v_response, a); if (e) return e;
+  }
+  if (p->__pyx_v_thread_pool) {
+    e = (*v)(p->__pyx_v_thread_pool, a); if (e) return e;
+  }
+  if (p->__pyx_v_yield_to_queue) {
+    e = (*v)(p->__pyx_v_yield_to_queue, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_11_generator_to_async_generator",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_11_generator_to_async_generator", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *)o);
+  new((void*)&(p->__pyx_v_c_event)) grpc_event();
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->__pyx_v_c_event);
+  Py_CLEAR(p->__pyx_v_batch_operation_tag);
+  Py_CLEAR(p->__pyx_v_future);
+  Py_CLEAR(p->__pyx_v_grpc_call_error_string);
+  Py_CLEAR(p->__pyx_v_grpc_call_wrapper);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_operations);
+  Py_CLEAR(p->__pyx_v_wrapper);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch *)o;
+  if (p->__pyx_v_batch_operation_tag) {
+    e = (*v)(((PyObject *)p->__pyx_v_batch_operation_tag), a); if (e) return e;
+  }
+  if (p->__pyx_v_future) {
+    e = (*v)(p->__pyx_v_future, a); if (e) return e;
+  }
+  if (p->__pyx_v_grpc_call_error_string) {
+    e = (*v)(p->__pyx_v_grpc_call_error_string, a); if (e) return e;
+  }
+  if (p->__pyx_v_grpc_call_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_grpc_call_wrapper), a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_operations) {
+    e = (*v)(p->__pyx_v_operations, a); if (e) return e;
+  }
+  if (p->__pyx_v_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_wrapper), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_12_execute_batch",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_12_execute_batch", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_13__receive_message[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_13__receive_message = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_13__receive_message(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_13__receive_message > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_13__receive_message[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_13__receive_message];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_13__receive_message(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_13__receive_message) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_e);
+  Py_CLEAR(p->__pyx_v_grpc_call_wrapper);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_ops);
+  Py_CLEAR(p->__pyx_v_receive_op);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_13__receive_message < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_13__receive_message[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_13__receive_message++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_13__receive_message(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message *)o;
+  if (p->__pyx_v_e) {
+    e = (*v)(p->__pyx_v_e, a); if (e) return e;
+  }
+  if (p->__pyx_v_grpc_call_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_grpc_call_wrapper), a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_receive_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_receive_op), a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_13__receive_message},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_13__receive_message},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_13__receive_message},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_13__receive_message",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_13__receive_message", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_13__receive_message), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_13__receive_message, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_13__receive_message, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_13__receive_message, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_14__send_message[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_14__send_message = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_14__send_message(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_14__send_message > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_14__send_message[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_14__send_message];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_14__send_message(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_14__send_message) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_grpc_call_wrapper);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_message);
+  Py_CLEAR(p->__pyx_v_op);
+  Py_CLEAR(p->__pyx_v_ops);
+  Py_CLEAR(p->__pyx_v_send_initial_metadata_op);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_14__send_message < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_14__send_message[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_14__send_message++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_14__send_message(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message *)o;
+  if (p->__pyx_v_grpc_call_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_grpc_call_wrapper), a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_send_initial_metadata_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_send_initial_metadata_op), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_14__send_message},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_14__send_message},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_14__send_message},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_14__send_message",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_14__send_message", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_14__send_message), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_14__send_message, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_14__send_message, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_14__send_message, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_grpc_call_wrapper);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_metadata);
+  Py_CLEAR(p->__pyx_v_op);
+  Py_CLEAR(p->__pyx_v_ops);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata *)o;
+  if (p->__pyx_v_grpc_call_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_grpc_call_wrapper), a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_metadata) {
+    e = (*v)(p->__pyx_v_metadata, a); if (e) return e;
+  }
+  if (p->__pyx_v_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_15__send_initial_metadata",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_15__send_initial_metadata", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_grpc_call_wrapper);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_op);
+  Py_CLEAR(p->__pyx_v_ops);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata *)o;
+  if (p->__pyx_v_grpc_call_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_grpc_call_wrapper), a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_16__receive_initial_metadata",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_16__receive_initial_metadata", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_details);
+  Py_CLEAR(p->__pyx_v_grpc_call_wrapper);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_op);
+  Py_CLEAR(p->__pyx_v_ops);
+  Py_CLEAR(p->__pyx_v_send_initial_metadata_op);
+  Py_CLEAR(p->__pyx_v_trailing_metadata);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server *)o;
+  if (p->__pyx_v_grpc_call_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_grpc_call_wrapper), a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_send_initial_metadata_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_send_initial_metadata_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_trailing_metadata) {
+    e = (*v)(p->__pyx_v_trailing_metadata, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_17__send_error_status_from_server",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_17__send_error_status_from_server", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_18_status[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_18_status = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_18_status(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_18_status > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_18_status[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_18_status];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_18_status(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_18_status) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_future);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_18_status < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_18_status[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_18_status++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_18_status(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status *)o;
+  if (p->__pyx_v_future) {
+    e = (*v)(p->__pyx_v_future, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_18_status},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_18_status},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_18_status},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_18_status",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_18_status", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_18_status), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_18_status, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_18_status, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_18_status, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_future);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata *)o;
+  if (p->__pyx_v_future) {
+    e = (*v)(p->__pyx_v_future, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_19_initial_metadata",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_19_initial_metadata", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_context);
+  Py_CLEAR(p->__pyx_v_initial_metadata_op);
+  Py_CLEAR(p->__pyx_v_ops);
+  Py_CLEAR(p->__pyx_v_outbound_initial_metadata);
+  Py_CLEAR(p->__pyx_v_receive_initial_metadata_op);
+  Py_CLEAR(p->__pyx_v_receive_message_op);
+  Py_CLEAR(p->__pyx_v_receive_status_on_client_op);
+  Py_CLEAR(p->__pyx_v_request);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_send_close_op);
+  Py_CLEAR(p->__pyx_v_send_message_op);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary *)o;
+  if (p->__pyx_v_context) {
+    e = (*v)(p->__pyx_v_context, a); if (e) return e;
+  }
+  if (p->__pyx_v_initial_metadata_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_initial_metadata_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_outbound_initial_metadata) {
+    e = (*v)(p->__pyx_v_outbound_initial_metadata, a); if (e) return e;
+  }
+  if (p->__pyx_v_receive_initial_metadata_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_receive_initial_metadata_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_receive_message_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_receive_message_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_receive_status_on_client_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_receive_status_on_client_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_send_close_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_send_close_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_send_message_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_send_message_op), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_20_unary_unary",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_20_unary_unary", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_op);
+  Py_CLEAR(p->__pyx_v_ops);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received *)o;
+  if (p->__pyx_v_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_21__handle_status_once_received",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_21__handle_status_once_received", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_received_message);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_22_receive_serialized_message",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_22_receive_serialized_message", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_message);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_23_send_serialized_message",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_23_send_serialized_message", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_op);
+  Py_CLEAR(p->__pyx_v_ops);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close *)o;
+  if (p->__pyx_v_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_24_send_receive_close",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_24_send_receive_close", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_batch_error);
+  Py_CLEAR(p->__pyx_v_context);
+  Py_CLEAR(p->__pyx_v_initial_metadata_op);
+  Py_CLEAR(p->__pyx_v_outbound_initial_metadata);
+  Py_CLEAR(p->__pyx_v_outbound_ops);
+  Py_CLEAR(p->__pyx_v_request);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_send_close_op);
+  Py_CLEAR(p->__pyx_v_send_message_op);
+  Py_CLEAR(p->__pyx_v_status_task);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  Py_CLEAR(p->__pyx_t_3);
+  Py_CLEAR(p->__pyx_t_4);
+  Py_CLEAR(p->__pyx_t_5);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream *)o;
+  if (p->__pyx_v_batch_error) {
+    e = (*v)(p->__pyx_v_batch_error, a); if (e) return e;
+  }
+  if (p->__pyx_v_context) {
+    e = (*v)(p->__pyx_v_context, a); if (e) return e;
+  }
+  if (p->__pyx_v_initial_metadata_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_initial_metadata_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_outbound_initial_metadata) {
+    e = (*v)(p->__pyx_v_outbound_initial_metadata, a); if (e) return e;
+  }
+  if (p->__pyx_v_outbound_ops) {
+    e = (*v)(p->__pyx_v_outbound_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_send_close_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_send_close_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_send_message_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_send_message_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_status_task) {
+    e = (*v)(p->__pyx_v_status_task, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  if (p->__pyx_t_3) {
+    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  }
+  if (p->__pyx_t_4) {
+    e = (*v)(p->__pyx_t_4, a); if (e) return e;
+  }
+  if (p->__pyx_t_5) {
+    e = (*v)(p->__pyx_t_5, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_25_initiate_unary_stream",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_25_initiate_unary_stream", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_context);
+  Py_CLEAR(p->__pyx_v_inbound_ops);
+  Py_CLEAR(p->__pyx_v_metadata_sent_observer);
+  Py_CLEAR(p->__pyx_v_outbound_initial_metadata);
+  Py_CLEAR(p->__pyx_v_receive_message_op);
+  Py_CLEAR(p->__pyx_v_receive_status_on_client_op);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  Py_CLEAR(p->__pyx_t_3);
+  Py_CLEAR(p->__pyx_t_4);
+  Py_CLEAR(p->__pyx_t_5);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary *)o;
+  if (p->__pyx_v_context) {
+    e = (*v)(p->__pyx_v_context, a); if (e) return e;
+  }
+  if (p->__pyx_v_inbound_ops) {
+    e = (*v)(p->__pyx_v_inbound_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_metadata_sent_observer) {
+    e = (*v)(p->__pyx_v_metadata_sent_observer, a); if (e) return e;
+  }
+  if (p->__pyx_v_outbound_initial_metadata) {
+    e = (*v)(p->__pyx_v_outbound_initial_metadata, a); if (e) return e;
+  }
+  if (p->__pyx_v_receive_message_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_receive_message_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_receive_status_on_client_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_receive_status_on_client_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  if (p->__pyx_t_3) {
+    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  }
+  if (p->__pyx_t_4) {
+    e = (*v)(p->__pyx_t_4, a); if (e) return e;
+  }
+  if (p->__pyx_t_5) {
+    e = (*v)(p->__pyx_t_5, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_26_stream_unary",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_26_stream_unary", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_batch_error);
+  Py_CLEAR(p->__pyx_v_context);
+  Py_CLEAR(p->__pyx_v_metadata_sent_observer);
+  Py_CLEAR(p->__pyx_v_outbound_initial_metadata);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_status_task);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  Py_CLEAR(p->__pyx_t_3);
+  Py_CLEAR(p->__pyx_t_4);
+  Py_CLEAR(p->__pyx_t_5);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream *)o;
+  if (p->__pyx_v_batch_error) {
+    e = (*v)(p->__pyx_v_batch_error, a); if (e) return e;
+  }
+  if (p->__pyx_v_context) {
+    e = (*v)(p->__pyx_v_context, a); if (e) return e;
+  }
+  if (p->__pyx_v_metadata_sent_observer) {
+    e = (*v)(p->__pyx_v_metadata_sent_observer, a); if (e) return e;
+  }
+  if (p->__pyx_v_outbound_initial_metadata) {
+    e = (*v)(p->__pyx_v_outbound_initial_metadata, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_status_task) {
+    e = (*v)(p->__pyx_v_status_task, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  if (p->__pyx_t_3) {
+    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  }
+  if (p->__pyx_t_4) {
+    e = (*v)(p->__pyx_t_4, a); if (e) return e;
+  }
+  if (p->__pyx_t_5) {
+    e = (*v)(p->__pyx_t_5, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_27_initiate_stream_stream",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_27_initiate_stream_stream", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *p;
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  p = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *)o);
+  new((void*)&(p->__pyx_v_c_deadline)) gpr_timespec();
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  __Pyx_call_destructor(p->__pyx_v_c_deadline);
+  Py_CLEAR(p->__pyx_v_deadline);
+  Py_CLEAR(p->__pyx_v_future);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_wrapper);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state *)o;
+  if (p->__pyx_v_deadline) {
+    e = (*v)(p->__pyx_v_deadline, a); if (e) return e;
+  }
+  if (p->__pyx_v_future) {
+    e = (*v)(p->__pyx_v_future, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_wrapper), a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_28_watch_connectivity_state",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_28_watch_connectivity_state", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_29_read[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_29_read = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_29_read(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_29_read > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_29_read[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_29_read];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_29_read(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_29_read) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_raw_message);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_29_read < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_29_read[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_29_read++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_29_read(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_29_read},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_29_read},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_29_read},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_29_read",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_29_read", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_29_read), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_29_read, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_29_read, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_29_read, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_30_write[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_30_write = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_30_write(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_30_write > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_30_write[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_30_write];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_30_write(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_30_write) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_message);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_30_write < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_30_write[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_30_write++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_30_write(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write *)o;
+  if (p->__pyx_v_message) {
+    e = (*v)(p->__pyx_v_message, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_30_write},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_30_write},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_30_write},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_30_write",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_30_write", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_30_write), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_30_write, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_30_write, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_30_write, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_metadata);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata *)o;
+  if (p->__pyx_v_metadata) {
+    e = (*v)(p->__pyx_v_metadata, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_31_send_initial_metadata",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_31_send_initial_metadata", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_32_abort[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_32_abort = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_32_abort(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_32_abort > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_32_abort[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_32_abort];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_32_abort(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_32_abort) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_code);
+  Py_CLEAR(p->__pyx_v_details);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_trailing_metadata);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_32_abort < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_32_abort[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_32_abort++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_32_abort(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort *)o;
+  if (p->__pyx_v_code) {
+    e = (*v)(p->__pyx_v_code, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_trailing_metadata) {
+    e = (*v)(p->__pyx_v_trailing_metadata, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_32_abort},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_32_abort},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_32_abort},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_32_abort",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_32_abort", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_32_abort), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_32_abort, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_32_abort, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_32_abort, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_status);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_status) {
+    e = (*v)(p->__pyx_v_status, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_33_abort_with_status",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_33_abort_with_status", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_continuation);
+  Py_CLEAR(p->__pyx_v_handler_call_details);
+  Py_CLEAR(p->__pyx_v_interceptor);
+  Py_CLEAR(p->__pyx_v_interceptors);
+  Py_CLEAR(p->__pyx_v_query_handler);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor *)o;
+  if (p->__pyx_v_continuation) {
+    e = (*v)(p->__pyx_v_continuation, a); if (e) return e;
+  }
+  if (p->__pyx_v_handler_call_details) {
+    e = (*v)(p->__pyx_v_handler_call_details, a); if (e) return e;
+  }
+  if (p->__pyx_v_interceptor) {
+    e = (*v)(p->__pyx_v_interceptor, a); if (e) return e;
+  }
+  if (p->__pyx_v_interceptors) {
+    e = (*v)(p->__pyx_v_interceptors, a); if (e) return e;
+  }
+  if (p->__pyx_v_query_handler) {
+    e = (*v)(p->__pyx_v_query_handler, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_34__run_interceptor",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_34__run_interceptor", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_generic_handlers);
+  Py_CLEAR(p->__pyx_v_handler_call_details);
+  Py_CLEAR(p->__pyx_v_interceptors);
+  Py_CLEAR(p->__pyx_v_metadata);
+  Py_CLEAR(p->__pyx_v_method);
+  Py_CLEAR(p->__pyx_v_query_handlers);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler *)o;
+  if (p->__pyx_v_generic_handlers) {
+    e = (*v)(p->__pyx_v_generic_handlers, a); if (e) return e;
+  }
+  if (p->__pyx_v_handler_call_details) {
+    e = (*v)(((PyObject *)p->__pyx_v_handler_call_details), a); if (e) return e;
+  }
+  if (p->__pyx_v_interceptors) {
+    e = (*v)(p->__pyx_v_interceptors, a); if (e) return e;
+  }
+  if (p->__pyx_v_metadata) {
+    e = (*v)(p->__pyx_v_metadata, a); if (e) return e;
+  }
+  if (p->__pyx_v_query_handlers) {
+    e = (*v)(p->__pyx_v_query_handlers, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_35__find_method_handler",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_35__find_method_handler", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_callback);
+  Py_CLEAR(p->__pyx_v_finish_ops);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_request);
+  Py_CLEAR(p->__pyx_v_response_message);
+  Py_CLEAR(p->__pyx_v_response_raw);
+  Py_CLEAR(p->__pyx_v_response_serializer);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_servicer_context);
+  Py_CLEAR(p->__pyx_v_sync_servicer_context);
+  Py_CLEAR(p->__pyx_v_unary_handler);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response *)o;
+  if (p->__pyx_v_callback) {
+    e = (*v)(p->__pyx_v_callback, a); if (e) return e;
+  }
+  if (p->__pyx_v_finish_ops) {
+    e = (*v)(p->__pyx_v_finish_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_request) {
+    e = (*v)(p->__pyx_v_request, a); if (e) return e;
+  }
+  if (p->__pyx_v_response_message) {
+    e = (*v)(p->__pyx_v_response_message, a); if (e) return e;
+  }
+  if (p->__pyx_v_response_serializer) {
+    e = (*v)(p->__pyx_v_response_serializer, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_servicer_context) {
+    e = (*v)(((PyObject *)p->__pyx_v_servicer_context), a); if (e) return e;
+  }
+  if (p->__pyx_v_sync_servicer_context) {
+    e = (*v)(((PyObject *)p->__pyx_v_sync_servicer_context), a); if (e) return e;
+  }
+  if (p->__pyx_v_unary_handler) {
+    e = (*v)(p->__pyx_v_unary_handler, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_36__finish_handler_with_unary_response",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_36__finish_handler_with_unary_response", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_async_response_generator);
+  Py_CLEAR(p->__pyx_v_finish_ops);
+  Py_CLEAR(p->__pyx_v_gen);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_op);
+  Py_CLEAR(p->__pyx_v_request);
+  Py_CLEAR(p->__pyx_v_response_message);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_servicer_context);
+  Py_CLEAR(p->__pyx_v_stream_handler);
+  Py_CLEAR(p->__pyx_v_sync_servicer_context);
+  Py_CLEAR(p->__pyx_t_0);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses *)o;
+  if (p->__pyx_v_async_response_generator) {
+    e = (*v)(p->__pyx_v_async_response_generator, a); if (e) return e;
+  }
+  if (p->__pyx_v_finish_ops) {
+    e = (*v)(p->__pyx_v_finish_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_gen) {
+    e = (*v)(p->__pyx_v_gen, a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_request) {
+    e = (*v)(p->__pyx_v_request, a); if (e) return e;
+  }
+  if (p->__pyx_v_response_message) {
+    e = (*v)(p->__pyx_v_response_message, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_servicer_context) {
+    e = (*v)(((PyObject *)p->__pyx_v_servicer_context), a); if (e) return e;
+  }
+  if (p->__pyx_v_stream_handler) {
+    e = (*v)(p->__pyx_v_stream_handler, a); if (e) return e;
+  }
+  if (p->__pyx_v_sync_servicer_context) {
+    e = (*v)(((PyObject *)p->__pyx_v_sync_servicer_context), a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_37__finish_handler_with_stream_responses",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_37__finish_handler_with_stream_responses", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_method_handler);
+  Py_CLEAR(p->__pyx_v_request_message);
+  Py_CLEAR(p->__pyx_v_request_raw);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_servicer_context);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc *)o;
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_method_handler) {
+    e = (*v)(p->__pyx_v_method_handler, a); if (e) return e;
+  }
+  if (p->__pyx_v_request_message) {
+    e = (*v)(p->__pyx_v_request_message, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_servicer_context) {
+    e = (*v)(((PyObject *)p->__pyx_v_servicer_context), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_38__handle_unary_unary_rpc",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_38__handle_unary_unary_rpc", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_method_handler);
+  Py_CLEAR(p->__pyx_v_request_message);
+  Py_CLEAR(p->__pyx_v_request_raw);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_servicer_context);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc *)o;
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_method_handler) {
+    e = (*v)(p->__pyx_v_method_handler, a); if (e) return e;
+  }
+  if (p->__pyx_v_request_message) {
+    e = (*v)(p->__pyx_v_request_message, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_servicer_context) {
+    e = (*v)(((PyObject *)p->__pyx_v_servicer_context), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_39__handle_unary_stream_rpc",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_39__handle_unary_stream_rpc", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_message);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver *)o;
+  if (p->__pyx_v_message) {
+    e = (*v)(p->__pyx_v_message, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_40__async_message_receiver",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_40__async_message_receiver", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_41___anext__[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_41___anext__ = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_41___anext__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_41___anext__ > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_41___anext__[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_41___anext__];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_41___anext__(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_41___anext__) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_self);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_41___anext__ < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_41___anext__[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_41___anext__++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_41___anext__(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__ *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext___slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_41___anext__},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_41___anext__},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_41___anext__},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext___spec = {
+  "_cython.cygrpc.__pyx_scope_struct_41___anext__",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext___slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext__ = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_41___anext__", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_41___anext__), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_41___anext__, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_41___anext__, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_41___anext__, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_method_handler);
+  Py_CLEAR(p->__pyx_v_request_iterator);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_servicer_context);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc *)o;
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_method_handler) {
+    e = (*v)(p->__pyx_v_method_handler, a); if (e) return e;
+  }
+  if (p->__pyx_v_request_iterator) {
+    e = (*v)(p->__pyx_v_request_iterator, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_servicer_context) {
+    e = (*v)(((PyObject *)p->__pyx_v_servicer_context), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_42__handle_stream_unary_rpc",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_42__handle_stream_unary_rpc", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_method_handler);
+  Py_CLEAR(p->__pyx_v_request_iterator);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_servicer_context);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc *)o;
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_method_handler) {
+    e = (*v)(p->__pyx_v_method_handler, a); if (e) return e;
+  }
+  if (p->__pyx_v_request_iterator) {
+    e = (*v)(p->__pyx_v_request_iterator, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_servicer_context) {
+    e = (*v)(((PyObject *)p->__pyx_v_servicer_context), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_43__handle_stream_stream_rpc",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_43__handle_stream_stream_rpc", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_e);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_rpc_coro);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_status_code);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  Py_CLEAR(p->__pyx_t_3);
+  Py_CLEAR(p->__pyx_t_4);
+  Py_CLEAR(p->__pyx_t_5);
+  Py_CLEAR(p->__pyx_t_6);
+  Py_CLEAR(p->__pyx_t_7);
+  Py_CLEAR(p->__pyx_t_8);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions *)o;
+  if (p->__pyx_v_e) {
+    e = (*v)(p->__pyx_v_e, a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_coro) {
+    e = (*v)(p->__pyx_v_rpc_coro, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_status_code) {
+    e = (*v)(p->__pyx_v_status_code, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  if (p->__pyx_t_3) {
+    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  }
+  if (p->__pyx_t_4) {
+    e = (*v)(p->__pyx_t_4, a); if (e) return e;
+  }
+  if (p->__pyx_t_5) {
+    e = (*v)(p->__pyx_t_5, a); if (e) return e;
+  }
+  if (p->__pyx_t_6) {
+    e = (*v)(p->__pyx_t_6, a); if (e) return e;
+  }
+  if (p->__pyx_t_7) {
+    e = (*v)(p->__pyx_t_7, a); if (e) return e;
+  }
+  if (p->__pyx_t_8) {
+    e = (*v)(p->__pyx_t_8, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_44__handle_exceptions",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_44__handle_exceptions", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *)o;
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler(PyObject *o) {
+  PyObject* tmp;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler *)o;
+  tmp = ((PyObject*)p->__pyx_v_rpc_state);
+  p->__pyx_v_rpc_state = ((struct __pyx_obj_7_cython_6cygrpc_RPCState *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler},
+  {Py_tp_clear, (void *)__pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler, /*tp_traverse*/
+  __pyx_tp_clear_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_op);
+  Py_CLEAR(p->__pyx_v_ops);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_rpc_task);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core *)o;
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_op) {
+    e = (*v)(((PyObject *)p->__pyx_v_op), a); if (e) return e;
+  }
+  if (p->__pyx_v_ops) {
+    e = (*v)(p->__pyx_v_ops, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_task) {
+    e = (*v)(p->__pyx_v_rpc_task, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_46__handle_cancellation_from_core",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_46__handle_cancellation_from_core", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_rpc_coro);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_rpc_task);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro *)o;
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_coro) {
+    e = (*v)(p->__pyx_v_rpc_coro, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_task) {
+    e = (*v)(p->__pyx_v_rpc_task, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_47__schedule_rpc_coro",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_47__schedule_rpc_coro", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_generic_handlers);
+  Py_CLEAR(p->__pyx_v_interceptors);
+  Py_CLEAR(p->__pyx_v_loop);
+  Py_CLEAR(p->__pyx_v_method_handler);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc *)o;
+  if (p->__pyx_v_generic_handlers) {
+    e = (*v)(p->__pyx_v_generic_handlers, a); if (e) return e;
+  }
+  if (p->__pyx_v_interceptors) {
+    e = (*v)(p->__pyx_v_interceptors, a); if (e) return e;
+  }
+  if (p->__pyx_v_loop) {
+    e = (*v)(p->__pyx_v_loop, a); if (e) return e;
+  }
+  if (p->__pyx_v_method_handler) {
+    e = (*v)(p->__pyx_v_method_handler, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_48__handle_rpc",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_48__handle_rpc", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_49__request_call[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_49__request_call = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_49__request_call(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_49__request_call > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_49__request_call[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_49__request_call];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_49__request_call(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_49__request_call) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_future);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_wrapper);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_49__request_call < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_49__request_call[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_49__request_call++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_49__request_call(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call *)o;
+  if (p->__pyx_v_future) {
+    e = (*v)(p->__pyx_v_future, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_wrapper) {
+    e = (*v)(((PyObject *)p->__pyx_v_wrapper), a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_49__request_call},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_49__request_call},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_49__request_call},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_49__request_call",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_49__request_call", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_49__request_call), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_49__request_call, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_49__request_call, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_49__request_call, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_rpc_coro);
+  Py_CLEAR(p->__pyx_v_rpc_state);
+  Py_CLEAR(p->__pyx_v_rpc_task);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_server_started);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop *)o;
+  if (p->__pyx_v_rpc_coro) {
+    e = (*v)(p->__pyx_v_rpc_coro, a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_state) {
+    e = (*v)(((PyObject *)p->__pyx_v_rpc_state), a); if (e) return e;
+  }
+  if (p->__pyx_v_rpc_task) {
+    e = (*v)(p->__pyx_v_rpc_task, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_server_started) {
+    e = (*v)(p->__pyx_v_server_started, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_50__server_main_loop",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_50__server_main_loop", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_51_start[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_51_start = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_51_start(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_51_start > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_51_start[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_51_start];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_51_start(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_51_start) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_server_started);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_51_start < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_51_start[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_51_start++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_51_start(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_server_started) {
+    e = (*v)(p->__pyx_v_server_started, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_51_start},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_51_start},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_51_start},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_51_start",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_51_start", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_51_start), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_51_start, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_51_start, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_51_start, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_52__start_shutting_down",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_52__start_shutting_down", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_53_shutdown[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_53_shutdown = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_53_shutdown(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_53_shutdown > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_53_shutdown[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_53_shutdown];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_53_shutdown(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_53_shutdown) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_grace);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  Py_CLEAR(p->__pyx_t_3);
+  Py_CLEAR(p->__pyx_t_4);
+  Py_CLEAR(p->__pyx_t_5);
+  Py_CLEAR(p->__pyx_t_6);
+  Py_CLEAR(p->__pyx_t_7);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_53_shutdown < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_53_shutdown[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_53_shutdown++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_53_shutdown(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown *)o;
+  if (p->__pyx_v_grace) {
+    e = (*v)(p->__pyx_v_grace, a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  if (p->__pyx_t_3) {
+    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  }
+  if (p->__pyx_t_4) {
+    e = (*v)(p->__pyx_t_4, a); if (e) return e;
+  }
+  if (p->__pyx_t_5) {
+    e = (*v)(p->__pyx_t_5, a); if (e) return e;
+  }
+  if (p->__pyx_t_6) {
+    e = (*v)(p->__pyx_t_6, a); if (e) return e;
+  }
+  if (p->__pyx_t_7) {
+    e = (*v)(p->__pyx_t_7, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_53_shutdown},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_53_shutdown},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_53_shutdown},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_53_shutdown",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_53_shutdown", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_53_shutdown), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_53_shutdown, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_53_shutdown, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_53_shutdown, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination[8];
+static int __pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination = 0;
+#endif
+
+static PyObject *__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination)))) {
+    o = (PyObject*)__pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination[--__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination];
+    memset(o, 0, sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination));
+    (void) PyObject_INIT(o, t);
+    PyObject_GC_Track(o);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination(PyObject *o) {
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *)o;
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  PyObject_GC_UnTrack(o);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_timeout);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_2);
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination)))) {
+    __pyx_freelist_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination[__pyx_freecount_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination++] = ((struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+
+static int __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *p = (struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject *)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_timeout) {
+    e = (*v)(p->__pyx_v_timeout, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  }
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination},
+  {Py_tp_traverse, (void *)__pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination},
+  {Py_tp_new, (void *)__pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination},
+  {0, 0},
+};
+static PyType_Spec __pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination_spec = {
+  "_cython.cygrpc.__pyx_scope_struct_54_wait_for_termination",
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination_slots,
+};
+#else
+
+static PyTypeObject __pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct_54_wait_for_termination", /*tp_name*/
+  sizeof(struct __pyx_obj_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg *__pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg[8];
+static int __pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg = 0;
+#endif
+
+static PyObject *__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg)))) {
+    o = (PyObject*)__pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg[--__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg];
+    memset(o, 0, sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg));
+    (void) PyObject_INIT(o, t);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg)))) {
+    __pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg[__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg++] = ((struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg},
+  {Py_tp_new, (void *)__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg},
+  {0, 0},
+};
+static PyType_Spec __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_spec = {
+  "_cython.cygrpc.__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg",
+  sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_slots,
+};
+#else
+
+static PyTypeObject __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg", /*tp_name*/
+  sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ *__pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_[8];
+static int __pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ = 0;
+#endif
+
+static PyObject *__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_)))) {
+    o = (PyObject*)__pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_[--__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_];
+    memset(o, 0, sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_));
+    (void) PyObject_INIT(o, t);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_)))) {
+    __pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_[__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_++] = ((struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_},
+  {Py_tp_new, (void *)__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_},
+  {0, 0},
+};
+static PyType_Spec __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__spec = {
+  "_cython.cygrpc.__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_",
+  sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__slots,
+};
+#else
+
+static PyTypeObject __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_", /*tp_name*/
+  sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args *__pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args[8];
+static int __pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args = 0;
+#endif
+
+static PyObject *__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args)))) {
+    o = (PyObject*)__pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args[--__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args];
+    memset(o, 0, sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args));
+    (void) PyObject_INIT(o, t);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args)))) {
+    __pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args[__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args++] = ((struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args},
+  {Py_tp_new, (void *)__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args},
+  {0, 0},
+};
+static PyType_Spec __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_spec = {
+  "_cython.cygrpc.__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args",
+  sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_slots,
+};
+#else
+
+static PyTypeObject __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args", /*tp_name*/
+  sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+#if CYTHON_USE_FREELISTS
+static struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ *__pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_[8];
+static int __pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ = 0;
+#endif
+
+static PyObject *__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  PyObject *o;
+  #if CYTHON_COMPILING_IN_LIMITED_API
+  allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);
+  o = alloc_func(t, 0);
+  #else
+  #if CYTHON_USE_FREELISTS
+  if (likely((int)(__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_)))) {
+    o = (PyObject*)__pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_[--__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_];
+    memset(o, 0, sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_));
+    (void) PyObject_INIT(o, t);
+  } else
+  #endif
+  {
+    o = (*t->tp_alloc)(t, 0);
+    if (unlikely(!o)) return 0;
+  }
+  #endif
+  return o;
+}
+
+static void __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_(PyObject *o) {
+  #if CYTHON_USE_TP_FINALIZE
+  if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) {
+    if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_) {
+      if (PyObject_CallFinalizerFromDealloc(o)) return;
+    }
+  }
+  #endif
+  #if CYTHON_USE_FREELISTS
+  if (((int)(__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_)))) {
+    __pyx_freelist___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_[__pyx_freecount___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_++] = ((struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ *)o);
+  } else
+  #endif
+  {
+    #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+    (*Py_TYPE(o)->tp_free)(o);
+    #else
+    {
+      freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);
+      if (tp_free) tp_free(o);
+    }
+    #endif
+  }
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__slots[] = {
+  {Py_tp_dealloc, (void *)__pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_},
+  {Py_tp_new, (void *)__pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_},
+  {0, 0},
+};
+static PyType_Spec __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__spec = {
+  "_cython.cygrpc.__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_",
+  sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_),
+  0,
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_FINALIZE,
+  __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__slots,
+};
+#else
+
+static PyTypeObject __pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ = {
+  PyVarObject_HEAD_INIT(0, 0)
+  "_cython.cygrpc.""__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_", /*tp_name*/
+  sizeof(struct __pyx_obj___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_, /*tp_dealloc*/
+  #if PY_VERSION_HEX < 0x030800b4
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b4
+  0, /*tp_vectorcall_offset*/
+  #endif
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
+  #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_FINALIZE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*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*/
+  #if !CYTHON_USE_TYPE_SPECS
+  0, /*tp_dictoffset*/
+  #endif
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_, /*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
+  #if CYTHON_USE_TP_FINALIZE
+  0, /*tp_finalize*/
+  #else
+  NULL, /*tp_finalize*/
+  #endif
+  #endif
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+  0, /*tp_vectorcall*/
+  #endif
+  #if __PYX_NEED_TP_PRINT_SLOT == 1
+  0, /*tp_print*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030C0000
+  0, /*tp_watched*/
+  #endif
+  #if PY_VERSION_HEX >= 0x030d00A4
+  0, /*tp_versions_used*/
+  #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+  0, /*tp_pypy_flags*/
+  #endif
+};
+#endif
+
+static PyMethodDef __pyx_methods[] = {
+  {0, 0, 0, 0}
+};
+#ifndef CYTHON_SMALL_CODE
+#if defined(__clang__)
+    #define CYTHON_SMALL_CODE
+#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+    #define CYTHON_SMALL_CODE __attribute__((cold))
+#else
+    #define CYTHON_SMALL_CODE
+#endif
+#endif
+/* #### Code section: pystring_table ### */
+
+static int __Pyx_CreateStringTabAndInitStrings(void) {
+  __Pyx_StringTabEntry __pyx_string_tab[] = {
+    {&__pyx_kp_s_0, __pyx_k_0, sizeof(__pyx_k_0), 0, 0, 1, 0},
+    {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},
+    {&__pyx_n_s_ALTSChannelCredentials, __pyx_k_ALTSChannelCredentials, sizeof(__pyx_k_ALTSChannelCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_ALTSChannelCredentials___reduce, __pyx_k_ALTSChannelCredentials___reduce, sizeof(__pyx_k_ALTSChannelCredentials___reduce), 0, 0, 1, 1},
+    {&__pyx_n_s_ALTSChannelCredentials___setstat, __pyx_k_ALTSChannelCredentials___setstat, sizeof(__pyx_k_ALTSChannelCredentials___setstat), 0, 0, 1, 1},
+    {&__pyx_n_s_AWAIT_THREADS_TIMEOUT_SECONDS, __pyx_k_AWAIT_THREADS_TIMEOUT_SECONDS, sizeof(__pyx_k_AWAIT_THREADS_TIMEOUT_SECONDS), 0, 0, 1, 1},
+    {&__pyx_n_s_AbortError, __pyx_k_AbortError, sizeof(__pyx_k_AbortError), 0, 0, 1, 1},
+    {&__pyx_kp_s_Abort_already_called, __pyx_k_Abort_already_called, sizeof(__pyx_k_Abort_already_called), 0, 0, 1, 0},
+    {&__pyx_kp_s_Abort_error_has_been_replaced, __pyx_k_Abort_error_has_been_replaced, sizeof(__pyx_k_Abort_error_has_been_replaced), 0, 0, 1, 0},
+    {&__pyx_kp_s_Abort_error_unexpectedly_suppres, __pyx_k_Abort_error_unexpectedly_suppres, sizeof(__pyx_k_Abort_error_unexpectedly_suppres), 0, 0, 1, 0},
+    {&__pyx_kp_s_Aborting_method_s_due_to_server, __pyx_k_Aborting_method_s_due_to_server, sizeof(__pyx_k_Aborting_method_s_due_to_server), 0, 0, 1, 0},
+    {&__pyx_n_s_ActiveThreadCount, __pyx_k_ActiveThreadCount, sizeof(__pyx_k_ActiveThreadCount), 0, 0, 1, 1},
+    {&__pyx_n_s_ActiveThreadCount___init, __pyx_k_ActiveThreadCount___init, sizeof(__pyx_k_ActiveThreadCount___init), 0, 0, 1, 1},
+    {&__pyx_n_s_ActiveThreadCount_await_zero_th, __pyx_k_ActiveThreadCount_await_zero_th, sizeof(__pyx_k_ActiveThreadCount_await_zero_th), 0, 0, 1, 1},
+    {&__pyx_n_s_ActiveThreadCount_decrement, __pyx_k_ActiveThreadCount_decrement, sizeof(__pyx_k_ActiveThreadCount_decrement), 0, 0, 1, 1},
+    {&__pyx_n_s_ActiveThreadCount_increment, __pyx_k_ActiveThreadCount_increment, sizeof(__pyx_k_ActiveThreadCount_increment), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall, __pyx_k_AioCall, sizeof(__pyx_k_AioCall), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall___reduce_cython, __pyx_k_AioCall___reduce_cython, sizeof(__pyx_k_AioCall___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall___setstate_cython, __pyx_k_AioCall___setstate_cython, sizeof(__pyx_k_AioCall___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall__handle_status_once_rec, __pyx_k_AioCall__handle_status_once_rec, sizeof(__pyx_k_AioCall__handle_status_once_rec), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall__repr, __pyx_k_AioCall__repr, sizeof(__pyx_k_AioCall__repr), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_add_done_callback, __pyx_k_AioCall_add_done_callback, sizeof(__pyx_k_AioCall_add_done_callback), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_cancel, __pyx_k_AioCall_cancel, sizeof(__pyx_k_AioCall_cancel), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_cancelled, __pyx_k_AioCall_cancelled, sizeof(__pyx_k_AioCall_cancelled), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_done, __pyx_k_AioCall_done, sizeof(__pyx_k_AioCall_done), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_initial_metadata, __pyx_k_AioCall_initial_metadata, sizeof(__pyx_k_AioCall_initial_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_initiate_stream_stream, __pyx_k_AioCall_initiate_stream_stream, sizeof(__pyx_k_AioCall_initiate_stream_stream), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_initiate_unary_stream, __pyx_k_AioCall_initiate_unary_stream, sizeof(__pyx_k_AioCall_initiate_unary_stream), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_is_locally_cancelled, __pyx_k_AioCall_is_locally_cancelled, sizeof(__pyx_k_AioCall_is_locally_cancelled), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_is_ok, __pyx_k_AioCall_is_ok, sizeof(__pyx_k_AioCall_is_ok), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_receive_serialized_mess, __pyx_k_AioCall_receive_serialized_mess, sizeof(__pyx_k_AioCall_receive_serialized_mess), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_send_receive_close, __pyx_k_AioCall_send_receive_close, sizeof(__pyx_k_AioCall_send_receive_close), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_send_serialized_message, __pyx_k_AioCall_send_serialized_message, sizeof(__pyx_k_AioCall_send_serialized_message), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_set_internal_error, __pyx_k_AioCall_set_internal_error, sizeof(__pyx_k_AioCall_set_internal_error), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_status, __pyx_k_AioCall_status, sizeof(__pyx_k_AioCall_status), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_stream_unary, __pyx_k_AioCall_stream_unary, sizeof(__pyx_k_AioCall_stream_unary), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_time_remaining, __pyx_k_AioCall_time_remaining, sizeof(__pyx_k_AioCall_time_remaining), 0, 0, 1, 1},
+    {&__pyx_n_s_AioCall_unary_unary, __pyx_k_AioCall_unary_unary, sizeof(__pyx_k_AioCall_unary_unary), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel, __pyx_k_AioChannel, sizeof(__pyx_k_AioChannel), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel___reduce_cython, __pyx_k_AioChannel___reduce_cython, sizeof(__pyx_k_AioChannel___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel___setstate_cython, __pyx_k_AioChannel___setstate_cython, sizeof(__pyx_k_AioChannel___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel_call, __pyx_k_AioChannel_call, sizeof(__pyx_k_AioChannel_call), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel_check_connectivity_st, __pyx_k_AioChannel_check_connectivity_st, sizeof(__pyx_k_AioChannel_check_connectivity_st), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel_close, __pyx_k_AioChannel_close, sizeof(__pyx_k_AioChannel_close), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel_closed, __pyx_k_AioChannel_closed, sizeof(__pyx_k_AioChannel_closed), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel_closing, __pyx_k_AioChannel_closing, sizeof(__pyx_k_AioChannel_closing), 0, 0, 1, 1},
+    {&__pyx_n_s_AioChannel_watch_connectivity_st, __pyx_k_AioChannel_watch_connectivity_st, sizeof(__pyx_k_AioChannel_watch_connectivity_st), 0, 0, 1, 1},
+    {&__pyx_n_s_AioRpcStatus, __pyx_k_AioRpcStatus, sizeof(__pyx_k_AioRpcStatus), 0, 0, 1, 1},
+    {&__pyx_n_s_AioRpcStatus___reduce_cython, __pyx_k_AioRpcStatus___reduce_cython, sizeof(__pyx_k_AioRpcStatus___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioRpcStatus___setstate_cython, __pyx_k_AioRpcStatus___setstate_cython, sizeof(__pyx_k_AioRpcStatus___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioRpcStatus_code, __pyx_k_AioRpcStatus_code, sizeof(__pyx_k_AioRpcStatus_code), 0, 0, 1, 1},
+    {&__pyx_n_s_AioRpcStatus_debug_error_string, __pyx_k_AioRpcStatus_debug_error_string, sizeof(__pyx_k_AioRpcStatus_debug_error_string), 0, 0, 1, 1},
+    {&__pyx_n_s_AioRpcStatus_details, __pyx_k_AioRpcStatus_details, sizeof(__pyx_k_AioRpcStatus_details), 0, 0, 1, 1},
+    {&__pyx_n_s_AioRpcStatus_trailing_metadata, __pyx_k_AioRpcStatus_trailing_metadata, sizeof(__pyx_k_AioRpcStatus_trailing_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer, __pyx_k_AioServer, sizeof(__pyx_k_AioServer), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer___reduce_cython, __pyx_k_AioServer___reduce_cython, sizeof(__pyx_k_AioServer___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer___setstate_cython, __pyx_k_AioServer___setstate_cython, sizeof(__pyx_k_AioServer___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer__request_call, __pyx_k_AioServer__request_call, sizeof(__pyx_k_AioServer__request_call), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer__server_main_loop, __pyx_k_AioServer__server_main_loop, sizeof(__pyx_k_AioServer__server_main_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer__serving_task_crash_ha, __pyx_k_AioServer__serving_task_crash_ha, sizeof(__pyx_k_AioServer__serving_task_crash_ha), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer__start_shutting_down, __pyx_k_AioServer__start_shutting_down, sizeof(__pyx_k_AioServer__start_shutting_down), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer_add_generic_rpc_handle, __pyx_k_AioServer_add_generic_rpc_handle, sizeof(__pyx_k_AioServer_add_generic_rpc_handle), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer_add_insecure_port, __pyx_k_AioServer_add_insecure_port, sizeof(__pyx_k_AioServer_add_insecure_port), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer_add_secure_port, __pyx_k_AioServer_add_secure_port, sizeof(__pyx_k_AioServer_add_secure_port), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer_is_running, __pyx_k_AioServer_is_running, sizeof(__pyx_k_AioServer_is_running), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer_shutdown, __pyx_k_AioServer_shutdown, sizeof(__pyx_k_AioServer_shutdown), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer_start, __pyx_k_AioServer_start, sizeof(__pyx_k_AioServer_start), 0, 0, 1, 1},
+    {&__pyx_n_s_AioServer_wait_for_termination, __pyx_k_AioServer_wait_for_termination, sizeof(__pyx_k_AioServer_wait_for_termination), 0, 0, 1, 1},
+    {&__pyx_n_s_AioState, __pyx_k_AioState, sizeof(__pyx_k_AioState), 0, 0, 1, 1},
+    {&__pyx_n_s_AioState___reduce_cython, __pyx_k_AioState___reduce_cython, sizeof(__pyx_k_AioState___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AioState___setstate_cython, __pyx_k_AioState___setstate_cython, sizeof(__pyx_k_AioState___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1},
+    {&__pyx_n_s_AsyncIOEngine, __pyx_k_AsyncIOEngine, sizeof(__pyx_k_AsyncIOEngine), 0, 0, 1, 1},
+    {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1},
+    {&__pyx_n_s_BaseCompletionQueue, __pyx_k_BaseCompletionQueue, sizeof(__pyx_k_BaseCompletionQueue), 0, 0, 1, 1},
+    {&__pyx_n_s_BaseCompletionQueue___reduce_cyt, __pyx_k_BaseCompletionQueue___reduce_cyt, sizeof(__pyx_k_BaseCompletionQueue___reduce_cyt), 0, 0, 1, 1},
+    {&__pyx_n_s_BaseCompletionQueue___setstate_c, __pyx_k_BaseCompletionQueue___setstate_c, sizeof(__pyx_k_BaseCompletionQueue___setstate_c), 0, 0, 1, 1},
+    {&__pyx_n_s_BaseError, __pyx_k_BaseError, sizeof(__pyx_k_BaseError), 0, 0, 1, 1},
+    {&__pyx_n_s_BaseEvent, __pyx_k_BaseEvent, sizeof(__pyx_k_BaseEvent), 0, 0, 1, 1},
+    {&__pyx_n_s_BatchOperationEvent, __pyx_k_BatchOperationEvent, sizeof(__pyx_k_BatchOperationEvent), 0, 0, 1, 1},
+    {&__pyx_n_s_BatchOperationEvent___reduce_cyt, __pyx_k_BatchOperationEvent___reduce_cyt, sizeof(__pyx_k_BatchOperationEvent___reduce_cyt), 0, 0, 1, 1},
+    {&__pyx_n_s_BatchOperationEvent___setstate_c, __pyx_k_BatchOperationEvent___setstate_c, sizeof(__pyx_k_BatchOperationEvent___setstate_c), 0, 0, 1, 1},
+    {&__pyx_n_s_BatchOperationTag, __pyx_k_BatchOperationTag, sizeof(__pyx_k_BatchOperationTag), 0, 0, 1, 1},
+    {&__pyx_n_s_BatchOperationTag___reduce_cyth, __pyx_k_BatchOperationTag___reduce_cyth, sizeof(__pyx_k_BatchOperationTag___reduce_cyth), 0, 0, 1, 1},
+    {&__pyx_n_s_BatchOperationTag___setstate_cy, __pyx_k_BatchOperationTag___setstate_cy, sizeof(__pyx_k_BatchOperationTag___setstate_cy), 0, 0, 1, 1},
+    {&__pyx_kp_s_Binary_metadata_key_s_expected_b, __pyx_k_Binary_metadata_key_s_expected_b, sizeof(__pyx_k_Binary_metadata_key_s_expected_b), 0, 0, 1, 0},
+    {&__pyx_n_s_BoundEventLoop, __pyx_k_BoundEventLoop, sizeof(__pyx_k_BoundEventLoop), 0, 0, 1, 1},
+    {&__pyx_n_s_BoundEventLoop___reduce_cython, __pyx_k_BoundEventLoop___reduce_cython, sizeof(__pyx_k_BoundEventLoop___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_BoundEventLoop___setstate_cytho, __pyx_k_BoundEventLoop___setstate_cytho, sizeof(__pyx_k_BoundEventLoop___setstate_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_BoundEventLoop_close, __pyx_k_BoundEventLoop_close, sizeof(__pyx_k_BoundEventLoop_close), 0, 0, 1, 1},
+    {&__pyx_n_s_COMPRESSION_METADATA_STRING_MAP, __pyx_k_COMPRESSION_METADATA_STRING_MAP, sizeof(__pyx_k_COMPRESSION_METADATA_STRING_MAP), 0, 0, 1, 1},
+    {&__pyx_n_s_CUSTOM_IO_MANAGER, __pyx_k_CUSTOM_IO_MANAGER, sizeof(__pyx_k_CUSTOM_IO_MANAGER), 0, 0, 1, 1},
+    {&__pyx_n_s_CYGRPC_STATUS_CODE_TO_STATUS_COD, __pyx_k_CYGRPC_STATUS_CODE_TO_STATUS_COD, sizeof(__pyx_k_CYGRPC_STATUS_CODE_TO_STATUS_COD), 0, 0, 1, 1},
+    {&__pyx_n_s_Call, __pyx_k_Call, sizeof(__pyx_k_Call), 0, 0, 1, 1},
+    {&__pyx_n_s_CallCredentials, __pyx_k_CallCredentials, sizeof(__pyx_k_CallCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_CallCredentials___reduce_cython, __pyx_k_CallCredentials___reduce_cython, sizeof(__pyx_k_CallCredentials___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CallCredentials___setstate_cytho, __pyx_k_CallCredentials___setstate_cytho, sizeof(__pyx_k_CallCredentials___setstate_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_CallDetails, __pyx_k_CallDetails, sizeof(__pyx_k_CallDetails), 0, 0, 1, 1},
+    {&__pyx_n_s_CallDetails___reduce_cython, __pyx_k_CallDetails___reduce_cython, sizeof(__pyx_k_CallDetails___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CallDetails___setstate_cython, __pyx_k_CallDetails___setstate_cython, sizeof(__pyx_k_CallDetails___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CallError, __pyx_k_CallError, sizeof(__pyx_k_CallError), 0, 0, 1, 1},
+    {&__pyx_n_s_CallHandle, __pyx_k_CallHandle, sizeof(__pyx_k_CallHandle), 0, 0, 1, 1},
+    {&__pyx_n_s_CallHandle___reduce_cython, __pyx_k_CallHandle___reduce_cython, sizeof(__pyx_k_CallHandle___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CallHandle___setstate_cython, __pyx_k_CallHandle___setstate_cython, sizeof(__pyx_k_CallHandle___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CallState, __pyx_k_CallState, sizeof(__pyx_k_CallState), 0, 0, 1, 1},
+    {&__pyx_n_s_CallState___reduce_cython, __pyx_k_CallState___reduce_cython, sizeof(__pyx_k_CallState___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CallState___setstate_cython, __pyx_k_CallState___setstate_cython, sizeof(__pyx_k_CallState___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Call___reduce_cython, __pyx_k_Call___reduce_cython, sizeof(__pyx_k_Call___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Call___setstate_cython, __pyx_k_Call___setstate_cython, sizeof(__pyx_k_Call___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Call__custom_op_on_c_call, __pyx_k_Call__custom_op_on_c_call, sizeof(__pyx_k_Call__custom_op_on_c_call), 0, 0, 1, 1},
+    {&__pyx_n_s_Call__start_batch, __pyx_k_Call__start_batch, sizeof(__pyx_k_Call__start_batch), 0, 0, 1, 1},
+    {&__pyx_n_s_Call_cancel, __pyx_k_Call_cancel, sizeof(__pyx_k_Call_cancel), 0, 0, 1, 1},
+    {&__pyx_kp_s_Call_credentials_are_only_valid, __pyx_k_Call_credentials_are_only_valid, sizeof(__pyx_k_Call_credentials_are_only_valid), 0, 0, 1, 0},
+    {&__pyx_kp_s_Call_credentials_may_not_be_NULL, __pyx_k_Call_credentials_may_not_be_NULL, sizeof(__pyx_k_Call_credentials_may_not_be_NULL), 0, 0, 1, 0},
+    {&__pyx_n_s_Call_peer, __pyx_k_Call_peer, sizeof(__pyx_k_Call_peer), 0, 0, 1, 1},
+    {&__pyx_n_s_Call_set_credentials, __pyx_k_Call_set_credentials, sizeof(__pyx_k_Call_set_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_Call_start_client_batch, __pyx_k_Call_start_client_batch, sizeof(__pyx_k_Call_start_client_batch), 0, 0, 1, 1},
+    {&__pyx_n_s_Call_start_server_batch, __pyx_k_Call_start_server_batch, sizeof(__pyx_k_Call_start_server_batch), 0, 0, 1, 1},
+    {&__pyx_n_s_CallbackFailureHandler, __pyx_k_CallbackFailureHandler, sizeof(__pyx_k_CallbackFailureHandler), 0, 0, 1, 1},
+    {&__pyx_n_s_CallbackFailureHandler___reduce, __pyx_k_CallbackFailureHandler___reduce, sizeof(__pyx_k_CallbackFailureHandler___reduce), 0, 0, 1, 1},
+    {&__pyx_n_s_CallbackFailureHandler___setstat, __pyx_k_CallbackFailureHandler___setstat, sizeof(__pyx_k_CallbackFailureHandler___setstat), 0, 0, 1, 1},
+    {&__pyx_n_s_CallbackWrapper, __pyx_k_CallbackWrapper, sizeof(__pyx_k_CallbackWrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_CallbackWrapper___reduce_cython, __pyx_k_CallbackWrapper___reduce_cython, sizeof(__pyx_k_CallbackWrapper___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CallbackWrapper___setstate_cytho, __pyx_k_CallbackWrapper___setstate_cytho, sizeof(__pyx_k_CallbackWrapper___setstate_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_CancelledError, __pyx_k_CancelledError, sizeof(__pyx_k_CancelledError), 0, 0, 1, 1},
+    {&__pyx_kp_s_Cannot_invoke_RPC_on_closed_chan, __pyx_k_Cannot_invoke_RPC_on_closed_chan, sizeof(__pyx_k_Cannot_invoke_RPC_on_closed_chan), 0, 0, 1, 0},
+    {&__pyx_kp_s_Cannot_invoke_RPC_s, __pyx_k_Cannot_invoke_RPC_s, sizeof(__pyx_k_Cannot_invoke_RPC_s), 0, 0, 1, 0},
+    {&__pyx_kp_s_Cannot_monitor_channel_state_s, __pyx_k_Cannot_monitor_channel_state_s, sizeof(__pyx_k_Cannot_monitor_channel_state_s), 0, 0, 1, 0},
+    {&__pyx_n_s_CensusContext, __pyx_k_CensusContext, sizeof(__pyx_k_CensusContext), 0, 0, 1, 1},
+    {&__pyx_n_s_CensusContext___reduce_cython, __pyx_k_CensusContext___reduce_cython, sizeof(__pyx_k_CensusContext___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CensusContext___setstate_cython, __pyx_k_CensusContext___setstate_cython, sizeof(__pyx_k_CensusContext___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel, __pyx_k_Channel, sizeof(__pyx_k_Channel), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelArg, __pyx_k_ChannelArg, sizeof(__pyx_k_ChannelArg), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelArgKey, __pyx_k_ChannelArgKey, sizeof(__pyx_k_ChannelArgKey), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelArg___reduce_cython, __pyx_k_ChannelArg___reduce_cython, sizeof(__pyx_k_ChannelArg___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelArg___setstate_cython, __pyx_k_ChannelArg___setstate_cython, sizeof(__pyx_k_ChannelArg___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelArgs, __pyx_k_ChannelArgs, sizeof(__pyx_k_ChannelArgs), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelArgs___reduce_cython, __pyx_k_ChannelArgs___reduce_cython, sizeof(__pyx_k_ChannelArgs___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelArgs___setstate_cython, __pyx_k_ChannelArgs___setstate_cython, sizeof(__pyx_k_ChannelArgs___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelCredentials, __pyx_k_ChannelCredentials, sizeof(__pyx_k_ChannelCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelCredentials___reduce_cyth, __pyx_k_ChannelCredentials___reduce_cyth, sizeof(__pyx_k_ChannelCredentials___reduce_cyth), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelCredentials___setstate_cy, __pyx_k_ChannelCredentials___setstate_cy, sizeof(__pyx_k_ChannelCredentials___setstate_cy), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelState, __pyx_k_ChannelState, sizeof(__pyx_k_ChannelState), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelState___reduce_cython, __pyx_k_ChannelState___reduce_cython, sizeof(__pyx_k_ChannelState___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_ChannelState___setstate_cython, __pyx_k_ChannelState___setstate_cython, sizeof(__pyx_k_ChannelState___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel___reduce_cython, __pyx_k_Channel___reduce_cython, sizeof(__pyx_k_Channel___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel___setstate_cython, __pyx_k_Channel___setstate_cython, sizeof(__pyx_k_Channel___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel_check_connectivity_state, __pyx_k_Channel_check_connectivity_state, sizeof(__pyx_k_Channel_check_connectivity_state), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel_close, __pyx_k_Channel_close, sizeof(__pyx_k_Channel_close), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel_close_on_fork, __pyx_k_Channel_close_on_fork, sizeof(__pyx_k_Channel_close_on_fork), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel_get_registered_call_hand, __pyx_k_Channel_get_registered_call_hand, sizeof(__pyx_k_Channel_get_registered_call_hand), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel_integrated_call, __pyx_k_Channel_integrated_call, sizeof(__pyx_k_Channel_integrated_call), 0, 0, 1, 1},
+    {&__pyx_kp_s_Channel_is_closed, __pyx_k_Channel_is_closed, sizeof(__pyx_k_Channel_is_closed), 0, 0, 1, 0},
+    {&__pyx_n_s_Channel_next_call_event, __pyx_k_Channel_next_call_event, sizeof(__pyx_k_Channel_next_call_event), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel_segregated_call, __pyx_k_Channel_segregated_call, sizeof(__pyx_k_Channel_segregated_call), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel_target, __pyx_k_Channel_target, sizeof(__pyx_k_Channel_target), 0, 0, 1, 1},
+    {&__pyx_n_s_Channel_watch_connectivity_state, __pyx_k_Channel_watch_connectivity_state, sizeof(__pyx_k_Channel_watch_connectivity_state), 0, 0, 1, 1},
+    {&__pyx_n_s_CompletionQueue, __pyx_k_CompletionQueue, sizeof(__pyx_k_CompletionQueue), 0, 0, 1, 1},
+    {&__pyx_n_s_CompletionQueue___reduce_cython, __pyx_k_CompletionQueue___reduce_cython, sizeof(__pyx_k_CompletionQueue___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_CompletionQueue___setstate_cytho, __pyx_k_CompletionQueue___setstate_cytho, sizeof(__pyx_k_CompletionQueue___setstate_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_CompletionQueue__internal_poll, __pyx_k_CompletionQueue__internal_poll, sizeof(__pyx_k_CompletionQueue__internal_poll), 0, 0, 1, 1},
+    {&__pyx_n_s_CompletionQueue_clear, __pyx_k_CompletionQueue_clear, sizeof(__pyx_k_CompletionQueue_clear), 0, 0, 1, 1},
+    {&__pyx_n_s_CompletionQueue_poll, __pyx_k_CompletionQueue_poll, sizeof(__pyx_k_CompletionQueue_poll), 0, 0, 1, 1},
+    {&__pyx_n_s_CompletionQueue_shutdown, __pyx_k_CompletionQueue_shutdown, sizeof(__pyx_k_CompletionQueue_shutdown), 0, 0, 1, 1},
+    {&__pyx_n_s_CompletionType, __pyx_k_CompletionType, sizeof(__pyx_k_CompletionType), 0, 0, 1, 1},
+    {&__pyx_n_s_CompositeCallCredentials, __pyx_k_CompositeCallCredentials, sizeof(__pyx_k_CompositeCallCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_CompositeCallCredentials___reduc, __pyx_k_CompositeCallCredentials___reduc, sizeof(__pyx_k_CompositeCallCredentials___reduc), 0, 0, 1, 1},
+    {&__pyx_n_s_CompositeCallCredentials___setst, __pyx_k_CompositeCallCredentials___setst, sizeof(__pyx_k_CompositeCallCredentials___setst), 0, 0, 1, 1},
+    {&__pyx_n_s_CompositeChannelCredentials, __pyx_k_CompositeChannelCredentials, sizeof(__pyx_k_CompositeChannelCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_CompositeChannelCredentials___re, __pyx_k_CompositeChannelCredentials___re, sizeof(__pyx_k_CompositeChannelCredentials___re), 0, 0, 1, 1},
+    {&__pyx_n_s_CompositeChannelCredentials___se, __pyx_k_CompositeChannelCredentials___se, sizeof(__pyx_k_CompositeChannelCredentials___se), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionAlgorithm, __pyx_k_CompressionAlgorithm, sizeof(__pyx_k_CompressionAlgorithm), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionLevel, __pyx_k_CompressionLevel, sizeof(__pyx_k_CompressionLevel), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionOptions, __pyx_k_CompressionOptions, sizeof(__pyx_k_CompressionOptions), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionOptions___reduce_cyth, __pyx_k_CompressionOptions___reduce_cyth, sizeof(__pyx_k_CompressionOptions___reduce_cyth), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionOptions___setstate_cy, __pyx_k_CompressionOptions___setstate_cy, sizeof(__pyx_k_CompressionOptions___setstate_cy), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionOptions_disable_algor, __pyx_k_CompressionOptions_disable_algor, sizeof(__pyx_k_CompressionOptions_disable_algor), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionOptions_enable_algori, __pyx_k_CompressionOptions_enable_algori, sizeof(__pyx_k_CompressionOptions_enable_algori), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionOptions_is_algorithm, __pyx_k_CompressionOptions_is_algorithm, sizeof(__pyx_k_CompressionOptions_is_algorithm), 0, 0, 1, 1},
+    {&__pyx_n_s_CompressionOptions_to_channel_ar, __pyx_k_CompressionOptions_to_channel_ar, sizeof(__pyx_k_CompressionOptions_to_channel_ar), 0, 0, 1, 1},
+    {&__pyx_kp_s_Compression_setting_must_be_spec, __pyx_k_Compression_setting_must_be_spec, sizeof(__pyx_k_Compression_setting_must_be_spec), 0, 0, 1, 0},
+    {&__pyx_n_s_ComputeEngineChannelCredentials, __pyx_k_ComputeEngineChannelCredentials, sizeof(__pyx_k_ComputeEngineChannelCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_ComputeEngineChannelCredentials_2, __pyx_k_ComputeEngineChannelCredentials_2, sizeof(__pyx_k_ComputeEngineChannelCredentials_2), 0, 0, 1, 1},
+    {&__pyx_n_s_ComputeEngineChannelCredentials_3, __pyx_k_ComputeEngineChannelCredentials_3, sizeof(__pyx_k_ComputeEngineChannelCredentials_3), 0, 0, 1, 1},
+    {&__pyx_n_s_ConcurrentRpcLimiter, __pyx_k_ConcurrentRpcLimiter, sizeof(__pyx_k_ConcurrentRpcLimiter), 0, 0, 1, 1},
+    {&__pyx_n_s_ConcurrentRpcLimiter___reduce_c, __pyx_k_ConcurrentRpcLimiter___reduce_c, sizeof(__pyx_k_ConcurrentRpcLimiter___reduce_c), 0, 0, 1, 1},
+    {&__pyx_n_s_ConcurrentRpcLimiter___setstate, __pyx_k_ConcurrentRpcLimiter___setstate, sizeof(__pyx_k_ConcurrentRpcLimiter___setstate), 0, 0, 1, 1},
+    {&__pyx_n_s_ConcurrentRpcLimiter__decrease, __pyx_k_ConcurrentRpcLimiter__decrease, sizeof(__pyx_k_ConcurrentRpcLimiter__decrease), 0, 0, 1, 1},
+    {&__pyx_n_s_ConcurrentRpcLimiter_check_befo, __pyx_k_ConcurrentRpcLimiter_check_befo, sizeof(__pyx_k_ConcurrentRpcLimiter_check_befo), 0, 0, 1, 1},
+    {&__pyx_n_s_ConcurrentRpcLimiter_decrease_o, __pyx_k_ConcurrentRpcLimiter_decrease_o, sizeof(__pyx_k_ConcurrentRpcLimiter_decrease_o), 0, 0, 1, 1},
+    {&__pyx_kp_s_Concurrent_RPC_limit_exceeded, __pyx_k_Concurrent_RPC_limit_exceeded, sizeof(__pyx_k_Concurrent_RPC_limit_exceeded), 0, 0, 1, 0},
+    {&__pyx_n_s_Condition, __pyx_k_Condition, sizeof(__pyx_k_Condition), 0, 0, 1, 1},
+    {&__pyx_n_s_ConnectivityEvent, __pyx_k_ConnectivityEvent, sizeof(__pyx_k_ConnectivityEvent), 0, 0, 1, 1},
+    {&__pyx_n_s_ConnectivityEvent___reduce_cytho, __pyx_k_ConnectivityEvent___reduce_cytho, sizeof(__pyx_k_ConnectivityEvent___reduce_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_ConnectivityEvent___setstate_cyt, __pyx_k_ConnectivityEvent___setstate_cyt, sizeof(__pyx_k_ConnectivityEvent___setstate_cyt), 0, 0, 1, 1},
+    {&__pyx_n_s_ConnectivityState, __pyx_k_ConnectivityState, sizeof(__pyx_k_ConnectivityState), 0, 0, 1, 1},
+    {&__pyx_n_s_ConnectivityTag, __pyx_k_ConnectivityTag, sizeof(__pyx_k_ConnectivityTag), 0, 0, 1, 1},
+    {&__pyx_n_s_ConnectivityTag___reduce_cython, __pyx_k_ConnectivityTag___reduce_cython, sizeof(__pyx_k_ConnectivityTag___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_ConnectivityTag___setstate_cyth, __pyx_k_ConnectivityTag___setstate_cyth, sizeof(__pyx_k_ConnectivityTag___setstate_cyth), 0, 0, 1, 1},
+    {&__pyx_kp_s_Core_should_not_return_GRPC_QUEU, __pyx_k_Core_should_not_return_GRPC_QUEU, sizeof(__pyx_k_Core_should_not_return_GRPC_QUEU), 0, 0, 1, 0},
+    {&__pyx_kp_s_Credentials_couldn_t_have_been_s, __pyx_k_Credentials_couldn_t_have_been_s, sizeof(__pyx_k_Credentials_couldn_t_have_been_s), 0, 0, 1, 0},
+    {&__pyx_kp_s_Dedicated_exception_class_for_wa, __pyx_k_Dedicated_exception_class_for_wa, sizeof(__pyx_k_Dedicated_exception_class_for_wa), 0, 0, 1, 0},
+    {&__pyx_n_s_DeprecationWarning, __pyx_k_DeprecationWarning, sizeof(__pyx_k_DeprecationWarning), 0, 0, 1, 1},
+    {&__pyx_n_s_EMPTY_FLAGS, __pyx_k_EMPTY_FLAGS, sizeof(__pyx_k_EMPTY_FLAGS), 0, 0, 1, 1},
+    {&__pyx_n_s_EMPTY_MASK, __pyx_k_EMPTY_MASK, sizeof(__pyx_k_EMPTY_MASK), 0, 0, 1, 1},
+    {&__pyx_n_s_EOF, __pyx_k_EOF, sizeof(__pyx_k_EOF), 0, 0, 1, 1},
+    {&__pyx_n_s_EOF_2, __pyx_k_EOF_2, sizeof(__pyx_k_EOF_2), 0, 0, 1, 1},
+    {&__pyx_n_s_EOF___bool, __pyx_k_EOF___bool, sizeof(__pyx_k_EOF___bool), 0, 0, 1, 1},
+    {&__pyx_n_s_EOF___len, __pyx_k_EOF___len, sizeof(__pyx_k_EOF___len), 0, 0, 1, 1},
+    {&__pyx_n_s_EOF___repr, __pyx_k_EOF___repr, sizeof(__pyx_k_EOF___repr), 0, 0, 1, 1},
+    {&__pyx_n_s_EOF___str, __pyx_k_EOF___str, sizeof(__pyx_k_EOF___str), 0, 0, 1, 1},
+    {&__pyx_n_s_EOF__repr, __pyx_k_EOF__repr, sizeof(__pyx_k_EOF__repr), 0, 0, 1, 1},
+    {&__pyx_n_s_EX_USAGE, __pyx_k_EX_USAGE, sizeof(__pyx_k_EX_USAGE), 0, 0, 1, 1},
+    {&__pyx_n_s_Enum, __pyx_k_Enum, sizeof(__pyx_k_Enum), 0, 0, 1, 1},
+    {&__pyx_kp_s_Error_fetching_certificate_confi, __pyx_k_Error_fetching_certificate_confi, sizeof(__pyx_k_Error_fetching_certificate_confi), 0, 0, 1, 0},
+    {&__pyx_kp_s_Error_fetching_certificate_confi_2, __pyx_k_Error_fetching_certificate_confi_2, sizeof(__pyx_k_Error_fetching_certificate_confi_2), 0, 0, 1, 0},
+    {&__pyx_kp_s_Error_in_callback_for_method_s, __pyx_k_Error_in_callback_for_method_s, sizeof(__pyx_k_Error_in_callback_for_method_s), 0, 0, 1, 0},
+    {&__pyx_kp_s_Error_in_grpc_server_request_cal, __pyx_k_Error_in_grpc_server_request_cal, sizeof(__pyx_k_Error_in_grpc_server_request_cal), 0, 0, 1, 0},
+    {&__pyx_n_s_ExecuteBatchError, __pyx_k_ExecuteBatchError, sizeof(__pyx_k_ExecuteBatchError), 0, 0, 1, 1},
+    {&__pyx_kp_s_ExecuteBatchError_raised_in_core, __pyx_k_ExecuteBatchError_raised_in_core, sizeof(__pyx_k_ExecuteBatchError_raised_in_core), 0, 0, 1, 0},
+    {&__pyx_kp_s_Exiting_child_due_to_raised_exce, __pyx_k_Exiting_child_due_to_raised_exce, sizeof(__pyx_k_Exiting_child_due_to_raised_exce), 0, 0, 1, 0},
+    {&__pyx_kp_s_Expected_bytes_str_or_unicode_no, __pyx_k_Expected_bytes_str_or_unicode_no, sizeof(__pyx_k_Expected_bytes_str_or_unicode_no), 0, 0, 1, 0},
+    {&__pyx_kp_s_Expected_int_bytes_or_behavior_g, __pyx_k_Expected_int_bytes_or_behavior_g, sizeof(__pyx_k_Expected_int_bytes_or_behavior_g), 0, 0, 1, 0},
+    {&__pyx_kp_s_Expected_str_not, __pyx_k_Expected_str_not, sizeof(__pyx_k_Expected_str_not), 0, 0, 1, 0},
+    {&__pyx_kp_s_Expecting_non_ok_status_code, __pyx_k_Expecting_non_ok_status_code, sizeof(__pyx_k_Expecting_non_ok_status_code), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_grpc_call_start_batch_wit, __pyx_k_Failed_grpc_call_start_batch_wit, sizeof(__pyx_k_Failed_grpc_call_start_batch_wit), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_s_s, __pyx_k_Failed_s_s, sizeof(__pyx_k_Failed_s_s), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_sending_error_status_from, __pyx_k_Failed_sending_error_status_from, sizeof(__pyx_k_Failed_sending_error_status_from), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_get_server_sockets_ple, __pyx_k_Failed_to_get_server_sockets_ple, sizeof(__pyx_k_Failed_to_get_server_sockets_ple), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_get_servers_please_ens, __pyx_k_Failed_to_get_servers_please_ens, sizeof(__pyx_k_Failed_to_get_servers_please_ens), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_get_the_channel_please, __pyx_k_Failed_to_get_the_channel_please, sizeof(__pyx_k_Failed_to_get_the_channel_please), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_get_the_server_please, __pyx_k_Failed_to_get_the_server_please, sizeof(__pyx_k_Failed_to_get_the_server_please), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_get_the_socket_please, __pyx_k_Failed_to_get_the_socket_please, sizeof(__pyx_k_Failed_to_get_the_socket_please), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_get_the_subchannel_ple, __pyx_k_Failed_to_get_the_subchannel_ple, sizeof(__pyx_k_Failed_to_get_the_subchannel_ple), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_get_top_channels_pleas, __pyx_k_Failed_to_get_top_channels_pleas, sizeof(__pyx_k_Failed_to_get_top_channels_pleas), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_receive_any_message_fr, __pyx_k_Failed_to_receive_any_message_fr, sizeof(__pyx_k_Failed_to_receive_any_message_fr), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_shutdown_gRPC_Core_aft, __pyx_k_Failed_to_shutdown_gRPC_Core_aft, sizeof(__pyx_k_Failed_to_shutdown_gRPC_Core_aft), 0, 0, 1, 0},
+    {&__pyx_kp_s_Failed_to_shutdown_gRPC_Python_t, __pyx_k_Failed_to_shutdown_gRPC_Python_t, sizeof(__pyx_k_Failed_to_shutdown_gRPC_Python_t), 0, 0, 1, 0},
+    {&__pyx_n_s_ForkManagedThread, __pyx_k_ForkManagedThread, sizeof(__pyx_k_ForkManagedThread), 0, 0, 1, 1},
+    {&__pyx_n_s_ForkManagedThread___init, __pyx_k_ForkManagedThread___init, sizeof(__pyx_k_ForkManagedThread___init), 0, 0, 1, 1},
+    {&__pyx_n_s_ForkManagedThread___init___local, __pyx_k_ForkManagedThread___init___local, sizeof(__pyx_k_ForkManagedThread___init___local), 0, 0, 1, 1},
+    {&__pyx_n_s_ForkManagedThread_join, __pyx_k_ForkManagedThread_join, sizeof(__pyx_k_ForkManagedThread_join), 0, 0, 1, 1},
+    {&__pyx_n_s_ForkManagedThread_setDaemon, __pyx_k_ForkManagedThread_setDaemon, sizeof(__pyx_k_ForkManagedThread_setDaemon), 0, 0, 1, 1},
+    {&__pyx_n_s_ForkManagedThread_start, __pyx_k_ForkManagedThread_start, sizeof(__pyx_k_ForkManagedThread_start), 0, 0, 1, 1},
+    {&__pyx_n_s_ForkState, __pyx_k_ForkState, sizeof(__pyx_k_ForkState), 0, 0, 1, 1},
+    {&__pyx_n_s_ForkState___init, __pyx_k_ForkState___init, sizeof(__pyx_k_ForkState___init), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_ASYNCIO_ENGINE, __pyx_k_GRPC_ASYNCIO_ENGINE, sizeof(__pyx_k_GRPC_ASYNCIO_ENGINE), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_COMPRESSION_CHANNEL_DEFAULT, __pyx_k_GRPC_COMPRESSION_CHANNEL_DEFAULT, sizeof(__pyx_k_GRPC_COMPRESSION_CHANNEL_DEFAULT), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_COMPRESSION_REQUEST_ALGORIT, __pyx_k_GRPC_COMPRESSION_REQUEST_ALGORIT, sizeof(__pyx_k_GRPC_COMPRESSION_REQUEST_ALGORIT), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT, __pyx_k_GRPC_ENABLE_FORK_SUPPORT, sizeof(__pyx_k_GRPC_ENABLE_FORK_SUPPORT), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_ENABLE_FORK_SUPPORT_2, __pyx_k_GRPC_ENABLE_FORK_SUPPORT_2, sizeof(__pyx_k_GRPC_ENABLE_FORK_SUPPORT_2), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_PROPAGATE_CANCELLATION, __pyx_k_GRPC_PROPAGATE_CANCELLATION, sizeof(__pyx_k_GRPC_PROPAGATE_CANCELLATION), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_PROPAGATE_CENSUS_STATS_CONT, __pyx_k_GRPC_PROPAGATE_CENSUS_STATS_CONT, sizeof(__pyx_k_GRPC_PROPAGATE_CENSUS_STATS_CONT), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_PROPAGATE_CENSUS_TRACING_CO, __pyx_k_GRPC_PROPAGATE_CENSUS_TRACING_CO, sizeof(__pyx_k_GRPC_PROPAGATE_CENSUS_TRACING_CO), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_PROPAGATE_DEADLINE, __pyx_k_GRPC_PROPAGATE_DEADLINE, sizeof(__pyx_k_GRPC_PROPAGATE_DEADLINE), 0, 0, 1, 1},
+    {&__pyx_n_s_GRPC_PROPAGATE_DEFAULTS, __pyx_k_GRPC_PROPAGATE_DEFAULTS, sizeof(__pyx_k_GRPC_PROPAGATE_DEFAULTS), 0, 0, 1, 1},
+    {&__pyx_n_s_Group, __pyx_k_Group, sizeof(__pyx_k_Group), 0, 0, 1, 1},
+    {&__pyx_n_s_GrpcArgWrapper, __pyx_k_GrpcArgWrapper, sizeof(__pyx_k_GrpcArgWrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_GrpcArgWrapper___reduce_cython, __pyx_k_GrpcArgWrapper___reduce_cython, sizeof(__pyx_k_GrpcArgWrapper___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_GrpcArgWrapper___setstate_cytho, __pyx_k_GrpcArgWrapper___setstate_cytho, sizeof(__pyx_k_GrpcArgWrapper___setstate_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_GrpcCallWrapper, __pyx_k_GrpcCallWrapper, sizeof(__pyx_k_GrpcCallWrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_HandlerCallDetails, __pyx_k_HandlerCallDetails, sizeof(__pyx_k_HandlerCallDetails), 0, 0, 1, 1},
+    {&__pyx_n_s_HandlerCallDetails___reduce_cyt, __pyx_k_HandlerCallDetails___reduce_cyt, sizeof(__pyx_k_HandlerCallDetails___reduce_cyt), 0, 0, 1, 1},
+    {&__pyx_n_s_HandlerCallDetails___setstate_c, __pyx_k_HandlerCallDetails___setstate_c, sizeof(__pyx_k_HandlerCallDetails___setstate_c), 0, 0, 1, 1},
+    {&__pyx_n_s_IMMUTABLE_EMPTY_METADATA, __pyx_k_IMMUTABLE_EMPTY_METADATA, sizeof(__pyx_k_IMMUTABLE_EMPTY_METADATA), 0, 0, 1, 1},
+    {&__pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR, __pyx_k_INTERNAL_CALL_ERROR_MESSAGE_FOR, sizeof(__pyx_k_INTERNAL_CALL_ERROR_MESSAGE_FOR), 0, 0, 1, 1},
+    {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1},
+    {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0},
+    {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_k_Incompatible_checksums_0x_x_vs_0_2, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_2), 0, 0, 1, 0},
+    {&__pyx_n_s_InitialMetadataFlags, __pyx_k_InitialMetadataFlags, sizeof(__pyx_k_InitialMetadataFlags), 0, 0, 1, 1},
+    {&__pyx_n_s_InsecureChannelCredentials, __pyx_k_InsecureChannelCredentials, sizeof(__pyx_k_InsecureChannelCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_InsecureChannelCredentials___red, __pyx_k_InsecureChannelCredentials___red, sizeof(__pyx_k_InsecureChannelCredentials___red), 0, 0, 1, 1},
+    {&__pyx_n_s_InsecureChannelCredentials___set, __pyx_k_InsecureChannelCredentials___set, sizeof(__pyx_k_InsecureChannelCredentials___set), 0, 0, 1, 1},
+    {&__pyx_n_s_IntegratedCall, __pyx_k_IntegratedCall, sizeof(__pyx_k_IntegratedCall), 0, 0, 1, 1},
+    {&__pyx_n_s_IntegratedCall___reduce_cython, __pyx_k_IntegratedCall___reduce_cython, sizeof(__pyx_k_IntegratedCall___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_IntegratedCall___setstate_cython, __pyx_k_IntegratedCall___setstate_cython, sizeof(__pyx_k_IntegratedCall___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_IntegratedCall_cancel, __pyx_k_IntegratedCall_cancel, sizeof(__pyx_k_IntegratedCall_cancel), 0, 0, 1, 1},
+    {&__pyx_n_s_IntegratedCall_operate, __pyx_k_IntegratedCall_operate, sizeof(__pyx_k_IntegratedCall_operate), 0, 0, 1, 1},
+    {&__pyx_n_s_InternalError, __pyx_k_InternalError, sizeof(__pyx_k_InternalError), 0, 0, 1, 1},
+    {&__pyx_kp_s_Internal_error_from_Core, __pyx_k_Internal_error_from_Core, sizeof(__pyx_k_Internal_error_from_Core), 0, 0, 1, 0},
+    {&__pyx_kp_s_Internal_gRPC_call_error_d, __pyx_k_Internal_gRPC_call_error_d, sizeof(__pyx_k_Internal_gRPC_call_error_d), 0, 0, 1, 0},
+    {&__pyx_kp_s_Invalid_encoding_on_s, __pyx_k_Invalid_encoding_on_s, sizeof(__pyx_k_Invalid_encoding_on_s), 0, 0, 1, 0},
+    {&__pyx_kp_u_Invalid_trailing_metadata_type_e, __pyx_k_Invalid_trailing_metadata_type_e, sizeof(__pyx_k_Invalid_trailing_metadata_type_e), 0, 1, 0, 0},
+    {&__pyx_n_s_KeyError, __pyx_k_KeyError, sizeof(__pyx_k_KeyError), 0, 0, 1, 1},
+    {&__pyx_n_s_KeyboardInterrupt, __pyx_k_KeyboardInterrupt, sizeof(__pyx_k_KeyboardInterrupt), 0, 0, 1, 1},
+    {&__pyx_n_s_LOGGER, __pyx_k_LOGGER, sizeof(__pyx_k_LOGGER), 0, 0, 1, 1},
+    {&__pyx_n_s_LatentEventArg, __pyx_k_LatentEventArg, sizeof(__pyx_k_LatentEventArg), 0, 0, 1, 1},
+    {&__pyx_n_s_LocalChannelCredentials, __pyx_k_LocalChannelCredentials, sizeof(__pyx_k_LocalChannelCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_LocalChannelCredentials___reduce, __pyx_k_LocalChannelCredentials___reduce, sizeof(__pyx_k_LocalChannelCredentials___reduce), 0, 0, 1, 1},
+    {&__pyx_n_s_LocalChannelCredentials___setsta, __pyx_k_LocalChannelCredentials___setsta, sizeof(__pyx_k_LocalChannelCredentials___setsta), 0, 0, 1, 1},
+    {&__pyx_n_s_LocalConnectionType, __pyx_k_LocalConnectionType, sizeof(__pyx_k_LocalConnectionType), 0, 0, 1, 1},
+    {&__pyx_kp_s_Locally_aborted, __pyx_k_Locally_aborted, sizeof(__pyx_k_Locally_aborted), 0, 0, 1, 0},
+    {&__pyx_n_s_Lock, __pyx_k_Lock, sizeof(__pyx_k_Lock), 0, 0, 1, 1},
+    {&__pyx_n_s_MessageReceiver, __pyx_k_MessageReceiver, sizeof(__pyx_k_MessageReceiver), 0, 0, 1, 1},
+    {&__pyx_n_s_MessageReceiver___anext, __pyx_k_MessageReceiver___anext, sizeof(__pyx_k_MessageReceiver___anext), 0, 0, 1, 1},
+    {&__pyx_n_s_MessageReceiver___reduce_cython, __pyx_k_MessageReceiver___reduce_cython, sizeof(__pyx_k_MessageReceiver___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_MessageReceiver___setstate_cyth, __pyx_k_MessageReceiver___setstate_cyth, sizeof(__pyx_k_MessageReceiver___setstate_cyth), 0, 0, 1, 1},
+    {&__pyx_n_s_MessageReceiver__async_message, __pyx_k_MessageReceiver__async_message, sizeof(__pyx_k_MessageReceiver__async_message), 0, 0, 1, 1},
+    {&__pyx_n_s_MetadataPluginCallCredentials, __pyx_k_MetadataPluginCallCredentials, sizeof(__pyx_k_MetadataPluginCallCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_MetadataPluginCallCredentials_2, __pyx_k_MetadataPluginCallCredentials_2, sizeof(__pyx_k_MetadataPluginCallCredentials_2), 0, 0, 1, 1},
+    {&__pyx_n_s_MetadataPluginCallCredentials_3, __pyx_k_MetadataPluginCallCredentials_3, sizeof(__pyx_k_MetadataPluginCallCredentials_3), 0, 0, 1, 1},
+    {&__pyx_n_s_Metadatum, __pyx_k_Metadatum, sizeof(__pyx_k_Metadatum), 0, 0, 1, 1},
+    {&__pyx_kp_s_Method_not_found, __pyx_k_Method_not_found, sizeof(__pyx_k_Method_not_found), 0, 0, 1, 0},
+    {&__pyx_n_s_NON_OK_CALL_REPRESENTATION, __pyx_k_NON_OK_CALL_REPRESENTATION, sizeof(__pyx_k_NON_OK_CALL_REPRESENTATION), 0, 0, 1, 1},
+    {&__pyx_kp_s_No_custom_hooks_are_implemented, __pyx_k_No_custom_hooks_are_implemented, sizeof(__pyx_k_No_custom_hooks_are_implemented), 0, 0, 1, 0},
+    {&__pyx_kp_s_Non_thread_safe_operation, __pyx_k_Non_thread_safe_operation, sizeof(__pyx_k_Non_thread_safe_operation), 0, 0, 1, 0},
+    {&__pyx_n_s_None, __pyx_k_None, sizeof(__pyx_k_None), 0, 0, 1, 1},
+    {&__pyx_n_s_NotImplementedError, __pyx_k_NotImplementedError, sizeof(__pyx_k_NotImplementedError), 0, 0, 1, 1},
+    {&__pyx_n_s_OK_CALL_REPRESENTATION, __pyx_k_OK_CALL_REPRESENTATION, sizeof(__pyx_k_OK_CALL_REPRESENTATION), 0, 0, 1, 1},
+    {&__pyx_n_s_Operation, __pyx_k_Operation, sizeof(__pyx_k_Operation), 0, 0, 1, 1},
+    {&__pyx_n_s_OperationType, __pyx_k_OperationType, sizeof(__pyx_k_OperationType), 0, 0, 1, 1},
+    {&__pyx_n_s_Operation___reduce_cython, __pyx_k_Operation___reduce_cython, sizeof(__pyx_k_Operation___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Operation___setstate_cython, __pyx_k_Operation___setstate_cython, sizeof(__pyx_k_Operation___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Optional, __pyx_k_Optional, sizeof(__pyx_k_Optional), 0, 0, 1, 1},
+    {&__pyx_n_s_POLLER, __pyx_k_POLLER, sizeof(__pyx_k_POLLER), 0, 0, 1, 1},
+    {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1},
+    {&__pyx_kp_s_Please_report_to_https_github_co, __pyx_k_Please_report_to_https_github_co, sizeof(__pyx_k_Please_report_to_https_github_co), 0, 0, 1, 0},
+    {&__pyx_n_s_PollerCompletionQueue, __pyx_k_PollerCompletionQueue, sizeof(__pyx_k_PollerCompletionQueue), 0, 0, 1, 1},
+    {&__pyx_n_s_PollerCompletionQueue___reduce_c, __pyx_k_PollerCompletionQueue___reduce_c, sizeof(__pyx_k_PollerCompletionQueue___reduce_c), 0, 0, 1, 1},
+    {&__pyx_n_s_PollerCompletionQueue___setstate, __pyx_k_PollerCompletionQueue___setstate, sizeof(__pyx_k_PollerCompletionQueue___setstate), 0, 0, 1, 1},
+    {&__pyx_n_s_PollerCompletionQueue__handle_ev, __pyx_k_PollerCompletionQueue__handle_ev, sizeof(__pyx_k_PollerCompletionQueue__handle_ev), 0, 0, 1, 1},
+    {&__pyx_n_s_PollerCompletionQueue__poll_wrap, __pyx_k_PollerCompletionQueue__poll_wrap, sizeof(__pyx_k_PollerCompletionQueue__poll_wrap), 0, 0, 1, 1},
+    {&__pyx_n_s_PollerCompletionQueue_bind_loop, __pyx_k_PollerCompletionQueue_bind_loop, sizeof(__pyx_k_PollerCompletionQueue_bind_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_PropagationConstants, __pyx_k_PropagationConstants, sizeof(__pyx_k_PropagationConstants), 0, 0, 1, 1},
+    {&__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj, __pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj, sizeof(__pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj), 0, 0, 1, 1},
+    {&__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_2, __pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj_2, sizeof(__pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj_2), 0, 0, 1, 1},
+    {&__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_obj_3, __pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj_3, sizeof(__pyx_k_Pyx_CFunc_7_cython_6cygrpc_obj_3), 0, 0, 1, 1},
+    {&__pyx_n_s_Pyx_CFunc_7_cython_6cygrpc_voi, __pyx_k_Pyx_CFunc_7_cython_6cygrpc_voi, sizeof(__pyx_k_Pyx_CFunc_7_cython_6cygrpc_voi), 0, 0, 1, 1},
+    {&__pyx_n_s_Queue, __pyx_k_Queue, sizeof(__pyx_k_Queue), 0, 0, 1, 1},
+    {&__pyx_n_s_RLock, __pyx_k_RLock, sizeof(__pyx_k_RLock), 0, 0, 1, 1},
+    {&__pyx_n_s_RPCState, __pyx_k_RPCState, sizeof(__pyx_k_RPCState), 0, 0, 1, 1},
+    {&__pyx_n_s_RPCState___reduce_cython, __pyx_k_RPCState___reduce_cython, sizeof(__pyx_k_RPCState___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_RPCState___setstate_cython, __pyx_k_RPCState___setstate_cython, sizeof(__pyx_k_RPCState___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_kp_s_RPC_already_finished, __pyx_k_RPC_already_finished, sizeof(__pyx_k_RPC_already_finished), 0, 0, 1, 0},
+    {&__pyx_kp_s_RPC_cancelled_for_servicer_metho, __pyx_k_RPC_cancelled_for_servicer_metho, sizeof(__pyx_k_RPC_cancelled_for_servicer_metho), 0, 0, 1, 0},
+    {&__pyx_kp_s_RPC_cancelled_for_unknown_reason, __pyx_k_RPC_cancelled_for_unknown_reason, sizeof(__pyx_k_RPC_cancelled_for_unknown_reason), 0, 0, 1, 0},
+    {&__pyx_kp_s_Raised_if_the_server_is_stopped, __pyx_k_Raised_if_the_server_is_stopped, sizeof(__pyx_k_Raised_if_the_server_is_stopped), 0, 0, 1, 0},
+    {&__pyx_kp_s_Raised_upon_unexpected_errors_in, __pyx_k_Raised_upon_unexpected_errors_in, sizeof(__pyx_k_Raised_upon_unexpected_errors_in), 0, 0, 1, 0},
+    {&__pyx_kp_s_Raised_when_calling_abort_in_ser, __pyx_k_Raised_when_calling_abort_in_ser, sizeof(__pyx_k_Raised_when_calling_abort_in_ser), 0, 0, 1, 0},
+    {&__pyx_kp_s_Raised_when_execute_batch_return, __pyx_k_Raised_when_execute_batch_return, sizeof(__pyx_k_Raised_when_execute_batch_return), 0, 0, 1, 0},
+    {&__pyx_kp_s_Raised_when_the_usage_of_API_by, __pyx_k_Raised_when_the_usage_of_API_by, sizeof(__pyx_k_Raised_when_the_usage_of_API_by), 0, 0, 1, 0},
+    {&__pyx_n_s_ReceiveCloseOnServerOperation, __pyx_k_ReceiveCloseOnServerOperation, sizeof(__pyx_k_ReceiveCloseOnServerOperation), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveCloseOnServerOperation_2, __pyx_k_ReceiveCloseOnServerOperation_2, sizeof(__pyx_k_ReceiveCloseOnServerOperation_2), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveCloseOnServerOperation_3, __pyx_k_ReceiveCloseOnServerOperation_3, sizeof(__pyx_k_ReceiveCloseOnServerOperation_3), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveCloseOnServerOperation_ca, __pyx_k_ReceiveCloseOnServerOperation_ca, sizeof(__pyx_k_ReceiveCloseOnServerOperation_ca), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveCloseOnServerOperation_ty, __pyx_k_ReceiveCloseOnServerOperation_ty, sizeof(__pyx_k_ReceiveCloseOnServerOperation_ty), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveInitialMetadataOperation, __pyx_k_ReceiveInitialMetadataOperation, sizeof(__pyx_k_ReceiveInitialMetadataOperation), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveInitialMetadataOperation_2, __pyx_k_ReceiveInitialMetadataOperation_2, sizeof(__pyx_k_ReceiveInitialMetadataOperation_2), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveInitialMetadataOperation_3, __pyx_k_ReceiveInitialMetadataOperation_3, sizeof(__pyx_k_ReceiveInitialMetadataOperation_3), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveInitialMetadataOperation_4, __pyx_k_ReceiveInitialMetadataOperation_4, sizeof(__pyx_k_ReceiveInitialMetadataOperation_4), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveInitialMetadataOperation_5, __pyx_k_ReceiveInitialMetadataOperation_5, sizeof(__pyx_k_ReceiveInitialMetadataOperation_5), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveMessageOperation, __pyx_k_ReceiveMessageOperation, sizeof(__pyx_k_ReceiveMessageOperation), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveMessageOperation___reduce, __pyx_k_ReceiveMessageOperation___reduce, sizeof(__pyx_k_ReceiveMessageOperation___reduce), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveMessageOperation___setsta, __pyx_k_ReceiveMessageOperation___setsta, sizeof(__pyx_k_ReceiveMessageOperation___setsta), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveMessageOperation_message, __pyx_k_ReceiveMessageOperation_message, sizeof(__pyx_k_ReceiveMessageOperation_message), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveMessageOperation_type, __pyx_k_ReceiveMessageOperation_type, sizeof(__pyx_k_ReceiveMessageOperation_type), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveStatusOnClientOperation, __pyx_k_ReceiveStatusOnClientOperation, sizeof(__pyx_k_ReceiveStatusOnClientOperation), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveStatusOnClientOperation_2, __pyx_k_ReceiveStatusOnClientOperation_2, sizeof(__pyx_k_ReceiveStatusOnClientOperation_2), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveStatusOnClientOperation_3, __pyx_k_ReceiveStatusOnClientOperation_3, sizeof(__pyx_k_ReceiveStatusOnClientOperation_3), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveStatusOnClientOperation_c, __pyx_k_ReceiveStatusOnClientOperation_c, sizeof(__pyx_k_ReceiveStatusOnClientOperation_c), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveStatusOnClientOperation_d, __pyx_k_ReceiveStatusOnClientOperation_d, sizeof(__pyx_k_ReceiveStatusOnClientOperation_d), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveStatusOnClientOperation_e, __pyx_k_ReceiveStatusOnClientOperation_e, sizeof(__pyx_k_ReceiveStatusOnClientOperation_e), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveStatusOnClientOperation_t, __pyx_k_ReceiveStatusOnClientOperation_t, sizeof(__pyx_k_ReceiveStatusOnClientOperation_t), 0, 0, 1, 1},
+    {&__pyx_n_s_ReceiveStatusOnClientOperation_t_2, __pyx_k_ReceiveStatusOnClientOperation_t_2, sizeof(__pyx_k_ReceiveStatusOnClientOperation_t_2), 0, 0, 1, 1},
+    {&__pyx_n_s_RequestCallError, __pyx_k_RequestCallError, sizeof(__pyx_k_RequestCallError), 0, 0, 1, 1},
+    {&__pyx_n_s_RequestCallEvent, __pyx_k_RequestCallEvent, sizeof(__pyx_k_RequestCallEvent), 0, 0, 1, 1},
+    {&__pyx_n_s_RequestCallEvent___reduce_cython, __pyx_k_RequestCallEvent___reduce_cython, sizeof(__pyx_k_RequestCallEvent___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_RequestCallEvent___setstate_cyth, __pyx_k_RequestCallEvent___setstate_cyth, sizeof(__pyx_k_RequestCallEvent___setstate_cyth), 0, 0, 1, 1},
+    {&__pyx_n_s_RequestCallTag, __pyx_k_RequestCallTag, sizeof(__pyx_k_RequestCallTag), 0, 0, 1, 1},
+    {&__pyx_n_s_RequestCallTag___reduce_cython, __pyx_k_RequestCallTag___reduce_cython, sizeof(__pyx_k_RequestCallTag___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_RequestCallTag___setstate_cytho, __pyx_k_RequestCallTag___setstate_cytho, sizeof(__pyx_k_RequestCallTag___setstate_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1},
+    {&__pyx_n_s_SERVICES_TO_EXCLUDE, __pyx_k_SERVICES_TO_EXCLUDE, sizeof(__pyx_k_SERVICES_TO_EXCLUDE), 0, 0, 1, 1},
+    {&__pyx_n_s_SSLChannelCredentials, __pyx_k_SSLChannelCredentials, sizeof(__pyx_k_SSLChannelCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_SSLChannelCredentials___reduce_c, __pyx_k_SSLChannelCredentials___reduce_c, sizeof(__pyx_k_SSLChannelCredentials___reduce_c), 0, 0, 1, 1},
+    {&__pyx_n_s_SSLChannelCredentials___setstate, __pyx_k_SSLChannelCredentials___setstate, sizeof(__pyx_k_SSLChannelCredentials___setstate), 0, 0, 1, 1},
+    {&__pyx_n_s_SSLSessionCacheLRU, __pyx_k_SSLSessionCacheLRU, sizeof(__pyx_k_SSLSessionCacheLRU), 0, 0, 1, 1},
+    {&__pyx_n_s_SSLSessionCacheLRU___reduce_cyth, __pyx_k_SSLSessionCacheLRU___reduce_cyth, sizeof(__pyx_k_SSLSessionCacheLRU___reduce_cyth), 0, 0, 1, 1},
+    {&__pyx_n_s_SSLSessionCacheLRU___setstate_cy, __pyx_k_SSLSessionCacheLRU___setstate_cy, sizeof(__pyx_k_SSLSessionCacheLRU___setstate_cy), 0, 0, 1, 1},
+    {&__pyx_n_s_SegregatedCall, __pyx_k_SegregatedCall, sizeof(__pyx_k_SegregatedCall), 0, 0, 1, 1},
+    {&__pyx_n_s_SegregatedCall___reduce_cython, __pyx_k_SegregatedCall___reduce_cython, sizeof(__pyx_k_SegregatedCall___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_SegregatedCall___setstate_cython, __pyx_k_SegregatedCall___setstate_cython, sizeof(__pyx_k_SegregatedCall___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_SegregatedCall_cancel, __pyx_k_SegregatedCall_cancel, sizeof(__pyx_k_SegregatedCall_cancel), 0, 0, 1, 1},
+    {&__pyx_n_s_SegregatedCall_next_event, __pyx_k_SegregatedCall_next_event, sizeof(__pyx_k_SegregatedCall_next_event), 0, 0, 1, 1},
+    {&__pyx_n_s_SegregatedCall_operate, __pyx_k_SegregatedCall_operate, sizeof(__pyx_k_SegregatedCall_operate), 0, 0, 1, 1},
+    {&__pyx_n_s_SendCloseFromClientOperation, __pyx_k_SendCloseFromClientOperation, sizeof(__pyx_k_SendCloseFromClientOperation), 0, 0, 1, 1},
+    {&__pyx_n_s_SendCloseFromClientOperation___r, __pyx_k_SendCloseFromClientOperation___r, sizeof(__pyx_k_SendCloseFromClientOperation___r), 0, 0, 1, 1},
+    {&__pyx_n_s_SendCloseFromClientOperation___s, __pyx_k_SendCloseFromClientOperation___s, sizeof(__pyx_k_SendCloseFromClientOperation___s), 0, 0, 1, 1},
+    {&__pyx_n_s_SendCloseFromClientOperation_typ, __pyx_k_SendCloseFromClientOperation_typ, sizeof(__pyx_k_SendCloseFromClientOperation_typ), 0, 0, 1, 1},
+    {&__pyx_n_s_SendInitialMetadataOperation, __pyx_k_SendInitialMetadataOperation, sizeof(__pyx_k_SendInitialMetadataOperation), 0, 0, 1, 1},
+    {&__pyx_n_s_SendInitialMetadataOperation___r, __pyx_k_SendInitialMetadataOperation___r, sizeof(__pyx_k_SendInitialMetadataOperation___r), 0, 0, 1, 1},
+    {&__pyx_n_s_SendInitialMetadataOperation___s, __pyx_k_SendInitialMetadataOperation___s, sizeof(__pyx_k_SendInitialMetadataOperation___s), 0, 0, 1, 1},
+    {&__pyx_n_s_SendInitialMetadataOperation_typ, __pyx_k_SendInitialMetadataOperation_typ, sizeof(__pyx_k_SendInitialMetadataOperation_typ), 0, 0, 1, 1},
+    {&__pyx_n_s_SendMessageOperation, __pyx_k_SendMessageOperation, sizeof(__pyx_k_SendMessageOperation), 0, 0, 1, 1},
+    {&__pyx_n_s_SendMessageOperation___reduce_cy, __pyx_k_SendMessageOperation___reduce_cy, sizeof(__pyx_k_SendMessageOperation___reduce_cy), 0, 0, 1, 1},
+    {&__pyx_n_s_SendMessageOperation___setstate, __pyx_k_SendMessageOperation___setstate, sizeof(__pyx_k_SendMessageOperation___setstate), 0, 0, 1, 1},
+    {&__pyx_n_s_SendMessageOperation_type, __pyx_k_SendMessageOperation_type, sizeof(__pyx_k_SendMessageOperation_type), 0, 0, 1, 1},
+    {&__pyx_n_s_SendStatusFromServerOperation, __pyx_k_SendStatusFromServerOperation, sizeof(__pyx_k_SendStatusFromServerOperation), 0, 0, 1, 1},
+    {&__pyx_n_s_SendStatusFromServerOperation_2, __pyx_k_SendStatusFromServerOperation_2, sizeof(__pyx_k_SendStatusFromServerOperation_2), 0, 0, 1, 1},
+    {&__pyx_n_s_SendStatusFromServerOperation_3, __pyx_k_SendStatusFromServerOperation_3, sizeof(__pyx_k_SendStatusFromServerOperation_3), 0, 0, 1, 1},
+    {&__pyx_n_s_SendStatusFromServerOperation_ty, __pyx_k_SendStatusFromServerOperation_ty, sizeof(__pyx_k_SendStatusFromServerOperation_ty), 0, 0, 1, 1},
+    {&__pyx_kp_s_Send_initial_metadata_failed_alr, __pyx_k_Send_initial_metadata_failed_alr, sizeof(__pyx_k_Send_initial_metadata_failed_alr), 0, 0, 1, 0},
+    {&__pyx_n_s_Server, __pyx_k_Server, sizeof(__pyx_k_Server), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerCertificateConfig, __pyx_k_ServerCertificateConfig, sizeof(__pyx_k_ServerCertificateConfig), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerCertificateConfig___reduce, __pyx_k_ServerCertificateConfig___reduce, sizeof(__pyx_k_ServerCertificateConfig___reduce), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerCertificateConfig___setsta, __pyx_k_ServerCertificateConfig___setsta, sizeof(__pyx_k_ServerCertificateConfig___setsta), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerCertificateConfiguration, __pyx_k_ServerCertificateConfiguration, sizeof(__pyx_k_ServerCertificateConfiguration), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerCredentials, __pyx_k_ServerCredentials, sizeof(__pyx_k_ServerCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerCredentials___reduce_cytho, __pyx_k_ServerCredentials___reduce_cytho, sizeof(__pyx_k_ServerCredentials___reduce_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerCredentials___setstate_cyt, __pyx_k_ServerCredentials___setstate_cyt, sizeof(__pyx_k_ServerCredentials___setstate_cyt), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerShutdownEvent, __pyx_k_ServerShutdownEvent, sizeof(__pyx_k_ServerShutdownEvent), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerShutdownEvent___reduce_cyt, __pyx_k_ServerShutdownEvent___reduce_cyt, sizeof(__pyx_k_ServerShutdownEvent___reduce_cyt), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerShutdownEvent___setstate_c, __pyx_k_ServerShutdownEvent___setstate_c, sizeof(__pyx_k_ServerShutdownEvent___setstate_c), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerShutdownTag, __pyx_k_ServerShutdownTag, sizeof(__pyx_k_ServerShutdownTag), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerShutdownTag___reduce_cyth, __pyx_k_ServerShutdownTag___reduce_cyth, sizeof(__pyx_k_ServerShutdownTag___reduce_cyth), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerShutdownTag___setstate_cy, __pyx_k_ServerShutdownTag___setstate_cy, sizeof(__pyx_k_ServerShutdownTag___setstate_cy), 0, 0, 1, 1},
+    {&__pyx_n_s_ServerStoppedError, __pyx_k_ServerStoppedError, sizeof(__pyx_k_ServerStoppedError), 0, 0, 1, 1},
+    {&__pyx_n_s_Server___reduce_cython, __pyx_k_Server___reduce_cython, sizeof(__pyx_k_Server___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Server___setstate_cython, __pyx_k_Server___setstate_cython, sizeof(__pyx_k_Server___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Server_add_http2_port, __pyx_k_Server_add_http2_port, sizeof(__pyx_k_Server_add_http2_port), 0, 0, 1, 1},
+    {&__pyx_kp_s_Server_already_stopped, __pyx_k_Server_already_stopped, sizeof(__pyx_k_Server_already_stopped), 0, 0, 1, 0},
+    {&__pyx_n_s_Server_cancel_all_calls, __pyx_k_Server_cancel_all_calls, sizeof(__pyx_k_Server_cancel_all_calls), 0, 0, 1, 1},
+    {&__pyx_n_s_Server_destroy, __pyx_k_Server_destroy, sizeof(__pyx_k_Server_destroy), 0, 0, 1, 1},
+    {&__pyx_kp_s_Server_not_in_ready_state, __pyx_k_Server_not_in_ready_state, sizeof(__pyx_k_Server_not_in_ready_state), 0, 0, 1, 0},
+    {&__pyx_n_s_Server_register_completion_queue, __pyx_k_Server_register_completion_queue, sizeof(__pyx_k_Server_register_completion_queue), 0, 0, 1, 1},
+    {&__pyx_n_s_Server_request_call, __pyx_k_Server_request_call, sizeof(__pyx_k_Server_request_call), 0, 0, 1, 1},
+    {&__pyx_n_s_Server_shutdown, __pyx_k_Server_shutdown, sizeof(__pyx_k_Server_shutdown), 0, 0, 1, 1},
+    {&__pyx_kp_s_Server_shutdown_failed_no_comple, __pyx_k_Server_shutdown_failed_no_comple, sizeof(__pyx_k_Server_shutdown_failed_no_comple), 0, 0, 1, 0},
+    {&__pyx_n_s_Server_start, __pyx_k_Server_start, sizeof(__pyx_k_Server_start), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext, __pyx_k_ServicerContext, sizeof(__pyx_k_ServicerContext), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext___reduce_cython, __pyx_k_ServicerContext___reduce_cython, sizeof(__pyx_k_ServicerContext___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext___setstate_cyth, __pyx_k_ServicerContext___setstate_cyth, sizeof(__pyx_k_ServicerContext___setstate_cyth), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_abort, __pyx_k_ServicerContext_abort, sizeof(__pyx_k_ServicerContext_abort), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_abort_with_stat, __pyx_k_ServicerContext_abort_with_stat, sizeof(__pyx_k_ServicerContext_abort_with_stat), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_add_done_callba, __pyx_k_ServicerContext_add_done_callba, sizeof(__pyx_k_ServicerContext_add_done_callba), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_auth_context, __pyx_k_ServicerContext_auth_context, sizeof(__pyx_k_ServicerContext_auth_context), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_cancelled, __pyx_k_ServicerContext_cancelled, sizeof(__pyx_k_ServicerContext_cancelled), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_code, __pyx_k_ServicerContext_code, sizeof(__pyx_k_ServicerContext_code), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_details, __pyx_k_ServicerContext_details, sizeof(__pyx_k_ServicerContext_details), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_disable_next_me, __pyx_k_ServicerContext_disable_next_me, sizeof(__pyx_k_ServicerContext_disable_next_me), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_done, __pyx_k_ServicerContext_done, sizeof(__pyx_k_ServicerContext_done), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_invocation_meta, __pyx_k_ServicerContext_invocation_meta, sizeof(__pyx_k_ServicerContext_invocation_meta), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_peer, __pyx_k_ServicerContext_peer, sizeof(__pyx_k_ServicerContext_peer), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_peer_identities, __pyx_k_ServicerContext_peer_identities, sizeof(__pyx_k_ServicerContext_peer_identities), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_peer_identity_k, __pyx_k_ServicerContext_peer_identity_k, sizeof(__pyx_k_ServicerContext_peer_identity_k), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_read, __pyx_k_ServicerContext_read, sizeof(__pyx_k_ServicerContext_read), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_send_initial_me, __pyx_k_ServicerContext_send_initial_me, sizeof(__pyx_k_ServicerContext_send_initial_me), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_set_code, __pyx_k_ServicerContext_set_code, sizeof(__pyx_k_ServicerContext_set_code), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_set_compression, __pyx_k_ServicerContext_set_compression, sizeof(__pyx_k_ServicerContext_set_compression), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_set_details, __pyx_k_ServicerContext_set_details, sizeof(__pyx_k_ServicerContext_set_details), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_set_trailing_me, __pyx_k_ServicerContext_set_trailing_me, sizeof(__pyx_k_ServicerContext_set_trailing_me), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_time_remaining, __pyx_k_ServicerContext_time_remaining, sizeof(__pyx_k_ServicerContext_time_remaining), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_trailing_metada, __pyx_k_ServicerContext_trailing_metada, sizeof(__pyx_k_ServicerContext_trailing_metada), 0, 0, 1, 1},
+    {&__pyx_n_s_ServicerContext_write, __pyx_k_ServicerContext_write, sizeof(__pyx_k_ServicerContext_write), 0, 0, 1, 1},
+    {&__pyx_n_s_SslPemKeyCertPair, __pyx_k_SslPemKeyCertPair, sizeof(__pyx_k_SslPemKeyCertPair), 0, 0, 1, 1},
+    {&__pyx_n_s_SslPemKeyCertPair___reduce_cytho, __pyx_k_SslPemKeyCertPair___reduce_cytho, sizeof(__pyx_k_SslPemKeyCertPair___reduce_cytho), 0, 0, 1, 1},
+    {&__pyx_n_s_SslPemKeyCertPair___setstate_cyt, __pyx_k_SslPemKeyCertPair___setstate_cyt, sizeof(__pyx_k_SslPemKeyCertPair___setstate_cyt), 0, 0, 1, 1},
+    {&__pyx_n_s_StatusCode, __pyx_k_StatusCode, sizeof(__pyx_k_StatusCode), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext, __pyx_k_SyncServicerContext, sizeof(__pyx_k_SyncServicerContext), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext___reduce_cy, __pyx_k_SyncServicerContext___reduce_cy, sizeof(__pyx_k_SyncServicerContext___reduce_cy), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext___setstate, __pyx_k_SyncServicerContext___setstate, sizeof(__pyx_k_SyncServicerContext___setstate), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_abort, __pyx_k_SyncServicerContext_abort, sizeof(__pyx_k_SyncServicerContext_abort), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_add_callbac, __pyx_k_SyncServicerContext_add_callbac, sizeof(__pyx_k_SyncServicerContext_add_callbac), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_auth_contex, __pyx_k_SyncServicerContext_auth_contex, sizeof(__pyx_k_SyncServicerContext_auth_contex), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_disable_nex, __pyx_k_SyncServicerContext_disable_nex, sizeof(__pyx_k_SyncServicerContext_disable_nex), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_invocation, __pyx_k_SyncServicerContext_invocation, sizeof(__pyx_k_SyncServicerContext_invocation), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_peer, __pyx_k_SyncServicerContext_peer, sizeof(__pyx_k_SyncServicerContext_peer), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_peer_identi, __pyx_k_SyncServicerContext_peer_identi, sizeof(__pyx_k_SyncServicerContext_peer_identi), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_peer_identi_2, __pyx_k_SyncServicerContext_peer_identi_2, sizeof(__pyx_k_SyncServicerContext_peer_identi_2), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_send_initia, __pyx_k_SyncServicerContext_send_initia, sizeof(__pyx_k_SyncServicerContext_send_initia), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_set_code, __pyx_k_SyncServicerContext_set_code, sizeof(__pyx_k_SyncServicerContext_set_code), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_set_compres, __pyx_k_SyncServicerContext_set_compres, sizeof(__pyx_k_SyncServicerContext_set_compres), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_set_details, __pyx_k_SyncServicerContext_set_details, sizeof(__pyx_k_SyncServicerContext_set_details), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_set_trailin, __pyx_k_SyncServicerContext_set_trailin, sizeof(__pyx_k_SyncServicerContext_set_trailin), 0, 0, 1, 1},
+    {&__pyx_n_s_SyncServicerContext_time_remain, __pyx_k_SyncServicerContext_time_remain, sizeof(__pyx_k_SyncServicerContext_time_remain), 0, 0, 1, 1},
+    {&__pyx_n_s_SystemExit, __pyx_k_SystemExit, sizeof(__pyx_k_SystemExit), 0, 0, 1, 1},
+    {&__pyx_n_s_TRUE, __pyx_k_TRUE, sizeof(__pyx_k_TRUE), 0, 0, 1, 1},
+    {&__pyx_n_s_TRUE_VALUES, __pyx_k_TRUE_VALUES, sizeof(__pyx_k_TRUE_VALUES), 0, 0, 1, 1},
+    {&__pyx_n_s_TYPE_METADATA_STRING, __pyx_k_TYPE_METADATA_STRING, sizeof(__pyx_k_TYPE_METADATA_STRING), 0, 0, 1, 1},
+    {&__pyx_n_s_Tag, __pyx_k_Tag, sizeof(__pyx_k_Tag), 0, 0, 1, 1},
+    {&__pyx_n_s_Tag___reduce_cython, __pyx_k_Tag___reduce_cython, sizeof(__pyx_k_Tag___reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_Tag___setstate_cython, __pyx_k_Tag___setstate_cython, sizeof(__pyx_k_Tag___setstate_cython), 0, 0, 1, 1},
+    {&__pyx_kp_s_The_base_class_for_exceptions_ge, __pyx_k_The_base_class_for_exceptions_ge, sizeof(__pyx_k_The_base_class_for_exceptions_ge), 0, 0, 1, 0},
+    {&__pyx_n_s_Thread, __pyx_k_Thread, sizeof(__pyx_k_Thread), 0, 0, 1, 1},
+    {&__pyx_kp_s_Timed_out, __pyx_k_Timed_out, sizeof(__pyx_k_Timed_out), 0, 0, 1, 0},
+    {&__pyx_n_s_TimeoutError, __pyx_k_TimeoutError, sizeof(__pyx_k_TimeoutError), 0, 0, 1, 1},
+    {&__pyx_n_s_True, __pyx_k_True, sizeof(__pyx_k_True), 0, 0, 1, 1},
+    {&__pyx_kp_s_Tuple_Tuple_str_Union_str_bytes, __pyx_k_Tuple_Tuple_str_Union_str_bytes, sizeof(__pyx_k_Tuple_Tuple_str_Union_str_bytes), 0, 0, 1, 0},
+    {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1},
+    {&__pyx_n_s_UNKNOWN_CANCELLATION_DETAILS, __pyx_k_UNKNOWN_CANCELLATION_DETAILS, sizeof(__pyx_k_UNKNOWN_CANCELLATION_DETAILS), 0, 0, 1, 1},
+    {&__pyx_kp_s_Unexpected_s_raised_by_servicer, __pyx_k_Unexpected_s_raised_by_servicer, sizeof(__pyx_k_Unexpected_s_raised_by_servicer), 0, 0, 1, 0},
+    {&__pyx_kp_s_Unexpected_s_s, __pyx_k_Unexpected_s_s, sizeof(__pyx_k_Unexpected_s_s), 0, 0, 1, 0},
+    {&__pyx_n_s_UnicodeDecodeError, __pyx_k_UnicodeDecodeError, sizeof(__pyx_k_UnicodeDecodeError), 0, 0, 1, 1},
+    {&__pyx_n_s_Unknown, __pyx_k_Unknown, sizeof(__pyx_k_Unknown), 0, 0, 1, 1},
+    {&__pyx_kp_s_Unsupported_engine_type_s, __pyx_k_Unsupported_engine_type_s, sizeof(__pyx_k_Unsupported_engine_type_s), 0, 0, 1, 0},
+    {&__pyx_n_s_UsageError, __pyx_k_UsageError, sizeof(__pyx_k_UsageError), 0, 0, 1, 1},
+    {&__pyx_kp_s_Using_s_as_I_O_engine, __pyx_k_Using_s_as_I_O_engine, sizeof(__pyx_k_Using_s_as_I_O_engine), 0, 0, 1, 0},
+    {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
+    {&__pyx_n_s_WatchConnectivityFailed, __pyx_k_WatchConnectivityFailed, sizeof(__pyx_k_WatchConnectivityFailed), 0, 0, 1, 1},
+    {&__pyx_n_s_WriteFlag, __pyx_k_WriteFlag, sizeof(__pyx_k_WriteFlag), 0, 0, 1, 1},
+    {&__pyx_n_s_XDSChannelCredentials, __pyx_k_XDSChannelCredentials, sizeof(__pyx_k_XDSChannelCredentials), 0, 0, 1, 1},
+    {&__pyx_n_s_XDSChannelCredentials___reduce_c, __pyx_k_XDSChannelCredentials___reduce_c, sizeof(__pyx_k_XDSChannelCredentials___reduce_c), 0, 0, 1, 1},
+    {&__pyx_n_s_XDSChannelCredentials___setstate, __pyx_k_XDSChannelCredentials___setstate, sizeof(__pyx_k_XDSChannelCredentials___setstate), 0, 0, 1, 1},
+    {&__pyx_n_s_YES, __pyx_k_YES, sizeof(__pyx_k_YES), 0, 0, 1, 1},
+    {&__pyx_n_s_Yes, __pyx_k_Yes, sizeof(__pyx_k_Yes), 0, 0, 1, 1},
+    {&__pyx_n_s__107, __pyx_k__107, sizeof(__pyx_k__107), 0, 0, 1, 1},
+    {&__pyx_n_s__38, __pyx_k__38, sizeof(__pyx_k__38), 0, 0, 1, 1},
+    {&__pyx_kp_u__49, __pyx_k__49, sizeof(__pyx_k__49), 0, 1, 0, 0},
+    {&__pyx_n_s__57, __pyx_k__57, sizeof(__pyx_k__57), 0, 0, 1, 1},
+    {&__pyx_kp_u__58, __pyx_k__58, sizeof(__pyx_k__58), 0, 1, 0, 0},
+    {&__pyx_kp_u__69, __pyx_k__69, sizeof(__pyx_k__69), 0, 1, 0, 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__70, __pyx_k__70, sizeof(__pyx_k__70), 0, 1, 0, 0},
+    {&__pyx_kp_u__71, __pyx_k__71, sizeof(__pyx_k__71), 0, 1, 0, 0},
+    {&__pyx_n_s_abort, __pyx_k_abort, sizeof(__pyx_k_abort), 0, 0, 1, 1},
+    {&__pyx_n_s_abort_with_status, __pyx_k_abort_with_status, sizeof(__pyx_k_abort_with_status), 0, 0, 1, 1},
+    {&__pyx_n_s_aborted, __pyx_k_aborted, sizeof(__pyx_k_aborted), 0, 0, 1, 1},
+    {&__pyx_n_s_active_thread_count, __pyx_k_active_thread_count, sizeof(__pyx_k_active_thread_count), 0, 0, 1, 1},
+    {&__pyx_n_s_actual_code, __pyx_k_actual_code, sizeof(__pyx_k_actual_code), 0, 0, 1, 1},
+    {&__pyx_n_s_add, __pyx_k_add, sizeof(__pyx_k_add), 0, 0, 1, 1},
+    {&__pyx_n_s_add_callback, __pyx_k_add_callback, sizeof(__pyx_k_add_callback), 0, 0, 1, 1},
+    {&__pyx_n_s_add_callback_handler_locals_han, __pyx_k_add_callback_handler_locals_han, sizeof(__pyx_k_add_callback_handler_locals_han), 0, 0, 1, 1},
+    {&__pyx_n_s_add_done_callback, __pyx_k_add_done_callback, sizeof(__pyx_k_add_done_callback), 0, 0, 1, 1},
+    {&__pyx_n_s_add_generic_rpc_handlers, __pyx_k_add_generic_rpc_handlers, sizeof(__pyx_k_add_generic_rpc_handlers), 0, 0, 1, 1},
+    {&__pyx_n_s_add_http2_port, __pyx_k_add_http2_port, sizeof(__pyx_k_add_http2_port), 0, 0, 1, 1},
+    {&__pyx_n_s_add_insecure_port, __pyx_k_add_insecure_port, sizeof(__pyx_k_add_insecure_port), 0, 0, 1, 1},
+    {&__pyx_n_s_add_reader, __pyx_k_add_reader, sizeof(__pyx_k_add_reader), 0, 0, 1, 1},
+    {&__pyx_n_s_add_secure_port, __pyx_k_add_secure_port, sizeof(__pyx_k_add_secure_port), 0, 0, 1, 1},
+    {&__pyx_n_s_address, __pyx_k_address, sizeof(__pyx_k_address), 0, 0, 1, 1},
+    {&__pyx_n_s_address_c_string, __pyx_k_address_c_string, sizeof(__pyx_k_address_c_string), 0, 0, 1, 1},
+    {&__pyx_n_s_aenter, __pyx_k_aenter, sizeof(__pyx_k_aenter), 0, 0, 1, 1},
+    {&__pyx_n_s_aexit, __pyx_k_aexit, sizeof(__pyx_k_aexit), 0, 0, 1, 1},
+    {&__pyx_n_s_after_in_child, __pyx_k_after_in_child, sizeof(__pyx_k_after_in_child), 0, 0, 1, 1},
+    {&__pyx_n_s_after_in_parent, __pyx_k_after_in_parent, sizeof(__pyx_k_after_in_parent), 0, 0, 1, 1},
+    {&__pyx_n_s_agen, __pyx_k_agen, sizeof(__pyx_k_agen), 0, 0, 1, 1},
+    {&__pyx_n_s_aiter, __pyx_k_aiter, sizeof(__pyx_k_aiter), 0, 0, 1, 1},
+    {&__pyx_n_s_algorithm, __pyx_k_algorithm, sizeof(__pyx_k_algorithm), 0, 0, 1, 1},
+    {&__pyx_n_s_already_accepted, __pyx_k_already_accepted, sizeof(__pyx_k_already_accepted), 0, 0, 1, 1},
+    {&__pyx_n_s_already_exists, __pyx_k_already_exists, sizeof(__pyx_k_already_exists), 0, 0, 1, 1},
+    {&__pyx_n_s_already_finished, __pyx_k_already_finished, sizeof(__pyx_k_already_finished), 0, 0, 1, 1},
+    {&__pyx_n_s_already_invoked, __pyx_k_already_invoked, sizeof(__pyx_k_already_invoked), 0, 0, 1, 1},
+    {&__pyx_n_s_anext, __pyx_k_anext, sizeof(__pyx_k_anext), 0, 0, 1, 1},
+    {&__pyx_n_s_append, __pyx_k_append, sizeof(__pyx_k_append), 0, 0, 1, 1},
+    {&__pyx_n_s_apply, __pyx_k_apply, sizeof(__pyx_k_apply), 0, 0, 1, 1},
+    {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1},
+    {&__pyx_n_s_arguments, __pyx_k_arguments, sizeof(__pyx_k_arguments), 0, 0, 1, 1},
+    {&__pyx_n_s_ascii, __pyx_k_ascii, sizeof(__pyx_k_ascii), 0, 0, 1, 1},
+    {&__pyx_n_s_async_callback_func, __pyx_k_async_callback_func, sizeof(__pyx_k_async_callback_func), 0, 0, 1, 1},
+    {&__pyx_n_s_async_generator_to_generator, __pyx_k_async_generator_to_generator, sizeof(__pyx_k_async_generator_to_generator), 0, 0, 1, 1},
+    {&__pyx_n_s_async_message_receiver, __pyx_k_async_message_receiver, sizeof(__pyx_k_async_message_receiver), 0, 0, 1, 1},
+    {&__pyx_n_s_async_response_generator, __pyx_k_async_response_generator, sizeof(__pyx_k_async_response_generator), 0, 0, 1, 1},
+    {&__pyx_n_s_asyncio, __pyx_k_asyncio, sizeof(__pyx_k_asyncio), 0, 0, 1, 1},
+    {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1},
+    {&__pyx_n_s_asyncio_tasks, __pyx_k_asyncio_tasks, sizeof(__pyx_k_asyncio_tasks), 0, 0, 1, 1},
+    {&__pyx_n_s_atexit, __pyx_k_atexit, sizeof(__pyx_k_atexit), 0, 0, 1, 1},
+    {&__pyx_n_s_auth_context, __pyx_k_auth_context, sizeof(__pyx_k_auth_context), 0, 0, 1, 1},
+    {&__pyx_n_s_await, __pyx_k_await, sizeof(__pyx_k_await), 0, 0, 1, 1},
+    {&__pyx_n_s_await_zero_threads, __pyx_k_await_zero_threads, sizeof(__pyx_k_await_zero_threads), 0, 0, 1, 1},
+    {&__pyx_n_s_backup_queue, __pyx_k_backup_queue, sizeof(__pyx_k_backup_queue), 0, 0, 1, 1},
+    {&__pyx_n_s_batch_error, __pyx_k_batch_error, sizeof(__pyx_k_batch_error), 0, 0, 1, 1},
+    {&__pyx_n_s_batch_operation_tag, __pyx_k_batch_operation_tag, sizeof(__pyx_k_batch_operation_tag), 0, 0, 1, 1},
+    {&__pyx_n_s_batch_operations, __pyx_k_batch_operations, sizeof(__pyx_k_batch_operations), 0, 0, 1, 1},
+    {&__pyx_n_s_before, __pyx_k_before, sizeof(__pyx_k_before), 0, 0, 1, 1},
+    {&__pyx_kp_b_bin, __pyx_k_bin, sizeof(__pyx_k_bin), 0, 0, 0, 0},
+    {&__pyx_n_s_bind_loop, __pyx_k_bind_loop, sizeof(__pyx_k_bind_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_block_if_fork_in_progress, __pyx_k_block_if_fork_in_progress, sizeof(__pyx_k_block_if_fork_in_progress), 0, 0, 1, 1},
+    {&__pyx_n_s_bool, __pyx_k_bool, sizeof(__pyx_k_bool), 0, 0, 1, 1},
+    {&__pyx_n_s_buffer_hint, __pyx_k_buffer_hint, sizeof(__pyx_k_buffer_hint), 0, 0, 1, 1},
+    {&__pyx_n_s_build_census_context, __pyx_k_build_census_context, sizeof(__pyx_k_build_census_context), 0, 0, 1, 1},
+    {&__pyx_n_s_bytes_ctx, __pyx_k_bytes_ctx, sizeof(__pyx_k_bytes_ctx), 0, 0, 1, 1},
+    {&__pyx_n_s_c_call_credentials, __pyx_k_c_call_credentials, sizeof(__pyx_k_c_call_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_c_cert_config, __pyx_k_c_cert_config, sizeof(__pyx_k_c_cert_config), 0, 0, 1, 1},
+    {&__pyx_n_s_c_deadline, __pyx_k_c_deadline, sizeof(__pyx_k_c_deadline), 0, 0, 1, 1},
+    {&__pyx_n_s_c_details, __pyx_k_c_details, sizeof(__pyx_k_c_details), 0, 0, 1, 1},
+    {&__pyx_n_s_c_error_details, __pyx_k_c_error_details, sizeof(__pyx_k_c_error_details), 0, 0, 1, 1},
+    {&__pyx_n_s_c_event, __pyx_k_c_event, sizeof(__pyx_k_c_event), 0, 0, 1, 1},
+    {&__pyx_n_s_c_key, __pyx_k_c_key, sizeof(__pyx_k_c_key), 0, 0, 1, 1},
+    {&__pyx_n_s_c_options, __pyx_k_c_options, sizeof(__pyx_k_c_options), 0, 0, 1, 1},
+    {&__pyx_n_s_c_peer, __pyx_k_c_peer, sizeof(__pyx_k_c_peer), 0, 0, 1, 1},
+    {&__pyx_n_s_c_pem_root_certs, __pyx_k_c_pem_root_certs, sizeof(__pyx_k_c_pem_root_certs), 0, 0, 1, 1},
+    {&__pyx_n_s_c_returned_str, __pyx_k_c_returned_str, sizeof(__pyx_k_c_returned_str), 0, 0, 1, 1},
+    {&__pyx_n_s_c_target, __pyx_k_c_target, sizeof(__pyx_k_c_target), 0, 0, 1, 1},
+    {&__pyx_n_s_call, __pyx_k_call, sizeof(__pyx_k_call), 0, 0, 1, 1},
+    {&__pyx_n_s_call_credentials, __pyx_k_call_credentials, sizeof(__pyx_k_call_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_call_credentialses, __pyx_k_call_credentialses, sizeof(__pyx_k_call_credentialses), 0, 0, 1, 1},
+    {&__pyx_n_s_call_creds, __pyx_k_call_creds, sizeof(__pyx_k_call_creds), 0, 0, 1, 1},
+    {&__pyx_n_s_call_details, __pyx_k_call_details, sizeof(__pyx_k_call_details), 0, 0, 1, 1},
+    {&__pyx_n_s_call_error, __pyx_k_call_error, sizeof(__pyx_k_call_error), 0, 0, 1, 1},
+    {&__pyx_n_s_call_handle, __pyx_k_call_handle, sizeof(__pyx_k_call_handle), 0, 0, 1, 1},
+    {&__pyx_n_s_call_queue, __pyx_k_call_queue, sizeof(__pyx_k_call_queue), 0, 0, 1, 1},
+    {&__pyx_n_s_call_soon_threadsafe, __pyx_k_call_soon_threadsafe, sizeof(__pyx_k_call_soon_threadsafe), 0, 0, 1, 1},
+    {&__pyx_n_s_call_state, __pyx_k_call_state, sizeof(__pyx_k_call_state), 0, 0, 1, 1},
+    {&__pyx_n_s_callback, __pyx_k_callback, sizeof(__pyx_k_callback), 0, 0, 1, 1},
+    {&__pyx_n_s_callback_func, __pyx_k_callback_func, sizeof(__pyx_k_callback_func), 0, 0, 1, 1},
+    {&__pyx_n_s_callback_wrapper, __pyx_k_callback_wrapper, sizeof(__pyx_k_callback_wrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_cancel, __pyx_k_cancel, sizeof(__pyx_k_cancel), 0, 0, 1, 1},
+    {&__pyx_n_s_cancel_all_calls, __pyx_k_cancel_all_calls, sizeof(__pyx_k_cancel_all_calls), 0, 0, 1, 1},
+    {&__pyx_n_s_cancelled, __pyx_k_cancelled, sizeof(__pyx_k_cancelled), 0, 0, 1, 1},
+    {&__pyx_kp_s_cannot_register_completion_queue, __pyx_k_cannot_register_completion_queue, sizeof(__pyx_k_cannot_register_completion_queue), 0, 0, 1, 0},
+    {&__pyx_n_s_capacity, __pyx_k_capacity, sizeof(__pyx_k_capacity), 0, 0, 1, 1},
+    {&__pyx_n_s_capsule, __pyx_k_capsule, sizeof(__pyx_k_capsule), 0, 0, 1, 1},
+    {&__pyx_n_s_capsule_ptr, __pyx_k_capsule_ptr, sizeof(__pyx_k_capsule_ptr), 0, 0, 1, 1},
+    {&__pyx_n_s_catch_warnings, __pyx_k_catch_warnings, sizeof(__pyx_k_catch_warnings), 0, 0, 1, 1},
+    {&__pyx_n_s_cb, __pyx_k_cb, sizeof(__pyx_k_cb), 0, 0, 1, 1},
+    {&__pyx_n_s_cb_func, __pyx_k_cb_func, sizeof(__pyx_k_cb_func), 0, 0, 1, 1},
+    {&__pyx_n_s_census_ctx, __pyx_k_census_ctx, sizeof(__pyx_k_census_ctx), 0, 0, 1, 1},
+    {&__pyx_n_s_cert_config, __pyx_k_cert_config, sizeof(__pyx_k_cert_config), 0, 0, 1, 1},
+    {&__pyx_n_s_cert_config_fetcher, __pyx_k_cert_config_fetcher, sizeof(__pyx_k_cert_config_fetcher), 0, 0, 1, 1},
+    {&__pyx_kp_s_cert_config_fetcher_must_be_call, __pyx_k_cert_config_fetcher_must_be_call, sizeof(__pyx_k_cert_config_fetcher_must_be_call), 0, 0, 1, 0},
+    {&__pyx_n_s_certificate_chain, __pyx_k_certificate_chain, sizeof(__pyx_k_certificate_chain), 0, 0, 1, 1},
+    {&__pyx_n_s_certificate_configuration, __pyx_k_certificate_configuration, sizeof(__pyx_k_certificate_configuration), 0, 0, 1, 1},
+    {&__pyx_n_s_cfunc_to_py, __pyx_k_cfunc_to_py, sizeof(__pyx_k_cfunc_to_py), 0, 0, 1, 1},
+    {&__pyx_n_s_channel, __pyx_k_channel, sizeof(__pyx_k_channel), 0, 0, 1, 1},
+    {&__pyx_n_s_channel_credentials, __pyx_k_channel_credentials, sizeof(__pyx_k_channel_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_channel_credentials_alts, __pyx_k_channel_credentials_alts, sizeof(__pyx_k_channel_credentials_alts), 0, 0, 1, 1},
+    {&__pyx_n_s_channel_credentials_compute_engi, __pyx_k_channel_credentials_compute_engi, sizeof(__pyx_k_channel_credentials_compute_engi), 0, 0, 1, 1},
+    {&__pyx_n_s_channel_credentials_insecure, __pyx_k_channel_credentials_insecure, sizeof(__pyx_k_channel_credentials_insecure), 0, 0, 1, 1},
+    {&__pyx_n_s_channel_credentials_local, __pyx_k_channel_credentials_local, sizeof(__pyx_k_channel_credentials_local), 0, 0, 1, 1},
+    {&__pyx_n_s_channel_id, __pyx_k_channel_id, sizeof(__pyx_k_channel_id), 0, 0, 1, 1},
+    {&__pyx_n_s_channel_state, __pyx_k_channel_state, sizeof(__pyx_k_channel_state), 0, 0, 1, 1},
+    {&__pyx_n_s_channels, __pyx_k_channels, sizeof(__pyx_k_channels), 0, 0, 1, 1},
+    {&__pyx_n_s_channelz_get_channel, __pyx_k_channelz_get_channel, sizeof(__pyx_k_channelz_get_channel), 0, 0, 1, 1},
+    {&__pyx_n_s_channelz_get_server, __pyx_k_channelz_get_server, sizeof(__pyx_k_channelz_get_server), 0, 0, 1, 1},
+    {&__pyx_n_s_channelz_get_server_sockets, __pyx_k_channelz_get_server_sockets, sizeof(__pyx_k_channelz_get_server_sockets), 0, 0, 1, 1},
+    {&__pyx_n_s_channelz_get_servers, __pyx_k_channelz_get_servers, sizeof(__pyx_k_channelz_get_servers), 0, 0, 1, 1},
+    {&__pyx_n_s_channelz_get_socket, __pyx_k_channelz_get_socket, sizeof(__pyx_k_channelz_get_socket), 0, 0, 1, 1},
+    {&__pyx_n_s_channelz_get_subchannel, __pyx_k_channelz_get_subchannel, sizeof(__pyx_k_channelz_get_subchannel), 0, 0, 1, 1},
+    {&__pyx_n_s_channelz_get_top_channels, __pyx_k_channelz_get_top_channels, sizeof(__pyx_k_channelz_get_top_channels), 0, 0, 1, 1},
+    {&__pyx_n_s_check_before_request_call, __pyx_k_check_before_request_call, sizeof(__pyx_k_check_before_request_call), 0, 0, 1, 1},
+    {&__pyx_n_s_check_connectivity_state, __pyx_k_check_connectivity_state, sizeof(__pyx_k_check_connectivity_state), 0, 0, 1, 1},
+    {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1},
+    {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1},
+    {&__pyx_n_s_clear, __pyx_k_clear, sizeof(__pyx_k_clear), 0, 0, 1, 1},
+    {&__pyx_n_s_clear_server_call_tracer_factory, __pyx_k_clear_server_call_tracer_factory, sizeof(__pyx_k_clear_server_call_tracer_factory), 0, 0, 1, 1},
+    {&__pyx_n_s_client_config_in_slice, __pyx_k_client_config_in_slice, sizeof(__pyx_k_client_config_in_slice), 0, 0, 1, 1},
+    {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1},
+    {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1},
+    {&__pyx_n_s_close_on_fork, __pyx_k_close_on_fork, sizeof(__pyx_k_close_on_fork), 0, 0, 1, 1},
+    {&__pyx_n_s_close_on_fork_2, __pyx_k_close_on_fork_2, sizeof(__pyx_k_close_on_fork_2), 0, 0, 1, 1},
+    {&__pyx_n_s_closed, __pyx_k_closed, sizeof(__pyx_k_closed), 0, 0, 1, 1},
+    {&__pyx_n_s_closing, __pyx_k_closing, sizeof(__pyx_k_closing), 0, 0, 1, 1},
+    {&__pyx_n_s_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 0, 1, 1},
+    {&__pyx_n_s_codecs, __pyx_k_codecs, sizeof(__pyx_k_codecs), 0, 0, 1, 1},
+    {&__pyx_n_s_collections, __pyx_k_collections, sizeof(__pyx_k_collections), 0, 0, 1, 1},
+    {&__pyx_n_s_common, __pyx_k_common, sizeof(__pyx_k_common), 0, 0, 1, 1},
+    {&__pyx_n_s_completion_type, __pyx_k_completion_type, sizeof(__pyx_k_completion_type), 0, 0, 1, 1},
+    {&__pyx_n_s_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 0, 1, 1},
+    {&__pyx_n_s_compression_algorithm_name, __pyx_k_compression_algorithm_name, sizeof(__pyx_k_compression_algorithm_name), 0, 0, 1, 1},
+    {&__pyx_n_s_concurrency_exceeded, __pyx_k_concurrency_exceeded, sizeof(__pyx_k_concurrency_exceeded), 0, 0, 1, 1},
+    {&__pyx_n_s_condition, __pyx_k_condition, sizeof(__pyx_k_condition), 0, 0, 1, 1},
+    {&__pyx_n_s_connecting, __pyx_k_connecting, sizeof(__pyx_k_connecting), 0, 0, 1, 1},
+    {&__pyx_n_s_context, __pyx_k_context, sizeof(__pyx_k_context), 0, 0, 1, 1},
+    {&__pyx_n_s_context_loop, __pyx_k_context_loop, sizeof(__pyx_k_context_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_contextvars, __pyx_k_contextvars, sizeof(__pyx_k_contextvars), 0, 0, 1, 1},
+    {&__pyx_n_s_contextvars_supported, __pyx_k_contextvars_supported, sizeof(__pyx_k_contextvars_supported), 0, 0, 1, 1},
+    {&__pyx_n_s_continuation, __pyx_k_continuation, sizeof(__pyx_k_continuation), 0, 0, 1, 1},
+    {&__pyx_n_s_copy, __pyx_k_copy, sizeof(__pyx_k_copy), 0, 0, 1, 1},
+    {&__pyx_n_s_copy_context, __pyx_k_copy_context, sizeof(__pyx_k_copy_context), 0, 0, 1, 1},
+    {&__pyx_n_s_core_function_name, __pyx_k_core_function_name, sizeof(__pyx_k_core_function_name), 0, 0, 1, 1},
+    {&__pyx_n_s_coro, __pyx_k_coro, sizeof(__pyx_k_coro), 0, 0, 1, 1},
+    {&__pyx_n_s_create_client_call_tracer, __pyx_k_create_client_call_tracer, sizeof(__pyx_k_create_client_call_tracer), 0, 0, 1, 1},
+    {&__pyx_n_s_create_future, __pyx_k_create_future, sizeof(__pyx_k_create_future), 0, 0, 1, 1},
+    {&__pyx_n_s_create_server_call_tracer_factor, __pyx_k_create_server_call_tracer_factor, sizeof(__pyx_k_create_server_call_tracer_factor), 0, 0, 1, 1},
+    {&__pyx_n_s_create_task, __pyx_k_create_task, sizeof(__pyx_k_create_task), 0, 0, 1, 1},
+    {&__pyx_n_s_credentials, __pyx_k_credentials, sizeof(__pyx_k_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_credentials_2, __pyx_k_credentials_2, sizeof(__pyx_k_credentials_2), 0, 0, 1, 1},
+    {&__pyx_kp_s_credentials_roots_pem, __pyx_k_credentials_roots_pem, sizeof(__pyx_k_credentials_roots_pem), 0, 0, 1, 0},
+    {&__pyx_n_s_creds, __pyx_k_creds, sizeof(__pyx_k_creds), 0, 0, 1, 1},
+    {&__pyx_n_s_ctx, __pyx_k_ctx, sizeof(__pyx_k_ctx), 0, 0, 1, 1},
+    {&__pyx_n_s_custom_io_manager, __pyx_k_custom_io_manager, sizeof(__pyx_k_custom_io_manager), 0, 0, 1, 1},
+    {&__pyx_n_s_custom_op_on_c_call, __pyx_k_custom_op_on_c_call, sizeof(__pyx_k_custom_op_on_c_call), 0, 0, 1, 1},
+    {&__pyx_kp_s_cygrpc, __pyx_k_cygrpc, sizeof(__pyx_k_cygrpc), 0, 0, 1, 0},
+    {&__pyx_n_s_cython_call_credentials, __pyx_k_cython_call_credentials, sizeof(__pyx_k_cython_call_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_cython_cygrpc, __pyx_k_cython_cygrpc, sizeof(__pyx_k_cython_cygrpc), 0, 0, 1, 1},
+    {&__pyx_n_s_daemon, __pyx_k_daemon, sizeof(__pyx_k_daemon), 0, 0, 1, 1},
+    {&__pyx_n_s_daemonic, __pyx_k_daemonic, sizeof(__pyx_k_daemonic), 0, 0, 1, 1},
+    {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1},
+    {&__pyx_n_s_data_loss, __pyx_k_data_loss, sizeof(__pyx_k_data_loss), 0, 0, 1, 1},
+    {&__pyx_n_s_deadline, __pyx_k_deadline, sizeof(__pyx_k_deadline), 0, 0, 1, 1},
+    {&__pyx_n_s_deadline_exceeded, __pyx_k_deadline_exceeded, sizeof(__pyx_k_deadline_exceeded), 0, 0, 1, 1},
+    {&__pyx_kp_s_dealloc___called_on_running_se, __pyx_k_dealloc___called_on_running_se, sizeof(__pyx_k_dealloc___called_on_running_se), 0, 0, 1, 0},
+    {&__pyx_n_s_debug, __pyx_k_debug, sizeof(__pyx_k_debug), 0, 0, 1, 1},
+    {&__pyx_n_s_debug_error_string, __pyx_k_debug_error_string, sizeof(__pyx_k_debug_error_string), 0, 0, 1, 1},
+    {&__pyx_n_s_decode, __pyx_k_decode, sizeof(__pyx_k_decode), 0, 0, 1, 1},
+    {&__pyx_n_s_decrease_active_rpcs_count, __pyx_k_decrease_active_rpcs_count, sizeof(__pyx_k_decrease_active_rpcs_count), 0, 0, 1, 1},
+    {&__pyx_n_s_decrease_once_finished, __pyx_k_decrease_once_finished, sizeof(__pyx_k_decrease_once_finished), 0, 0, 1, 1},
+    {&__pyx_n_s_decrement, __pyx_k_decrement, sizeof(__pyx_k_decrement), 0, 0, 1, 1},
+    {&__pyx_n_s_default_authority, __pyx_k_default_authority, sizeof(__pyx_k_default_authority), 0, 0, 1, 1},
+    {&__pyx_n_s_default_vtable, __pyx_k_default_vtable, sizeof(__pyx_k_default_vtable), 0, 0, 1, 1},
+    {&__pyx_n_s_deflate, __pyx_k_deflate, sizeof(__pyx_k_deflate), 0, 0, 1, 1},
+    {&__pyx_n_s_delete_call_tracer, __pyx_k_delete_call_tracer, sizeof(__pyx_k_delete_call_tracer), 0, 0, 1, 1},
+    {&__pyx_n_s_destroy, __pyx_k_destroy, sizeof(__pyx_k_destroy), 0, 0, 1, 1},
+    {&__pyx_n_s_details, __pyx_k_details, sizeof(__pyx_k_details), 0, 0, 1, 1},
+    {&__pyx_n_s_details_bytes, __pyx_k_details_bytes, sizeof(__pyx_k_details_bytes), 0, 0, 1, 1},
+    {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1},
+    {&__pyx_n_s_dict_2, __pyx_k_dict_2, sizeof(__pyx_k_dict_2), 0, 0, 1, 1},
+    {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0},
+    {&__pyx_n_s_disable_algorithm, __pyx_k_disable_algorithm, sizeof(__pyx_k_disable_algorithm), 0, 0, 1, 1},
+    {&__pyx_n_s_disable_next_message_compression, __pyx_k_disable_next_message_compression, sizeof(__pyx_k_disable_next_message_compression), 0, 0, 1, 1},
+    {&__pyx_n_s_discard, __pyx_k_discard, sizeof(__pyx_k_discard), 0, 0, 1, 1},
+    {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1},
+    {&__pyx_n_s_done, __pyx_k_done, sizeof(__pyx_k_done), 0, 0, 1, 1},
+    {&__pyx_n_s_dump_xds_configs, __pyx_k_dump_xds_configs, sizeof(__pyx_k_dump_xds_configs), 0, 0, 1, 1},
+    {&__pyx_n_s_e, __pyx_k_e, sizeof(__pyx_k_e), 0, 0, 1, 1},
+    {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0},
+    {&__pyx_n_s_enable_algorithm, __pyx_k_enable_algorithm, sizeof(__pyx_k_enable_algorithm), 0, 0, 1, 1},
+    {&__pyx_n_s_enable_census, __pyx_k_enable_census, sizeof(__pyx_k_enable_census), 0, 0, 1, 1},
+    {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1},
+    {&__pyx_n_s_end_time, __pyx_k_end_time, sizeof(__pyx_k_end_time), 0, 0, 1, 1},
+    {&__pyx_n_s_endswith, __pyx_k_endswith, sizeof(__pyx_k_endswith), 0, 0, 1, 1},
+    {&__pyx_n_s_enter, __pyx_k_enter, sizeof(__pyx_k_enter), 0, 0, 1, 1},
+    {&__pyx_n_s_enter_user_request_generator, __pyx_k_enter_user_request_generator, sizeof(__pyx_k_enter_user_request_generator), 0, 0, 1, 1},
+    {&__pyx_n_s_enum, __pyx_k_enum, sizeof(__pyx_k_enum), 0, 0, 1, 1},
+    {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1},
+    {&__pyx_n_s_environ, __pyx_k_environ, sizeof(__pyx_k_environ), 0, 0, 1, 1},
+    {&__pyx_n_s_errno, __pyx_k_errno, sizeof(__pyx_k_errno), 0, 0, 1, 1},
+    {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1},
+    {&__pyx_n_s_error_code, __pyx_k_error_code, sizeof(__pyx_k_error_code), 0, 0, 1, 1},
+    {&__pyx_n_s_error_details, __pyx_k_error_details, sizeof(__pyx_k_error_details), 0, 0, 1, 1},
+    {&__pyx_n_s_error_str, __pyx_k_error_str, sizeof(__pyx_k_error_str), 0, 0, 1, 1},
+    {&__pyx_n_s_error_string, __pyx_k_error_string, sizeof(__pyx_k_error_string), 0, 0, 1, 1},
+    {&__pyx_n_s_event, __pyx_k_event, sizeof(__pyx_k_event), 0, 0, 1, 1},
+    {&__pyx_n_s_exc_info, __pyx_k_exc_info, sizeof(__pyx_k_exc_info), 0, 0, 1, 1},
+    {&__pyx_n_s_exception, __pyx_k_exception, sizeof(__pyx_k_exception), 0, 0, 1, 1},
+    {&__pyx_n_s_exception_type, __pyx_k_exception_type, sizeof(__pyx_k_exception_type), 0, 0, 1, 1},
+    {&__pyx_n_s_execute_batch, __pyx_k_execute_batch, sizeof(__pyx_k_execute_batch), 0, 0, 1, 1},
+    {&__pyx_n_s_exit, __pyx_k_exit, sizeof(__pyx_k_exit), 0, 0, 1, 1},
+    {&__pyx_n_s_exit_2, __pyx_k_exit_2, sizeof(__pyx_k_exit_2), 0, 0, 1, 1},
+    {&__pyx_kp_s_expected_certificate_to_be_bytes, __pyx_k_expected_certificate_to_be_bytes, sizeof(__pyx_k_expected_certificate_to_be_bytes), 0, 0, 1, 0},
+    {&__pyx_kp_s_expected_pem_key_cert_pairs_to_b, __pyx_k_expected_pem_key_cert_pairs_to_b, sizeof(__pyx_k_expected_pem_key_cert_pairs_to_b), 0, 0, 1, 0},
+    {&__pyx_kp_s_expected_registered_completion_q, __pyx_k_expected_registered_completion_q, sizeof(__pyx_k_expected_registered_completion_q), 0, 0, 1, 0},
+    {&__pyx_n_s_failed_precondition, __pyx_k_failed_precondition, sizeof(__pyx_k_failed_precondition), 0, 0, 1, 1},
+    {&__pyx_n_s_failure_handler, __pyx_k_failure_handler, sizeof(__pyx_k_failure_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_fallback_credentials, __pyx_k_fallback_credentials, sizeof(__pyx_k_fallback_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_fileno, __pyx_k_fileno, sizeof(__pyx_k_fileno), 0, 0, 1, 1},
+    {&__pyx_n_s_find_method_handler, __pyx_k_find_method_handler, sizeof(__pyx_k_find_method_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_find_method_handler_locals_quer, __pyx_k_find_method_handler_locals_quer, sizeof(__pyx_k_find_method_handler_locals_quer), 0, 0, 1, 1},
+    {&__pyx_n_s_finish_handler_with_stream_resp, __pyx_k_finish_handler_with_stream_resp, sizeof(__pyx_k_finish_handler_with_stream_resp), 0, 0, 1, 1},
+    {&__pyx_n_s_finish_handler_with_unary_respo, __pyx_k_finish_handler_with_unary_respo, sizeof(__pyx_k_finish_handler_with_unary_respo), 0, 0, 1, 1},
+    {&__pyx_n_s_finish_ops, __pyx_k_finish_ops, sizeof(__pyx_k_finish_ops), 0, 0, 1, 1},
+    {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1},
+    {&__pyx_n_s_fn, __pyx_k_fn, sizeof(__pyx_k_fn), 0, 0, 1, 1},
+    {&__pyx_n_s_force_client_auth, __pyx_k_force_client_auth, sizeof(__pyx_k_force_client_auth), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_epoch, __pyx_k_fork_epoch, sizeof(__pyx_k_fork_epoch), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_handler_failed, __pyx_k_fork_handler_failed, sizeof(__pyx_k_fork_handler_failed), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_handler_registered, __pyx_k_fork_handler_registered, sizeof(__pyx_k_fork_handler_registered), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_handler_registered_lock, __pyx_k_fork_handler_registered_lock, sizeof(__pyx_k_fork_handler_registered_lock), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_handlers_and_grpc_init, __pyx_k_fork_handlers_and_grpc_init, sizeof(__pyx_k_fork_handlers_and_grpc_init), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_in_progress, __pyx_k_fork_in_progress, sizeof(__pyx_k_fork_in_progress), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_in_progress_condition, __pyx_k_fork_in_progress_condition, sizeof(__pyx_k_fork_in_progress_condition), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_register_channel, __pyx_k_fork_register_channel, sizeof(__pyx_k_fork_register_channel), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_state, __pyx_k_fork_state, sizeof(__pyx_k_fork_state), 0, 0, 1, 1},
+    {&__pyx_n_s_fork_unregister_channel, __pyx_k_fork_unregister_channel, sizeof(__pyx_k_fork_unregister_channel), 0, 0, 1, 1},
+    {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1},
+    {&__pyx_n_s_format_exception, __pyx_k_format_exception, sizeof(__pyx_k_format_exception), 0, 0, 1, 1},
+    {&__pyx_n_s_functools, __pyx_k_functools, sizeof(__pyx_k_functools), 0, 0, 1, 1},
+    {&__pyx_n_s_future, __pyx_k_future, sizeof(__pyx_k_future), 0, 0, 1, 1},
+    {&__pyx_n_s_g_gevent_activated, __pyx_k_g_gevent_activated, sizeof(__pyx_k_g_gevent_activated), 0, 0, 1, 1},
+    {&__pyx_n_s_g_gevent_pool, __pyx_k_g_gevent_pool, sizeof(__pyx_k_g_gevent_pool), 0, 0, 1, 1},
+    {&__pyx_n_s_g_gevent_threadpool, __pyx_k_g_gevent_threadpool, sizeof(__pyx_k_g_gevent_threadpool), 0, 0, 1, 1},
+    {&__pyx_n_s_g_interrupt_check_period_ms, __pyx_k_g_interrupt_check_period_ms, sizeof(__pyx_k_g_interrupt_check_period_ms), 0, 0, 1, 1},
+    {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0},
+    {&__pyx_n_s_gen, __pyx_k_gen, sizeof(__pyx_k_gen), 0, 0, 1, 1},
+    {&__pyx_n_s_generator_to_async_generator, __pyx_k_generator_to_async_generator, sizeof(__pyx_k_generator_to_async_generator), 0, 0, 1, 1},
+    {&__pyx_n_s_generator_to_async_generator_loc, __pyx_k_generator_to_async_generator_loc, sizeof(__pyx_k_generator_to_async_generator_loc), 0, 0, 1, 1},
+    {&__pyx_n_s_generic_handler, __pyx_k_generic_handler, sizeof(__pyx_k_generic_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_generic_handlers, __pyx_k_generic_handlers, sizeof(__pyx_k_generic_handlers), 0, 0, 1, 1},
+    {&__pyx_n_s_generic_rpc_handlers, __pyx_k_generic_rpc_handlers, sizeof(__pyx_k_generic_rpc_handlers), 0, 0, 1, 1},
+    {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1},
+    {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1},
+    {&__pyx_n_s_getLogger, __pyx_k_getLogger, sizeof(__pyx_k_getLogger), 0, 0, 1, 1},
+    {&__pyx_n_s_get_data, __pyx_k_get_data, sizeof(__pyx_k_get_data), 0, 0, 1, 1},
+    {&__pyx_n_s_get_deadline_from_context, __pyx_k_get_deadline_from_context, sizeof(__pyx_k_get_deadline_from_context), 0, 0, 1, 1},
+    {&__pyx_n_s_get_event_loop, __pyx_k_get_event_loop, sizeof(__pyx_k_get_event_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_get_event_loop_policy, __pyx_k_get_event_loop_policy, sizeof(__pyx_k_get_event_loop_policy), 0, 0, 1, 1},
+    {&__pyx_n_s_get_fork_epoch, __pyx_k_get_fork_epoch, sizeof(__pyx_k_get_fork_epoch), 0, 0, 1, 1},
+    {&__pyx_n_s_get_hub, __pyx_k_get_hub, sizeof(__pyx_k_get_hub), 0, 0, 1, 1},
+    {&__pyx_n_s_get_metadata_locals_callback, __pyx_k_get_metadata_locals_callback, sizeof(__pyx_k_get_metadata_locals_callback), 0, 0, 1, 1},
+    {&__pyx_n_s_get_plugin, __pyx_k_get_plugin, sizeof(__pyx_k_get_plugin), 0, 0, 1, 1},
+    {&__pyx_n_s_get_registered_call_handle, __pyx_k_get_registered_call_handle, sizeof(__pyx_k_get_registered_call_handle), 0, 0, 1, 1},
+    {&__pyx_n_s_get_running_loop, __pyx_k_get_running_loop, sizeof(__pyx_k_get_running_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_get_working_loop, __pyx_k_get_working_loop, sizeof(__pyx_k_get_working_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1},
+    {&__pyx_n_s_gevent, __pyx_k_gevent, sizeof(__pyx_k_gevent), 0, 0, 1, 1},
+    {&__pyx_n_s_gevent_decrement_channel_count, __pyx_k_gevent_decrement_channel_count, sizeof(__pyx_k_gevent_decrement_channel_count), 0, 0, 1, 1},
+    {&__pyx_n_s_gevent_hub, __pyx_k_gevent_hub, sizeof(__pyx_k_gevent_hub), 0, 0, 1, 1},
+    {&__pyx_n_s_gevent_increment_channel_count, __pyx_k_gevent_increment_channel_count, sizeof(__pyx_k_gevent_increment_channel_count), 0, 0, 1, 1},
+    {&__pyx_n_s_gevent_pool, __pyx_k_gevent_pool, sizeof(__pyx_k_gevent_pool), 0, 0, 1, 1},
+    {&__pyx_n_s_grace, __pyx_k_grace, sizeof(__pyx_k_grace), 0, 0, 1, 1},
+    {&__pyx_n_s_grpc, __pyx_k_grpc, sizeof(__pyx_k_grpc), 0, 0, 1, 1},
+    {&__pyx_kp_s_grpc_aio_EOF, __pyx_k_grpc_aio_EOF, sizeof(__pyx_k_grpc_aio_EOF), 0, 0, 1, 0},
+    {&__pyx_n_s_grpc_call_error_string, __pyx_k_grpc_call_error_string, sizeof(__pyx_k_grpc_call_error_string), 0, 0, 1, 1},
+    {&__pyx_n_s_grpc_call_wrapper, __pyx_k_grpc_call_wrapper, sizeof(__pyx_k_grpc_call_wrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_grpc_completion_queue_shutdown, __pyx_k_grpc_completion_queue_shutdown, sizeof(__pyx_k_grpc_completion_queue_shutdown), 0, 0, 1, 1},
+    {&__pyx_kp_s_grpc_python__cygrpc__GrpcArgWrap, __pyx_k_grpc_python__cygrpc__GrpcArgWrap, sizeof(__pyx_k_grpc_python__cygrpc__GrpcArgWrap), 0, 0, 1, 0},
+    {&__pyx_n_s_grpc_server_request_call, __pyx_k_grpc_server_request_call, sizeof(__pyx_k_grpc_server_request_call), 0, 0, 1, 1},
+    {&__pyx_n_s_grpc_server_shutdown_and_notify, __pyx_k_grpc_server_shutdown_and_notify, sizeof(__pyx_k_grpc_server_shutdown_and_notify), 0, 0, 1, 1},
+    {&__pyx_n_s_grpc_shutdown_wrapper, __pyx_k_grpc_shutdown_wrapper, sizeof(__pyx_k_grpc_shutdown_wrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_gzip, __pyx_k_gzip, sizeof(__pyx_k_gzip), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_callback_wrapper, __pyx_k_handle_callback_wrapper, sizeof(__pyx_k_handle_callback_wrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_callbacks, __pyx_k_handle_callbacks, sizeof(__pyx_k_handle_callbacks), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_cancellation_from_core, __pyx_k_handle_cancellation_from_core, sizeof(__pyx_k_handle_cancellation_from_core), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_events, __pyx_k_handle_events, sizeof(__pyx_k_handle_events), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_exceptions, __pyx_k_handle_exceptions, sizeof(__pyx_k_handle_exceptions), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_rpc, __pyx_k_handle_rpc, sizeof(__pyx_k_handle_rpc), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_status_once_received, __pyx_k_handle_status_once_received, sizeof(__pyx_k_handle_status_once_received), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_stream_stream_rpc, __pyx_k_handle_stream_stream_rpc, sizeof(__pyx_k_handle_stream_stream_rpc), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_stream_unary_rpc, __pyx_k_handle_stream_unary_rpc, sizeof(__pyx_k_handle_stream_unary_rpc), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_unary_stream_rpc, __pyx_k_handle_unary_stream_rpc, sizeof(__pyx_k_handle_unary_stream_rpc), 0, 0, 1, 1},
+    {&__pyx_n_s_handle_unary_unary_rpc, __pyx_k_handle_unary_unary_rpc, sizeof(__pyx_k_handle_unary_unary_rpc), 0, 0, 1, 1},
+    {&__pyx_n_s_handler, __pyx_k_handler, sizeof(__pyx_k_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_handler_call_details, __pyx_k_handler_call_details, sizeof(__pyx_k_handler_call_details), 0, 0, 1, 1},
+    {&__pyx_n_s_hex_codec, __pyx_k_hex_codec, sizeof(__pyx_k_hex_codec), 0, 0, 1, 1},
+    {&__pyx_n_s_high, __pyx_k_high, sizeof(__pyx_k_high), 0, 0, 1, 1},
+    {&__pyx_n_s_host, __pyx_k_host, sizeof(__pyx_k_host), 0, 0, 1, 1},
+    {&__pyx_n_s_http2_initial_sequence_number, __pyx_k_http2_initial_sequence_number, sizeof(__pyx_k_http2_initial_sequence_number), 0, 0, 1, 1},
+    {&__pyx_n_s_hub, __pyx_k_hub, sizeof(__pyx_k_hub), 0, 0, 1, 1},
+    {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1},
+    {&__pyx_n_s_identities, __pyx_k_identities, sizeof(__pyx_k_identities), 0, 0, 1, 1},
+    {&__pyx_n_s_identity, __pyx_k_identity, sizeof(__pyx_k_identity), 0, 0, 1, 1},
+    {&__pyx_n_s_identity_key, __pyx_k_identity_key, sizeof(__pyx_k_identity_key), 0, 0, 1, 1},
+    {&__pyx_n_s_idle, __pyx_k_idle, sizeof(__pyx_k_idle), 0, 0, 1, 1},
+    {&__pyx_kp_s_if_error_code_is_specified_so_mu, __pyx_k_if_error_code_is_specified_so_mu, sizeof(__pyx_k_if_error_code_is_specified_so_mu), 0, 0, 1, 0},
+    {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
+    {&__pyx_n_s_inbound_ops, __pyx_k_inbound_ops, sizeof(__pyx_k_inbound_ops), 0, 0, 1, 1},
+    {&__pyx_n_s_increment, __pyx_k_increment, sizeof(__pyx_k_increment), 0, 0, 1, 1},
+    {&__pyx_n_s_init, __pyx_k_init, sizeof(__pyx_k_init), 0, 0, 1, 1},
+    {&__pyx_n_s_init_grpc_aio, __pyx_k_init_grpc_aio, sizeof(__pyx_k_init_grpc_aio), 0, 0, 1, 1},
+    {&__pyx_n_s_init_grpc_gevent, __pyx_k_init_grpc_gevent, sizeof(__pyx_k_init_grpc_gevent), 0, 0, 1, 1},
+    {&__pyx_n_s_init_subclass, __pyx_k_init_subclass, sizeof(__pyx_k_init_subclass), 0, 0, 1, 1},
+    {&__pyx_n_s_initial_cert_config, __pyx_k_initial_cert_config, sizeof(__pyx_k_initial_cert_config), 0, 0, 1, 1},
+    {&__pyx_kp_s_initial_cert_config_must_be_a_gr, __pyx_k_initial_cert_config_must_be_a_gr, sizeof(__pyx_k_initial_cert_config_must_be_a_gr), 0, 0, 1, 0},
+    {&__pyx_n_s_initial_metadata, __pyx_k_initial_metadata, sizeof(__pyx_k_initial_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_initial_metadata_op, __pyx_k_initial_metadata_op, sizeof(__pyx_k_initial_metadata_op), 0, 0, 1, 1},
+    {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1},
+    {&__pyx_n_s_initiate_stream_stream, __pyx_k_initiate_stream_stream, sizeof(__pyx_k_initiate_stream_stream), 0, 0, 1, 1},
+    {&__pyx_n_s_initiate_unary_stream, __pyx_k_initiate_unary_stream, sizeof(__pyx_k_initiate_unary_stream), 0, 0, 1, 1},
+    {&__pyx_n_s_insecure_server_credentials, __pyx_k_insecure_server_credentials, sizeof(__pyx_k_insecure_server_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_inspect, __pyx_k_inspect, sizeof(__pyx_k_inspect), 0, 0, 1, 1},
+    {&__pyx_n_s_install_context_from_request_cal, __pyx_k_install_context_from_request_cal, sizeof(__pyx_k_install_context_from_request_cal), 0, 0, 1, 1},
+    {&__pyx_n_s_install_context_from_request_cal_2, __pyx_k_install_context_from_request_cal_2, sizeof(__pyx_k_install_context_from_request_cal_2), 0, 0, 1, 1},
+    {&__pyx_n_s_int, __pyx_k_int, sizeof(__pyx_k_int), 0, 0, 1, 1},
+    {&__pyx_n_s_integrated_call, __pyx_k_integrated_call, sizeof(__pyx_k_integrated_call), 0, 0, 1, 1},
+    {&__pyx_n_s_integrated_call_locals_on_succe, __pyx_k_integrated_call_locals_on_succe, sizeof(__pyx_k_integrated_call_locals_on_succe), 0, 0, 1, 1},
+    {&__pyx_n_s_intercept_service, __pyx_k_intercept_service, sizeof(__pyx_k_intercept_service), 0, 0, 1, 1},
+    {&__pyx_n_s_interceptor, __pyx_k_interceptor, sizeof(__pyx_k_interceptor), 0, 0, 1, 1},
+    {&__pyx_n_s_interceptors, __pyx_k_interceptors, sizeof(__pyx_k_interceptors), 0, 0, 1, 1},
+    {&__pyx_n_s_internal, __pyx_k_internal, sizeof(__pyx_k_internal), 0, 0, 1, 1},
+    {&__pyx_kp_s_internal_error_user_data_must_be, __pyx_k_internal_error_user_data_must_be, sizeof(__pyx_k_internal_error_user_data_must_be), 0, 0, 1, 0},
+    {&__pyx_n_s_internal_poll, __pyx_k_internal_poll, sizeof(__pyx_k_internal_poll), 0, 0, 1, 1},
+    {&__pyx_n_s_invalid_argument, __pyx_k_invalid_argument, sizeof(__pyx_k_invalid_argument), 0, 0, 1, 1},
+    {&__pyx_kp_s_invalid_call_object_cannot_be_us, __pyx_k_invalid_call_object_cannot_be_us, sizeof(__pyx_k_invalid_call_object_cannot_be_us), 0, 0, 1, 0},
+    {&__pyx_n_s_invalid_flags, __pyx_k_invalid_flags, sizeof(__pyx_k_invalid_flags), 0, 0, 1, 1},
+    {&__pyx_n_s_invalid_metadata, __pyx_k_invalid_metadata, sizeof(__pyx_k_invalid_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_invocation_metadata, __pyx_k_invocation_metadata, sizeof(__pyx_k_invocation_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_is_algorithm_enabled, __pyx_k_is_algorithm_enabled, sizeof(__pyx_k_is_algorithm_enabled), 0, 0, 1, 1},
+    {&__pyx_n_s_is_async_handler, __pyx_k_is_async_handler, sizeof(__pyx_k_is_async_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1},
+    {&__pyx_n_s_is_fork_support_enabled, __pyx_k_is_fork_support_enabled, sizeof(__pyx_k_is_fork_support_enabled), 0, 0, 1, 1},
+    {&__pyx_n_s_is_locally_cancelled, __pyx_k_is_locally_cancelled, sizeof(__pyx_k_is_locally_cancelled), 0, 0, 1, 1},
+    {&__pyx_n_s_is_ok, __pyx_k_is_ok, sizeof(__pyx_k_is_ok), 0, 0, 1, 1},
+    {&__pyx_n_s_is_running, __pyx_k_is_running, sizeof(__pyx_k_is_running), 0, 0, 1, 1},
+    {&__pyx_n_s_is_sampled, __pyx_k_is_sampled, sizeof(__pyx_k_is_sampled), 0, 0, 1, 1},
+    {&__pyx_n_s_is_valid, __pyx_k_is_valid, sizeof(__pyx_k_is_valid), 0, 0, 1, 1},
+    {&__pyx_n_s_isasyncgenfunction, __pyx_k_isasyncgenfunction, sizeof(__pyx_k_isasyncgenfunction), 0, 0, 1, 1},
+    {&__pyx_n_s_isawaitable, __pyx_k_isawaitable, sizeof(__pyx_k_isawaitable), 0, 0, 1, 1},
+    {&__pyx_n_s_iscoroutinefunction, __pyx_k_iscoroutinefunction, sizeof(__pyx_k_iscoroutinefunction), 0, 0, 1, 1},
+    {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0},
+    {&__pyx_n_s_item, __pyx_k_item, sizeof(__pyx_k_item), 0, 0, 1, 1},
+    {&__pyx_n_s_iter, __pyx_k_iter, sizeof(__pyx_k_iter), 0, 0, 1, 1},
+    {&__pyx_n_s_join, __pyx_k_join, sizeof(__pyx_k_join), 0, 0, 1, 1},
+    {&__pyx_n_s_key, __pyx_k_key, sizeof(__pyx_k_key), 0, 0, 1, 1},
+    {&__pyx_n_s_keys, __pyx_k_keys, sizeof(__pyx_k_keys), 0, 0, 1, 1},
+    {&__pyx_n_s_last_observed_state, __pyx_k_last_observed_state, sizeof(__pyx_k_last_observed_state), 0, 0, 1, 1},
+    {&__pyx_n_s_latent_event_arg, __pyx_k_latent_event_arg, sizeof(__pyx_k_latent_event_arg), 0, 0, 1, 1},
+    {&__pyx_n_s_len, __pyx_k_len, sizeof(__pyx_k_len), 0, 0, 1, 1},
+    {&__pyx_n_s_lk, __pyx_k_lk, sizeof(__pyx_k_lk), 0, 0, 1, 1},
+    {&__pyx_n_s_local_connect_type, __pyx_k_local_connect_type, sizeof(__pyx_k_local_connect_type), 0, 0, 1, 1},
+    {&__pyx_n_s_local_tcp, __pyx_k_local_tcp, sizeof(__pyx_k_local_tcp), 0, 0, 1, 1},
+    {&__pyx_n_s_logging, __pyx_k_logging, sizeof(__pyx_k_logging), 0, 0, 1, 1},
+    {&__pyx_n_s_loop, __pyx_k_loop, sizeof(__pyx_k_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_low, __pyx_k_low, sizeof(__pyx_k_low), 0, 0, 1, 1},
+    {&__pyx_n_s_lower, __pyx_k_lower, sizeof(__pyx_k_lower), 0, 0, 1, 1},
+    {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
+    {&__pyx_n_s_managed_target, __pyx_k_managed_target, sizeof(__pyx_k_managed_target), 0, 0, 1, 1},
+    {&__pyx_n_s_max_concurrent_streams, __pyx_k_max_concurrent_streams, sizeof(__pyx_k_max_concurrent_streams), 0, 0, 1, 1},
+    {&__pyx_n_s_max_receive_message_length, __pyx_k_max_receive_message_length, sizeof(__pyx_k_max_receive_message_length), 0, 0, 1, 1},
+    {&__pyx_n_s_max_results, __pyx_k_max_results, sizeof(__pyx_k_max_results), 0, 0, 1, 1},
+    {&__pyx_n_s_max_send_message_length, __pyx_k_max_send_message_length, sizeof(__pyx_k_max_send_message_length), 0, 0, 1, 1},
+    {&__pyx_n_s_maximum_concurrent_rpcs, __pyx_k_maximum_concurrent_rpcs, sizeof(__pyx_k_maximum_concurrent_rpcs), 0, 0, 1, 1},
+    {&__pyx_kp_s_maximum_concurrent_rpcs_should_b, __pyx_k_maximum_concurrent_rpcs_should_b, sizeof(__pyx_k_maximum_concurrent_rpcs_should_b), 0, 0, 1, 0},
+    {&__pyx_n_s_maxsize, __pyx_k_maxsize, sizeof(__pyx_k_maxsize), 0, 0, 1, 1},
+    {&__pyx_n_s_maybe_save_server_trace_context, __pyx_k_maybe_save_server_trace_context, sizeof(__pyx_k_maybe_save_server_trace_context), 0, 0, 1, 1},
+    {&__pyx_n_s_medium, __pyx_k_medium, sizeof(__pyx_k_medium), 0, 0, 1, 1},
+    {&__pyx_n_s_members, __pyx_k_members, sizeof(__pyx_k_members), 0, 0, 1, 1},
+    {&__pyx_n_s_message, __pyx_k_message, sizeof(__pyx_k_message), 0, 0, 1, 1},
+    {&__pyx_n_s_metaclass, __pyx_k_metaclass, sizeof(__pyx_k_metaclass), 0, 0, 1, 1},
+    {&__pyx_n_s_metadata, __pyx_k_metadata, sizeof(__pyx_k_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_metadata_locals_genexpr, __pyx_k_metadata_locals_genexpr, sizeof(__pyx_k_metadata_locals_genexpr), 0, 0, 1, 1},
+    {&__pyx_n_s_metadata_plugin, __pyx_k_metadata_plugin, sizeof(__pyx_k_metadata_plugin), 0, 0, 1, 1},
+    {&__pyx_n_s_metadata_sent_observer, __pyx_k_metadata_sent_observer, sizeof(__pyx_k_metadata_sent_observer), 0, 0, 1, 1},
+    {&__pyx_kp_s_metadata_was_invalid_s, __pyx_k_metadata_was_invalid_s, sizeof(__pyx_k_metadata_was_invalid_s), 0, 0, 1, 0},
+    {&__pyx_n_s_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 0, 1, 1},
+    {&__pyx_n_s_method_handler, __pyx_k_method_handler, sizeof(__pyx_k_method_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_module, __pyx_k_module, sizeof(__pyx_k_module), 0, 0, 1, 1},
+    {&__pyx_n_s_mro_entries, __pyx_k_mro_entries, sizeof(__pyx_k_mro_entries), 0, 0, 1, 1},
+    {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1},
+    {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1},
+    {&__pyx_n_s_namedtuple, __pyx_k_namedtuple, sizeof(__pyx_k_namedtuple), 0, 0, 1, 1},
+    {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1},
+    {&__pyx_n_s_new_event_loop, __pyx_k_new_event_loop, sizeof(__pyx_k_new_event_loop), 0, 0, 1, 1},
+    {&__pyx_n_s_next_call_event, __pyx_k_next_call_event, sizeof(__pyx_k_next_call_event), 0, 0, 1, 1},
+    {&__pyx_n_s_next_call_event_locals_on_succes, __pyx_k_next_call_event_locals_on_succes, sizeof(__pyx_k_next_call_event_locals_on_succes), 0, 0, 1, 1},
+    {&__pyx_n_s_next_event, __pyx_k_next_event, sizeof(__pyx_k_next_event), 0, 0, 1, 1},
+    {&__pyx_n_s_next_event_locals_on_failure, __pyx_k_next_event_locals_on_failure, sizeof(__pyx_k_next_event_locals_on_failure), 0, 0, 1, 1},
+    {&__pyx_n_s_next_event_locals_on_success, __pyx_k_next_event_locals_on_success, sizeof(__pyx_k_next_event_locals_on_success), 0, 0, 1, 1},
+    {&__pyx_n_s_no_compress, __pyx_k_no_compress, sizeof(__pyx_k_no_compress), 0, 0, 1, 1},
+    {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0},
+    {&__pyx_n_s_none, __pyx_k_none, sizeof(__pyx_k_none), 0, 0, 1, 1},
+    {&__pyx_n_s_not_found, __pyx_k_not_found, sizeof(__pyx_k_not_found), 0, 0, 1, 1},
+    {&__pyx_n_s_not_invoked, __pyx_k_not_invoked, sizeof(__pyx_k_not_invoked), 0, 0, 1, 1},
+    {&__pyx_n_s_not_on_client, __pyx_k_not_on_client, sizeof(__pyx_k_not_on_client), 0, 0, 1, 1},
+    {&__pyx_n_s_not_on_server, __pyx_k_not_on_server, sizeof(__pyx_k_not_on_server), 0, 0, 1, 1},
+    {&__pyx_n_s_notify_all, __pyx_k_notify_all, sizeof(__pyx_k_notify_all), 0, 0, 1, 1},
+    {&__pyx_n_s_num_active_threads, __pyx_k_num_active_threads, sizeof(__pyx_k_num_active_threads), 0, 0, 1, 1},
+    {&__pyx_n_s_object, __pyx_k_object, sizeof(__pyx_k_object), 0, 0, 1, 1},
+    {&__pyx_kp_s_object_2, __pyx_k_object_2, sizeof(__pyx_k_object_2), 0, 0, 1, 0},
+    {&__pyx_n_s_observability, __pyx_k_observability, sizeof(__pyx_k_observability), 0, 0, 1, 1},
+    {&__pyx_n_s_observability_enabled, __pyx_k_observability_enabled, sizeof(__pyx_k_observability_enabled), 0, 0, 1, 1},
+    {&__pyx_n_s_observability_plugin, __pyx_k_observability_plugin, sizeof(__pyx_k_observability_plugin), 0, 0, 1, 1},
+    {&__pyx_kp_s_of_RPC_that_terminated_with_sta, __pyx_k_of_RPC_that_terminated_with_sta, sizeof(__pyx_k_of_RPC_that_terminated_with_sta), 0, 0, 1, 0},
+    {&__pyx_kp_s_of_RPC_that_terminated_with_sta_2, __pyx_k_of_RPC_that_terminated_with_sta_2, sizeof(__pyx_k_of_RPC_that_terminated_with_sta_2), 0, 0, 1, 0},
+    {&__pyx_n_s_ok, __pyx_k_ok, sizeof(__pyx_k_ok), 0, 0, 1, 1},
+    {&__pyx_n_s_on_failure, __pyx_k_on_failure, sizeof(__pyx_k_on_failure), 0, 0, 1, 1},
+    {&__pyx_n_s_on_success, __pyx_k_on_success, sizeof(__pyx_k_on_success), 0, 0, 1, 1},
+    {&__pyx_n_s_op, __pyx_k_op, sizeof(__pyx_k_op), 0, 0, 1, 1},
+    {&__pyx_n_s_operate, __pyx_k_operate, sizeof(__pyx_k_operate), 0, 0, 1, 1},
+    {&__pyx_n_s_operation_complete, __pyx_k_operation_complete, sizeof(__pyx_k_operation_complete), 0, 0, 1, 1},
+    {&__pyx_n_s_operations, __pyx_k_operations, sizeof(__pyx_k_operations), 0, 0, 1, 1},
+    {&__pyx_n_s_operationses_and_tags, __pyx_k_operationses_and_tags, sizeof(__pyx_k_operationses_and_tags), 0, 0, 1, 1},
+    {&__pyx_n_s_ops, __pyx_k_ops, sizeof(__pyx_k_ops), 0, 0, 1, 1},
+    {&__pyx_n_s_options, __pyx_k_options, sizeof(__pyx_k_options), 0, 0, 1, 1},
+    {&__pyx_n_s_os, __pyx_k_os, sizeof(__pyx_k_os), 0, 0, 1, 1},
+    {&__pyx_n_s_out_of_range, __pyx_k_out_of_range, sizeof(__pyx_k_out_of_range), 0, 0, 1, 1},
+    {&__pyx_n_s_outbound_initial_metadata, __pyx_k_outbound_initial_metadata, sizeof(__pyx_k_outbound_initial_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_outbound_ops, __pyx_k_outbound_ops, sizeof(__pyx_k_outbound_ops), 0, 0, 1, 1},
+    {&__pyx_n_s_partial, __pyx_k_partial, sizeof(__pyx_k_partial), 0, 0, 1, 1},
+    {&__pyx_n_s_peer, __pyx_k_peer, sizeof(__pyx_k_peer), 0, 0, 1, 1},
+    {&__pyx_n_s_peer_identities, __pyx_k_peer_identities, sizeof(__pyx_k_peer_identities), 0, 0, 1, 1},
+    {&__pyx_n_s_peer_identity_key, __pyx_k_peer_identity_key, sizeof(__pyx_k_peer_identity_key), 0, 0, 1, 1},
+    {&__pyx_n_s_pem_key_cert_pairs, __pyx_k_pem_key_cert_pairs, sizeof(__pyx_k_pem_key_cert_pairs), 0, 0, 1, 1},
+    {&__pyx_n_s_pem_root_certificates, __pyx_k_pem_root_certificates, sizeof(__pyx_k_pem_root_certificates), 0, 0, 1, 1},
+    {&__pyx_n_s_pem_root_certs, __pyx_k_pem_root_certs, sizeof(__pyx_k_pem_root_certs), 0, 0, 1, 1},
+    {&__pyx_n_s_permission_denied, __pyx_k_permission_denied, sizeof(__pyx_k_permission_denied), 0, 0, 1, 1},
+    {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1},
+    {&__pyx_n_s_pkgutil, __pyx_k_pkgutil, sizeof(__pyx_k_pkgutil), 0, 0, 1, 1},
+    {&__pyx_n_s_plugin, __pyx_k_plugin, sizeof(__pyx_k_plugin), 0, 0, 1, 1},
+    {&__pyx_n_s_poll, __pyx_k_poll, sizeof(__pyx_k_poll), 0, 0, 1, 1},
+    {&__pyx_n_s_poll_wrapper, __pyx_k_poll_wrapper, sizeof(__pyx_k_poll_wrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_poller, __pyx_k_poller, sizeof(__pyx_k_poller), 0, 0, 1, 1},
+    {&__pyx_n_s_pool, __pyx_k_pool, sizeof(__pyx_k_pool), 0, 0, 1, 1},
+    {&__pyx_n_s_pop, __pyx_k_pop, sizeof(__pyx_k_pop), 0, 0, 1, 1},
+    {&__pyx_n_s_postfork_state_to_reset, __pyx_k_postfork_state_to_reset, sizeof(__pyx_k_postfork_state_to_reset), 0, 0, 1, 1},
+    {&__pyx_n_s_postfork_states_to_reset, __pyx_k_postfork_states_to_reset, sizeof(__pyx_k_postfork_states_to_reset), 0, 0, 1, 1},
+    {&__pyx_n_s_prepare, __pyx_k_prepare, sizeof(__pyx_k_prepare), 0, 0, 1, 1},
+    {&__pyx_n_s_primary_user_agent_string, __pyx_k_primary_user_agent_string, sizeof(__pyx_k_primary_user_agent_string), 0, 0, 1, 1},
+    {&__pyx_n_s_print_exc, __pyx_k_print_exc, sizeof(__pyx_k_print_exc), 0, 0, 1, 1},
+    {&__pyx_n_s_private_key, __pyx_k_private_key, sizeof(__pyx_k_private_key), 0, 0, 1, 1},
+    {&__pyx_n_s_properties, __pyx_k_properties, sizeof(__pyx_k_properties), 0, 0, 1, 1},
+    {&__pyx_n_s_property, __pyx_k_property, sizeof(__pyx_k_property), 0, 0, 1, 1},
+    {&__pyx_n_s_put, __pyx_k_put, sizeof(__pyx_k_put), 0, 0, 1, 1},
+    {&__pyx_n_s_py_auth_context, __pyx_k_py_auth_context, sizeof(__pyx_k_py_auth_context), 0, 0, 1, 1},
+    {&__pyx_n_s_python_call_credentials, __pyx_k_python_call_credentials, sizeof(__pyx_k_python_call_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_capi, __pyx_k_pyx_capi, sizeof(__pyx_k_pyx_capi), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_unpickle_AioServer, __pyx_k_pyx_unpickle_AioServer, sizeof(__pyx_k_pyx_unpickle_AioServer), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_unpickle_CensusContext, __pyx_k_pyx_unpickle_CensusContext, sizeof(__pyx_k_pyx_unpickle_CensusContext), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_unpickle_ChannelCredential, __pyx_k_pyx_unpickle_ChannelCredential, sizeof(__pyx_k_pyx_unpickle_ChannelCredential), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_unpickle_InsecureChannelCr, __pyx_k_pyx_unpickle_InsecureChannelCr, sizeof(__pyx_k_pyx_unpickle_InsecureChannelCr), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_unpickle__Tag, __pyx_k_pyx_unpickle__Tag, sizeof(__pyx_k_pyx_unpickle__Tag), 0, 0, 1, 1},
+    {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1},
+    {&__pyx_n_s_qualname, __pyx_k_qualname, sizeof(__pyx_k_qualname), 0, 0, 1, 1},
+    {&__pyx_n_s_query_call, __pyx_k_query_call, sizeof(__pyx_k_query_call), 0, 0, 1, 1},
+    {&__pyx_n_s_query_handler, __pyx_k_query_handler, sizeof(__pyx_k_query_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_query_handlers, __pyx_k_query_handlers, sizeof(__pyx_k_query_handlers), 0, 0, 1, 1},
+    {&__pyx_n_s_queue, __pyx_k_queue, sizeof(__pyx_k_queue), 0, 0, 1, 1},
+    {&__pyx_n_s_queue_deadline, __pyx_k_queue_deadline, sizeof(__pyx_k_queue_deadline), 0, 0, 1, 1},
+    {&__pyx_kp_s_queue_must_be_live, __pyx_k_queue_must_be_live, sizeof(__pyx_k_queue_must_be_live), 0, 0, 1, 0},
+    {&__pyx_kp_s_queue_must_be_shutting_down_to_b, __pyx_k_queue_must_be_shutting_down_to_b, sizeof(__pyx_k_queue_must_be_shutting_down_to_b), 0, 0, 1, 0},
+    {&__pyx_n_s_queue_shutdown, __pyx_k_queue_shutdown, sizeof(__pyx_k_queue_shutdown), 0, 0, 1, 1},
+    {&__pyx_n_s_queue_timeout, __pyx_k_queue_timeout, sizeof(__pyx_k_queue_timeout), 0, 0, 1, 1},
+    {&__pyx_n_s_raise_if_not_valid_trailing_meta, __pyx_k_raise_if_not_valid_trailing_meta, sizeof(__pyx_k_raise_if_not_valid_trailing_meta), 0, 0, 1, 1},
+    {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1},
+    {&__pyx_n_s_raw_message, __pyx_k_raw_message, sizeof(__pyx_k_raw_message), 0, 0, 1, 1},
+    {&__pyx_n_s_read, __pyx_k_read, sizeof(__pyx_k_read), 0, 0, 1, 1},
+    {&__pyx_n_s_read_socket, __pyx_k_read_socket, sizeof(__pyx_k_read_socket), 0, 0, 1, 1},
+    {&__pyx_n_s_ready, __pyx_k_ready, sizeof(__pyx_k_ready), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_close_on_server, __pyx_k_receive_close_on_server, sizeof(__pyx_k_receive_close_on_server), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_initial_metadata, __pyx_k_receive_initial_metadata, sizeof(__pyx_k_receive_initial_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_initial_metadata_2, __pyx_k_receive_initial_metadata_2, sizeof(__pyx_k_receive_initial_metadata_2), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_initial_metadata_op, __pyx_k_receive_initial_metadata_op, sizeof(__pyx_k_receive_initial_metadata_op), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_message, __pyx_k_receive_message, sizeof(__pyx_k_receive_message), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_message_2, __pyx_k_receive_message_2, sizeof(__pyx_k_receive_message_2), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_message_op, __pyx_k_receive_message_op, sizeof(__pyx_k_receive_message_op), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_op, __pyx_k_receive_op, sizeof(__pyx_k_receive_op), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_serialized_message, __pyx_k_receive_serialized_message, sizeof(__pyx_k_receive_serialized_message), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_status_on_client, __pyx_k_receive_status_on_client, sizeof(__pyx_k_receive_status_on_client), 0, 0, 1, 1},
+    {&__pyx_n_s_receive_status_on_client_op, __pyx_k_receive_status_on_client_op, sizeof(__pyx_k_receive_status_on_client_op), 0, 0, 1, 1},
+    {&__pyx_n_s_received_message, __pyx_k_received_message, sizeof(__pyx_k_received_message), 0, 0, 1, 1},
+    {&__pyx_n_s_recv, __pyx_k_recv, sizeof(__pyx_k_recv), 0, 0, 1, 1},
+    {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1},
+    {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1},
+    {&__pyx_n_s_register, __pyx_k_register, sizeof(__pyx_k_register), 0, 0, 1, 1},
+    {&__pyx_n_s_register_at_fork, __pyx_k_register_at_fork, sizeof(__pyx_k_register_at_fork), 0, 0, 1, 1},
+    {&__pyx_n_s_register_completion_queue, __pyx_k_register_completion_queue, sizeof(__pyx_k_register_completion_queue), 0, 0, 1, 1},
+    {&__pyx_n_s_registered_call_handle, __pyx_k_registered_call_handle, sizeof(__pyx_k_registered_call_handle), 0, 0, 1, 1},
+    {&__pyx_n_s_remove_reader, __pyx_k_remove_reader, sizeof(__pyx_k_remove_reader), 0, 0, 1, 1},
+    {&__pyx_n_s_repr, __pyx_k_repr, sizeof(__pyx_k_repr), 0, 0, 1, 1},
+    {&__pyx_n_s_repr_2, __pyx_k_repr_2, sizeof(__pyx_k_repr_2), 0, 0, 1, 1},
+    {&__pyx_n_s_request, __pyx_k_request, sizeof(__pyx_k_request), 0, 0, 1, 1},
+    {&__pyx_n_s_request_call, __pyx_k_request_call, sizeof(__pyx_k_request_call), 0, 0, 1, 1},
+    {&__pyx_n_s_request_call_2, __pyx_k_request_call_2, sizeof(__pyx_k_request_call_2), 0, 0, 1, 1},
+    {&__pyx_n_s_request_call_tag, __pyx_k_request_call_tag, sizeof(__pyx_k_request_call_tag), 0, 0, 1, 1},
+    {&__pyx_n_s_request_deserializer, __pyx_k_request_deserializer, sizeof(__pyx_k_request_deserializer), 0, 0, 1, 1},
+    {&__pyx_n_s_request_iterator, __pyx_k_request_iterator, sizeof(__pyx_k_request_iterator), 0, 0, 1, 1},
+    {&__pyx_n_s_request_message, __pyx_k_request_message, sizeof(__pyx_k_request_message), 0, 0, 1, 1},
+    {&__pyx_n_s_request_raw, __pyx_k_request_raw, sizeof(__pyx_k_request_raw), 0, 0, 1, 1},
+    {&__pyx_n_s_request_streaming, __pyx_k_request_streaming, sizeof(__pyx_k_request_streaming), 0, 0, 1, 1},
+    {&__pyx_n_s_reset_grpc_config_vars, __pyx_k_reset_grpc_config_vars, sizeof(__pyx_k_reset_grpc_config_vars), 0, 0, 1, 1},
+    {&__pyx_n_s_reset_postfork_child, __pyx_k_reset_postfork_child, sizeof(__pyx_k_reset_postfork_child), 0, 0, 1, 1},
+    {&__pyx_n_s_resource_exhausted, __pyx_k_resource_exhausted, sizeof(__pyx_k_resource_exhausted), 0, 0, 1, 1},
+    {&__pyx_n_s_response, __pyx_k_response, sizeof(__pyx_k_response), 0, 0, 1, 1},
+    {&__pyx_n_s_response_message, __pyx_k_response_message, sizeof(__pyx_k_response_message), 0, 0, 1, 1},
+    {&__pyx_n_s_response_raw, __pyx_k_response_raw, sizeof(__pyx_k_response_raw), 0, 0, 1, 1},
+    {&__pyx_n_s_response_serializer, __pyx_k_response_serializer, sizeof(__pyx_k_response_serializer), 0, 0, 1, 1},
+    {&__pyx_n_s_response_streaming, __pyx_k_response_streaming, sizeof(__pyx_k_response_streaming), 0, 0, 1, 1},
+    {&__pyx_n_s_result, __pyx_k_result, sizeof(__pyx_k_result), 0, 0, 1, 1},
+    {&__pyx_n_s_retain_self, __pyx_k_retain_self, sizeof(__pyx_k_retain_self), 0, 0, 1, 1},
+    {&__pyx_n_s_return, __pyx_k_return, sizeof(__pyx_k_return), 0, 0, 1, 1},
+    {&__pyx_n_s_return_from_user_request_generat, __pyx_k_return_from_user_request_generat, sizeof(__pyx_k_return_from_user_request_generat), 0, 0, 1, 1},
+    {&__pyx_n_s_rpc_coro, __pyx_k_rpc_coro, sizeof(__pyx_k_rpc_coro), 0, 0, 1, 1},
+    {&__pyx_n_s_rpc_state, __pyx_k_rpc_state, sizeof(__pyx_k_rpc_state), 0, 0, 1, 1},
+    {&__pyx_n_s_rpc_task, __pyx_k_rpc_task, sizeof(__pyx_k_rpc_task), 0, 0, 1, 1},
+    {&__pyx_n_s_run, __pyx_k_run, sizeof(__pyx_k_run), 0, 0, 1, 1},
+    {&__pyx_n_s_run_2, __pyx_k_run_2, sizeof(__pyx_k_run_2), 0, 0, 1, 1},
+    {&__pyx_n_s_run_coroutine_threadsafe, __pyx_k_run_coroutine_threadsafe, sizeof(__pyx_k_run_coroutine_threadsafe), 0, 0, 1, 1},
+    {&__pyx_n_s_run_in_executor, __pyx_k_run_in_executor, sizeof(__pyx_k_run_in_executor), 0, 0, 1, 1},
+    {&__pyx_n_s_run_interceptor, __pyx_k_run_interceptor, sizeof(__pyx_k_run_interceptor), 0, 0, 1, 1},
+    {&__pyx_n_s_run_spawn_greenlets, __pyx_k_run_spawn_greenlets, sizeof(__pyx_k_run_spawn_greenlets), 0, 0, 1, 1},
+    {&__pyx_n_s_run_with_context, __pyx_k_run_with_context, sizeof(__pyx_k_run_with_context), 0, 0, 1, 1},
+    {&__pyx_n_s_run_with_context_locals__run, __pyx_k_run_with_context_locals__run, sizeof(__pyx_k_run_with_context_locals__run), 0, 0, 1, 1},
+    {&__pyx_n_s_runtime_error, __pyx_k_runtime_error, sizeof(__pyx_k_runtime_error), 0, 0, 1, 1},
+    {&__pyx_n_s_save_trace_context, __pyx_k_save_trace_context, sizeof(__pyx_k_save_trace_context), 0, 0, 1, 1},
+    {&__pyx_n_s_schedule_coro_threadsafe, __pyx_k_schedule_coro_threadsafe, sizeof(__pyx_k_schedule_coro_threadsafe), 0, 0, 1, 1},
+    {&__pyx_n_s_schedule_rpc_coro, __pyx_k_schedule_rpc_coro, sizeof(__pyx_k_schedule_rpc_coro), 0, 0, 1, 1},
+    {&__pyx_n_s_secondary_user_agent_string, __pyx_k_secondary_user_agent_string, sizeof(__pyx_k_secondary_user_agent_string), 0, 0, 1, 1},
+    {&__pyx_n_s_segregated_call, __pyx_k_segregated_call, sizeof(__pyx_k_segregated_call), 0, 0, 1, 1},
+    {&__pyx_n_s_segregated_call_locals_on_succe, __pyx_k_segregated_call_locals_on_succe, sizeof(__pyx_k_segregated_call_locals_on_succe), 0, 0, 1, 1},
+    {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1},
+    {&__pyx_kp_s_self__cq_cannot_be_converted_to, __pyx_k_self__cq_cannot_be_converted_to, sizeof(__pyx_k_self__cq_cannot_be_converted_to), 0, 0, 1, 0},
+    {&__pyx_kp_s_self_arg_cannot_be_converted_to, __pyx_k_self_arg_cannot_be_converted_to, sizeof(__pyx_k_self_arg_cannot_be_converted_to), 0, 0, 1, 0},
+    {&__pyx_kp_s_self_c_argument_cannot_be_conver, __pyx_k_self_c_argument_cannot_be_conver, sizeof(__pyx_k_self_c_argument_cannot_be_conver), 0, 0, 1, 0},
+    {&__pyx_kp_s_self_c_credentials_cannot_be_con, __pyx_k_self_c_credentials_cannot_be_con, sizeof(__pyx_k_self_c_credentials_cannot_be_con), 0, 0, 1, 0},
+    {&__pyx_kp_s_self_c_op_cannot_be_converted_to, __pyx_k_self_c_op_cannot_be_converted_to, sizeof(__pyx_k_self_c_op_cannot_be_converted_to), 0, 0, 1, 0},
+    {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1},
+    {&__pyx_n_s_send_close_from_client, __pyx_k_send_close_from_client, sizeof(__pyx_k_send_close_from_client), 0, 0, 1, 1},
+    {&__pyx_n_s_send_close_op, __pyx_k_send_close_op, sizeof(__pyx_k_send_close_op), 0, 0, 1, 1},
+    {&__pyx_n_s_send_error_status_from_server, __pyx_k_send_error_status_from_server, sizeof(__pyx_k_send_error_status_from_server), 0, 0, 1, 1},
+    {&__pyx_n_s_send_initial_metadata, __pyx_k_send_initial_metadata, sizeof(__pyx_k_send_initial_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_send_initial_metadata_2, __pyx_k_send_initial_metadata_2, sizeof(__pyx_k_send_initial_metadata_2), 0, 0, 1, 1},
+    {&__pyx_n_s_send_initial_metadata_op, __pyx_k_send_initial_metadata_op, sizeof(__pyx_k_send_initial_metadata_op), 0, 0, 1, 1},
+    {&__pyx_n_s_send_message, __pyx_k_send_message, sizeof(__pyx_k_send_message), 0, 0, 1, 1},
+    {&__pyx_n_s_send_message_2, __pyx_k_send_message_2, sizeof(__pyx_k_send_message_2), 0, 0, 1, 1},
+    {&__pyx_n_s_send_message_op, __pyx_k_send_message_op, sizeof(__pyx_k_send_message_op), 0, 0, 1, 1},
+    {&__pyx_n_s_send_receive_close, __pyx_k_send_receive_close, sizeof(__pyx_k_send_receive_close), 0, 0, 1, 1},
+    {&__pyx_n_s_send_serialized_message, __pyx_k_send_serialized_message, sizeof(__pyx_k_send_serialized_message), 0, 0, 1, 1},
+    {&__pyx_n_s_send_status_from_server, __pyx_k_send_status_from_server, sizeof(__pyx_k_send_status_from_server), 0, 0, 1, 1},
+    {&__pyx_n_s_server, __pyx_k_server, sizeof(__pyx_k_server), 0, 0, 1, 1},
+    {&__pyx_n_s_server_call_tracer, __pyx_k_server_call_tracer, sizeof(__pyx_k_server_call_tracer), 0, 0, 1, 1},
+    {&__pyx_n_s_server_certificate_config_ssl, __pyx_k_server_certificate_config_ssl, sizeof(__pyx_k_server_certificate_config_ssl), 0, 0, 1, 1},
+    {&__pyx_n_s_server_credentials, __pyx_k_server_credentials, sizeof(__pyx_k_server_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_server_credentials_alts, __pyx_k_server_credentials_alts, sizeof(__pyx_k_server_credentials_alts), 0, 0, 1, 1},
+    {&__pyx_n_s_server_credentials_local, __pyx_k_server_credentials_local, sizeof(__pyx_k_server_credentials_local), 0, 0, 1, 1},
+    {&__pyx_n_s_server_credentials_ssl, __pyx_k_server_credentials_ssl, sizeof(__pyx_k_server_credentials_ssl), 0, 0, 1, 1},
+    {&__pyx_n_s_server_credentials_ssl_dynamic_c, __pyx_k_server_credentials_ssl_dynamic_c, sizeof(__pyx_k_server_credentials_ssl_dynamic_c), 0, 0, 1, 1},
+    {&__pyx_n_s_server_id, __pyx_k_server_id, sizeof(__pyx_k_server_id), 0, 0, 1, 1},
+    {&__pyx_n_s_server_main_loop, __pyx_k_server_main_loop, sizeof(__pyx_k_server_main_loop), 0, 0, 1, 1},
+    {&__pyx_kp_s_server_must_be_started_and_not_s, __pyx_k_server_must_be_started_and_not_s, sizeof(__pyx_k_server_must_be_started_and_not_s), 0, 0, 1, 0},
+    {&__pyx_n_s_server_queue, __pyx_k_server_queue, sizeof(__pyx_k_server_queue), 0, 0, 1, 1},
+    {&__pyx_kp_s_server_queue_must_be_a_registere, __pyx_k_server_queue_must_be_a_registere, sizeof(__pyx_k_server_queue_must_be_a_registere), 0, 0, 1, 0},
+    {&__pyx_n_s_server_started, __pyx_k_server_started, sizeof(__pyx_k_server_started), 0, 0, 1, 1},
+    {&__pyx_n_s_service, __pyx_k_service, sizeof(__pyx_k_service), 0, 0, 1, 1},
+    {&__pyx_n_s_service_accounts, __pyx_k_service_accounts, sizeof(__pyx_k_service_accounts), 0, 0, 1, 1},
+    {&__pyx_n_s_servicer_context, __pyx_k_servicer_context, sizeof(__pyx_k_servicer_context), 0, 0, 1, 1},
+    {&__pyx_n_s_serving_task_crash_handler, __pyx_k_serving_task_crash_handler, sizeof(__pyx_k_serving_task_crash_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_setDaemon, __pyx_k_setDaemon, sizeof(__pyx_k_setDaemon), 0, 0, 1, 1},
+    {&__pyx_n_s_set_async_callback_func, __pyx_k_set_async_callback_func, sizeof(__pyx_k_set_async_callback_func), 0, 0, 1, 1},
+    {&__pyx_n_s_set_census_context_on_call, __pyx_k_set_census_context_on_call, sizeof(__pyx_k_set_census_context_on_call), 0, 0, 1, 1},
+    {&__pyx_n_s_set_code, __pyx_k_set_code, sizeof(__pyx_k_set_code), 0, 0, 1, 1},
+    {&__pyx_n_s_set_compression, __pyx_k_set_compression, sizeof(__pyx_k_set_compression), 0, 0, 1, 1},
+    {&__pyx_n_s_set_credentials, __pyx_k_set_credentials, sizeof(__pyx_k_set_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_set_details, __pyx_k_set_details, sizeof(__pyx_k_set_details), 0, 0, 1, 1},
+    {&__pyx_n_s_set_exception, __pyx_k_set_exception, sizeof(__pyx_k_set_exception), 0, 0, 1, 1},
+    {&__pyx_n_s_set_instrumentation_context_on_c, __pyx_k_set_instrumentation_context_on_c, sizeof(__pyx_k_set_instrumentation_context_on_c), 0, 0, 1, 1},
+    {&__pyx_n_s_set_internal_error, __pyx_k_set_internal_error, sizeof(__pyx_k_set_internal_error), 0, 0, 1, 1},
+    {&__pyx_n_s_set_name, __pyx_k_set_name, sizeof(__pyx_k_set_name), 0, 0, 1, 1},
+    {&__pyx_n_s_set_result, __pyx_k_set_result, sizeof(__pyx_k_set_result), 0, 0, 1, 1},
+    {&__pyx_n_s_set_server_call_tracer_factory, __pyx_k_set_server_call_tracer_factory, sizeof(__pyx_k_set_server_call_tracer_factory), 0, 0, 1, 1},
+    {&__pyx_n_s_set_trailing_metadata, __pyx_k_set_trailing_metadata, sizeof(__pyx_k_set_trailing_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_setblocking, __pyx_k_setblocking, sizeof(__pyx_k_setblocking), 0, 0, 1, 1},
+    {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1},
+    {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1},
+    {&__pyx_n_s_shield, __pyx_k_shield, sizeof(__pyx_k_shield), 0, 0, 1, 1},
+    {&__pyx_n_s_shutdown, __pyx_k_shutdown, sizeof(__pyx_k_shutdown), 0, 0, 1, 1},
+    {&__pyx_n_s_shutdown_await_next_greenlet, __pyx_k_shutdown_await_next_greenlet, sizeof(__pyx_k_shutdown_await_next_greenlet), 0, 0, 1, 1},
+    {&__pyx_n_s_shutdown_cq, __pyx_k_shutdown_cq, sizeof(__pyx_k_shutdown_cq), 0, 0, 1, 1},
+    {&__pyx_n_s_shutdown_grpc_aio, __pyx_k_shutdown_grpc_aio, sizeof(__pyx_k_shutdown_grpc_aio), 0, 0, 1, 1},
+    {&__pyx_n_s_shutting_down_server, __pyx_k_shutting_down_server, sizeof(__pyx_k_shutting_down_server), 0, 0, 1, 1},
+    {&__pyx_n_s_simplefilter, __pyx_k_simplefilter, sizeof(__pyx_k_simplefilter), 0, 0, 1, 1},
+    {&__pyx_n_s_sleep, __pyx_k_sleep, sizeof(__pyx_k_sleep), 0, 0, 1, 1},
+    {&__pyx_n_s_socket, __pyx_k_socket, sizeof(__pyx_k_socket), 0, 0, 1, 1},
+    {&__pyx_n_s_socket_id, __pyx_k_socket_id, sizeof(__pyx_k_socket_id), 0, 0, 1, 1},
+    {&__pyx_n_s_socketpair, __pyx_k_socketpair, sizeof(__pyx_k_socketpair), 0, 0, 1, 1},
+    {&__pyx_n_s_span_id, __pyx_k_span_id, sizeof(__pyx_k_span_id), 0, 0, 1, 1},
+    {&__pyx_n_s_spawn, __pyx_k_spawn, sizeof(__pyx_k_spawn), 0, 0, 1, 1},
+    {&__pyx_n_s_spawn_callback_async, __pyx_k_spawn_callback_async, sizeof(__pyx_k_spawn_callback_async), 0, 0, 1, 1},
+    {&__pyx_n_s_spawn_callback_in_thread, __pyx_k_spawn_callback_in_thread, sizeof(__pyx_k_spawn_callback_in_thread), 0, 0, 1, 1},
+    {&__pyx_n_s_spawn_greenlets, __pyx_k_spawn_greenlets, sizeof(__pyx_k_spawn_greenlets), 0, 0, 1, 1},
+    {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_k_src_python_grpcio_grpc__cython, sizeof(__pyx_k_src_python_grpcio_grpc__cython), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_10, __pyx_k_src_python_grpcio_grpc__cython_10, sizeof(__pyx_k_src_python_grpcio_grpc__cython_10), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_k_src_python_grpcio_grpc__cython_11, sizeof(__pyx_k_src_python_grpcio_grpc__cython_11), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_12, __pyx_k_src_python_grpcio_grpc__cython_12, sizeof(__pyx_k_src_python_grpcio_grpc__cython_12), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_13, __pyx_k_src_python_grpcio_grpc__cython_13, sizeof(__pyx_k_src_python_grpcio_grpc__cython_13), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_14, __pyx_k_src_python_grpcio_grpc__cython_14, sizeof(__pyx_k_src_python_grpcio_grpc__cython_14), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_15, __pyx_k_src_python_grpcio_grpc__cython_15, sizeof(__pyx_k_src_python_grpcio_grpc__cython_15), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_16, __pyx_k_src_python_grpcio_grpc__cython_16, sizeof(__pyx_k_src_python_grpcio_grpc__cython_16), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_17, __pyx_k_src_python_grpcio_grpc__cython_17, sizeof(__pyx_k_src_python_grpcio_grpc__cython_17), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_18, __pyx_k_src_python_grpcio_grpc__cython_18, sizeof(__pyx_k_src_python_grpcio_grpc__cython_18), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_19, __pyx_k_src_python_grpcio_grpc__cython_19, sizeof(__pyx_k_src_python_grpcio_grpc__cython_19), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_k_src_python_grpcio_grpc__cython_2, sizeof(__pyx_k_src_python_grpcio_grpc__cython_2), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_20, __pyx_k_src_python_grpcio_grpc__cython_20, sizeof(__pyx_k_src_python_grpcio_grpc__cython_20), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_21, __pyx_k_src_python_grpcio_grpc__cython_21, sizeof(__pyx_k_src_python_grpcio_grpc__cython_21), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_k_src_python_grpcio_grpc__cython_22, sizeof(__pyx_k_src_python_grpcio_grpc__cython_22), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_23, __pyx_k_src_python_grpcio_grpc__cython_23, sizeof(__pyx_k_src_python_grpcio_grpc__cython_23), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_3, __pyx_k_src_python_grpcio_grpc__cython_3, sizeof(__pyx_k_src_python_grpcio_grpc__cython_3), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_k_src_python_grpcio_grpc__cython_4, sizeof(__pyx_k_src_python_grpcio_grpc__cython_4), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_k_src_python_grpcio_grpc__cython_5, sizeof(__pyx_k_src_python_grpcio_grpc__cython_5), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_k_src_python_grpcio_grpc__cython_6, sizeof(__pyx_k_src_python_grpcio_grpc__cython_6), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_7, __pyx_k_src_python_grpcio_grpc__cython_7, sizeof(__pyx_k_src_python_grpcio_grpc__cython_7), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_8, __pyx_k_src_python_grpcio_grpc__cython_8, sizeof(__pyx_k_src_python_grpcio_grpc__cython_8), 0, 0, 1, 0},
+    {&__pyx_kp_s_src_python_grpcio_grpc__cython_9, __pyx_k_src_python_grpcio_grpc__cython_9, sizeof(__pyx_k_src_python_grpcio_grpc__cython_9), 0, 0, 1, 0},
+    {&__pyx_n_s_ssl_session_cache, __pyx_k_ssl_session_cache, sizeof(__pyx_k_ssl_session_cache), 0, 0, 1, 1},
+    {&__pyx_n_s_ssl_target_name_override, __pyx_k_ssl_target_name_override, sizeof(__pyx_k_ssl_target_name_override), 0, 0, 1, 1},
+    {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1},
+    {&__pyx_n_s_start_batch, __pyx_k_start_batch, sizeof(__pyx_k_start_batch), 0, 0, 1, 1},
+    {&__pyx_n_s_start_channel_id, __pyx_k_start_channel_id, sizeof(__pyx_k_start_channel_id), 0, 0, 1, 1},
+    {&__pyx_n_s_start_client_batch, __pyx_k_start_client_batch, sizeof(__pyx_k_start_client_batch), 0, 0, 1, 1},
+    {&__pyx_n_s_start_server_batch, __pyx_k_start_server_batch, sizeof(__pyx_k_start_server_batch), 0, 0, 1, 1},
+    {&__pyx_n_s_start_server_id, __pyx_k_start_server_id, sizeof(__pyx_k_start_server_id), 0, 0, 1, 1},
+    {&__pyx_n_s_start_shutting_down, __pyx_k_start_shutting_down, sizeof(__pyx_k_start_shutting_down), 0, 0, 1, 1},
+    {&__pyx_n_s_start_socket_id, __pyx_k_start_socket_id, sizeof(__pyx_k_start_socket_id), 0, 0, 1, 1},
+    {&__pyx_n_s_started_tag, __pyx_k_started_tag, sizeof(__pyx_k_started_tag), 0, 0, 1, 1},
+    {&__pyx_n_s_started_tags, __pyx_k_started_tags, sizeof(__pyx_k_started_tags), 0, 0, 1, 1},
+    {&__pyx_n_s_state, __pyx_k_state, sizeof(__pyx_k_state), 0, 0, 1, 1},
+    {&__pyx_n_s_status, __pyx_k_status, sizeof(__pyx_k_status), 0, 0, 1, 1},
+    {&__pyx_n_s_status_code, __pyx_k_status_code, sizeof(__pyx_k_status_code), 0, 0, 1, 1},
+    {&__pyx_n_s_status_task, __pyx_k_status_task, sizeof(__pyx_k_status_task), 0, 0, 1, 1},
+    {&__pyx_n_s_stored_ctx, __pyx_k_stored_ctx, sizeof(__pyx_k_stored_ctx), 0, 0, 1, 1},
+    {&__pyx_n_s_str, __pyx_k_str, sizeof(__pyx_k_str), 0, 0, 1, 1},
+    {&__pyx_n_s_str_2, __pyx_k_str_2, sizeof(__pyx_k_str_2), 0, 0, 1, 1},
+    {&__pyx_n_s_stream_handler, __pyx_k_stream_handler, sizeof(__pyx_k_stream_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_stream_stream, __pyx_k_stream_stream, sizeof(__pyx_k_stream_stream), 0, 0, 1, 1},
+    {&__pyx_n_s_stream_unary, __pyx_k_stream_unary, sizeof(__pyx_k_stream_unary), 0, 0, 1, 1},
+    {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0},
+    {&__pyx_n_s_subchannel_id, __pyx_k_subchannel_id, sizeof(__pyx_k_subchannel_id), 0, 0, 1, 1},
+    {&__pyx_n_s_success, __pyx_k_success, sizeof(__pyx_k_success), 0, 0, 1, 1},
+    {&__pyx_n_s_super, __pyx_k_super, sizeof(__pyx_k_super), 0, 0, 1, 1},
+    {&__pyx_n_s_sync_servicer_context, __pyx_k_sync_servicer_context, sizeof(__pyx_k_sync_servicer_context), 0, 0, 1, 1},
+    {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1},
+    {&__pyx_n_s_t, __pyx_k_t, sizeof(__pyx_k_t), 0, 0, 1, 1},
+    {&__pyx_n_s_tag, __pyx_k_tag, sizeof(__pyx_k_tag), 0, 0, 1, 1},
+    {&__pyx_n_s_target, __pyx_k_target, sizeof(__pyx_k_target), 0, 0, 1, 1},
+    {&__pyx_n_s_task, __pyx_k_task, sizeof(__pyx_k_task), 0, 0, 1, 1},
+    {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
+    {&__pyx_kp_s_the_server_has_already_started, __pyx_k_the_server_has_already_started, sizeof(__pyx_k_the_server_has_already_started), 0, 0, 1, 0},
+    {&__pyx_kp_s_the_server_hasn_t_started_yet, __pyx_k_the_server_hasn_t_started_yet, sizeof(__pyx_k_the_server_hasn_t_started_yet), 0, 0, 1, 0},
+    {&__pyx_kp_s_the_server_must_be_shutting_down, __pyx_k_the_server_must_be_shutting_down, sizeof(__pyx_k_the_server_must_be_shutting_down), 0, 0, 1, 0},
+    {&__pyx_n_s_thread, __pyx_k_thread, sizeof(__pyx_k_thread), 0, 0, 1, 1},
+    {&__pyx_n_s_thread_pool, __pyx_k_thread_pool, sizeof(__pyx_k_thread_pool), 0, 0, 1, 1},
+    {&__pyx_n_s_threading, __pyx_k_threading, sizeof(__pyx_k_threading), 0, 0, 1, 1},
+    {&__pyx_n_s_threadpool, __pyx_k_threadpool, sizeof(__pyx_k_threadpool), 0, 0, 1, 1},
+    {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1},
+    {&__pyx_n_s_time, __pyx_k_time, sizeof(__pyx_k_time), 0, 0, 1, 1},
+    {&__pyx_n_s_time_remaining, __pyx_k_time_remaining, sizeof(__pyx_k_time_remaining), 0, 0, 1, 1},
+    {&__pyx_n_s_timeout, __pyx_k_timeout, sizeof(__pyx_k_timeout), 0, 0, 1, 1},
+    {&__pyx_n_s_timeout_secs, __pyx_k_timeout_secs, sizeof(__pyx_k_timeout_secs), 0, 0, 1, 1},
+    {&__pyx_n_s_to_call, __pyx_k_to_call, sizeof(__pyx_k_to_call), 0, 0, 1, 1},
+    {&__pyx_n_s_to_channel_arg, __pyx_k_to_channel_arg, sizeof(__pyx_k_to_channel_arg), 0, 0, 1, 1},
+    {&__pyx_n_s_too_many_operations, __pyx_k_too_many_operations, sizeof(__pyx_k_too_many_operations), 0, 0, 1, 1},
+    {&__pyx_n_s_trace_id, __pyx_k_trace_id, sizeof(__pyx_k_trace_id), 0, 0, 1, 1},
+    {&__pyx_n_s_traceback, __pyx_k_traceback, sizeof(__pyx_k_traceback), 0, 0, 1, 1},
+    {&__pyx_n_s_tracing_enabled, __pyx_k_tracing_enabled, sizeof(__pyx_k_tracing_enabled), 0, 0, 1, 1},
+    {&__pyx_n_s_trailing_metadata, __pyx_k_trailing_metadata, sizeof(__pyx_k_trailing_metadata), 0, 0, 1, 1},
+    {&__pyx_n_s_transient_failure, __pyx_k_transient_failure, sizeof(__pyx_k_transient_failure), 0, 0, 1, 1},
+    {&__pyx_n_s_true, __pyx_k_true, sizeof(__pyx_k_true), 0, 0, 1, 1},
+    {&__pyx_n_s_try_to_connect, __pyx_k_try_to_connect, sizeof(__pyx_k_try_to_connect), 0, 0, 1, 1},
+    {&__pyx_n_s_type, __pyx_k_type, sizeof(__pyx_k_type), 0, 0, 1, 1},
+    {&__pyx_n_s_typing, __pyx_k_typing, sizeof(__pyx_k_typing), 0, 0, 1, 1},
+    {&__pyx_n_s_uds, __pyx_k_uds, sizeof(__pyx_k_uds), 0, 0, 1, 1},
+    {&__pyx_n_s_unary_handler, __pyx_k_unary_handler, sizeof(__pyx_k_unary_handler), 0, 0, 1, 1},
+    {&__pyx_n_s_unary_stream, __pyx_k_unary_stream, sizeof(__pyx_k_unary_stream), 0, 0, 1, 1},
+    {&__pyx_n_s_unary_unary, __pyx_k_unary_unary, sizeof(__pyx_k_unary_unary), 0, 0, 1, 1},
+    {&__pyx_n_s_unauthenticated, __pyx_k_unauthenticated, sizeof(__pyx_k_unauthenticated), 0, 0, 1, 1},
+    {&__pyx_n_s_unavailable, __pyx_k_unavailable, sizeof(__pyx_k_unavailable), 0, 0, 1, 1},
+    {&__pyx_n_s_unimplemented, __pyx_k_unimplemented, sizeof(__pyx_k_unimplemented), 0, 0, 1, 1},
+    {&__pyx_n_s_uninstall_context, __pyx_k_uninstall_context, sizeof(__pyx_k_uninstall_context), 0, 0, 1, 1},
+    {&__pyx_n_s_unknown, __pyx_k_unknown, sizeof(__pyx_k_unknown), 0, 0, 1, 1},
+    {&__pyx_n_s_unused_future, __pyx_k_unused_future, sizeof(__pyx_k_unused_future), 0, 0, 1, 1},
+    {&__pyx_n_s_unused_task, __pyx_k_unused_task, sizeof(__pyx_k_unused_task), 0, 0, 1, 1},
+    {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1},
+    {&__pyx_n_s_upper, __pyx_k_upper, sizeof(__pyx_k_upper), 0, 0, 1, 1},
+    {&__pyx_n_s_use_setstate, __pyx_k_use_setstate, sizeof(__pyx_k_use_setstate), 0, 0, 1, 1},
+    {&__pyx_n_s_used_mask, __pyx_k_used_mask, sizeof(__pyx_k_used_mask), 0, 0, 1, 1},
+    {&__pyx_n_s_user_tag, __pyx_k_user_tag, sizeof(__pyx_k_user_tag), 0, 0, 1, 1},
+    {&__pyx_n_s_utf8, __pyx_k_utf8, sizeof(__pyx_k_utf8), 0, 0, 1, 1},
+    {&__pyx_kp_s_utf_8, __pyx_k_utf_8, sizeof(__pyx_k_utf_8), 0, 0, 1, 0},
+    {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1},
+    {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1},
+    {&__pyx_n_s_wait, __pyx_k_wait, sizeof(__pyx_k_wait), 0, 0, 1, 1},
+    {&__pyx_n_s_wait_for, __pyx_k_wait_for, sizeof(__pyx_k_wait_for), 0, 0, 1, 1},
+    {&__pyx_n_s_wait_for_ready, __pyx_k_wait_for_ready, sizeof(__pyx_k_wait_for_ready), 0, 0, 1, 1},
+    {&__pyx_n_s_wait_for_ready_explicitly_set, __pyx_k_wait_for_ready_explicitly_set, sizeof(__pyx_k_wait_for_ready_explicitly_set), 0, 0, 1, 1},
+    {&__pyx_n_s_wait_for_termination, __pyx_k_wait_for_termination, sizeof(__pyx_k_wait_for_termination), 0, 0, 1, 1},
+    {&__pyx_n_s_wait_time, __pyx_k_wait_time, sizeof(__pyx_k_wait_time), 0, 0, 1, 1},
+    {&__pyx_n_s_warning, __pyx_k_warning, sizeof(__pyx_k_warning), 0, 0, 1, 1},
+    {&__pyx_n_s_warnings, __pyx_k_warnings, sizeof(__pyx_k_warnings), 0, 0, 1, 1},
+    {&__pyx_n_s_watch_connectivity_state, __pyx_k_watch_connectivity_state, sizeof(__pyx_k_watch_connectivity_state), 0, 0, 1, 1},
+    {&__pyx_n_s_wrap, __pyx_k_wrap, sizeof(__pyx_k_wrap), 0, 0, 1, 1},
+    {&__pyx_n_s_wrapper, __pyx_k_wrapper, sizeof(__pyx_k_wrapper), 0, 0, 1, 1},
+    {&__pyx_n_s_write, __pyx_k_write, sizeof(__pyx_k_write), 0, 0, 1, 1},
+    {&__pyx_n_s_write_flag, __pyx_k_write_flag, sizeof(__pyx_k_write_flag), 0, 0, 1, 1},
+    {&__pyx_n_s_xds, __pyx_k_xds, sizeof(__pyx_k_xds), 0, 0, 1, 1},
+    {&__pyx_n_s_xds_server_credentials, __pyx_k_xds_server_credentials, sizeof(__pyx_k_xds_server_credentials), 0, 0, 1, 1},
+    {&__pyx_n_s_yes, __pyx_k_yes, sizeof(__pyx_k_yes), 0, 0, 1, 1},
+    {&__pyx_n_s_yield_to_queue, __pyx_k_yield_to_queue, sizeof(__pyx_k_yield_to_queue), 0, 0, 1, 1},
+    {0, 0, 0, 0, 0, 0, 0}
+  };
+  return __Pyx_InitStrings(__pyx_string_tab);
+}
+/* #### Code section: cached_builtins ### */
+static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
+  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(0, 28, __pyx_L1_error)
+  __pyx_builtin_object = __Pyx_GetBuiltinName(__pyx_n_s_object); if (!__pyx_builtin_object) __PYX_ERR(1, 102, __pyx_L1_error)
+  __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(2, 24, __pyx_L1_error)
+  __pyx_builtin_UnicodeDecodeError = __Pyx_GetBuiltinName(__pyx_n_s_UnicodeDecodeError); if (!__pyx_builtin_UnicodeDecodeError) __PYX_ERR(2, 49, __pyx_L1_error)
+  __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(3, 74, __pyx_L1_error)
+  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(4, 26, __pyx_L1_error)
+  __pyx_builtin_NotImplementedError = __Pyx_GetBuiltinName(__pyx_n_s_NotImplementedError); if (!__pyx_builtin_NotImplementedError) __PYX_ERR(5, 34, __pyx_L1_error)
+  __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(5, 252, __pyx_L1_error)
+  __pyx_builtin_KeyError = __Pyx_GetBuiltinName(__pyx_n_s_KeyError); if (!__pyx_builtin_KeyError) __PYX_ERR(6, 31, __pyx_L1_error)
+  __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(6, 31, __pyx_L1_error)
+  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(6, 113, __pyx_L1_error)
+  __pyx_builtin_DeprecationWarning = __Pyx_GetBuiltinName(__pyx_n_s_DeprecationWarning); if (!__pyx_builtin_DeprecationWarning) __PYX_ERR(6, 188, __pyx_L1_error)
+  __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(7, 108, __pyx_L1_error)
+  __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(8, 58, __pyx_L1_error)
+  __pyx_builtin_KeyboardInterrupt = __Pyx_GetBuiltinName(__pyx_n_s_KeyboardInterrupt); if (!__pyx_builtin_KeyboardInterrupt) __PYX_ERR(9, 701, __pyx_L1_error)
+  __pyx_builtin_SystemExit = __Pyx_GetBuiltinName(__pyx_n_s_SystemExit); if (!__pyx_builtin_SystemExit) __PYX_ERR(9, 701, __pyx_L1_error)
+  return 0;
+  __pyx_L1_error:;
+  return -1;
+}
+/* #### Code section: cached_constants ### */
+
+static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
+
+  /* "cfunc.to_py":67
+ * @cname("__Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg")
+ * cdef object __Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg(object (*f)(_LatentEventArg) ):
+ *     def wrap(_LatentEventArg latent_event_arg):             # <<<<<<<<<<<<<<
+ *         """wrap(latent_event_arg: '_LatentEventArg')"""
+ *         return f(latent_event_arg)
+ */
+  __pyx_tuple_ = PyTuple_Pack(1, __pyx_n_s_latent_event_arg); if (unlikely(!__pyx_tuple_)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple_);
+  __Pyx_GIVEREF(__pyx_tuple_);
+  __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_wrap, 67, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __pyx_codeobj__3 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_wrap, 67, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__3)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __pyx_tuple__4 = PyTuple_Pack(2, __pyx_n_s_cb, __pyx_n_s_args); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__4);
+  __Pyx_GIVEREF(__pyx_tuple__4);
+  __pyx_codeobj__5 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_wrap, 67, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__5)) __PYX_ERR(10, 67, __pyx_L1_error)
+  __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_wrap, 67, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(10, 67, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":26
+ *   def _start_batch(self, operations, tag, retain_self):
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")             # <<<<<<<<<<<<<<
+ *     cdef _BatchOperationTag batch_operation_tag = _BatchOperationTag(
+ *         tag, operations, self if retain_self else None)
+ */
+  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_invalid_call_object_cannot_be_us); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(4, 26, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__8);
+  __Pyx_GIVEREF(__pyx_tuple__8);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":53
+ *       raise ValueError("invalid call object cannot be used from Python")
+ *     if (details is None) != (error_code == GRPC_STATUS__DO_NOT_USE):
+ *       raise ValueError("if error_code is specified, so must details "             # <<<<<<<<<<<<<<
+ *                        "(and vice-versa)")
+ *     cdef grpc_call_error result
+ */
+  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_if_error_code_is_specified_so_mu); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(4, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__10);
+  __Pyx_GIVEREF(__pyx_tuple__10);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":85
+ *       if exclude_prefix in method_name:
+ *         return
+ *     with _observability.get_plugin() as plugin:             # <<<<<<<<<<<<<<
+ *       if not (plugin and plugin.observability_enabled):
+ *         return
+ */
+  __pyx_tuple__11 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(12, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__11);
+  __Pyx_GIVEREF(__pyx_tuple__11);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":342
+ *   call_state = _CallState()
+ * 
+ *   def on_success(started_tags):             # <<<<<<<<<<<<<<
+ *     for started_tag in started_tags:
+ *       state.integrated_call_states[started_tag] = call_state
+ */
+  __pyx_tuple__12 = PyTuple_Pack(2, __pyx_n_s_started_tags, __pyx_n_s_started_tag); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(12, 342, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__12);
+  __Pyx_GIVEREF(__pyx_tuple__12);
+  __pyx_codeobj__13 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_on_success, 342, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__13)) __PYX_ERR(12, 342, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":385
+ * 
+ *   def next_event(self):
+ *     def on_success(tag):             # <<<<<<<<<<<<<<
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ */
+  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_n_s_tag); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(12, 385, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__14);
+  __Pyx_GIVEREF(__pyx_tuple__14);
+  __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_on_success, 385, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(12, 385, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":388
+ *       _process_segregated_call_tag(
+ *         self._channel_state, self._call_state, self._c_completion_queue, tag)
+ *     def on_failure():             # <<<<<<<<<<<<<<
+ *       self._call_state.due.clear()
+ *       with nogil:
+ */
+  __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_on_failure, 388, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(12, 388, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":407
+ *   cdef grpc_completion_queue *c_completion_queue
+ * 
+ *   def on_success(started_tags):             # <<<<<<<<<<<<<<
+ *     state.segregated_call_states.add(call_state)
+ * 
+ */
+  __pyx_tuple__17 = PyTuple_Pack(1, __pyx_n_s_started_tags); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(12, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__17);
+  __Pyx_GIVEREF(__pyx_tuple__17);
+  __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_on_success, 407, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) __PYX_ERR(12, 407, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":414
+ *       c_completion_queue = (grpc_completion_queue_create_for_next(NULL))
+ *     else:
+ *       raise ValueError('Cannot invoke RPC on closed channel!')             # <<<<<<<<<<<<<<
+ * 
+ *   try:
+ */
+  __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_Cannot_invoke_RPC_on_closed_chan); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(12, 414, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__19);
+  __Pyx_GIVEREF(__pyx_tuple__19);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":537
+ * 
+ *   def next_call_event(self):
+ *     def on_success(tag):             # <<<<<<<<<<<<<<
+ *       if tag is not None:
+ *         _process_integrated_call_tag(self._state, tag)
+ */
+  __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_on_success, 537, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) __PYX_ERR(12, 537, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":47
+ *   cdef size_t metadata_count
+ *   cdef grpc_metadata *c_metadata
+ *   def callback(metadata, grpc_status_code status, bytes error_details):             # <<<<<<<<<<<<<<
+ *     cdef char* c_error_details = NULL
+ *     if error_details is not None:
+ */
+  __pyx_tuple__21 = PyTuple_Pack(4, __pyx_n_s_metadata, __pyx_n_s_status, __pyx_n_s_error_details, __pyx_n_s_c_error_details); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(5, 47, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__21);
+  __Pyx_GIVEREF(__pyx_tuple__21);
+  __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_callback, 47, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(5, 47, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":244
+ *   for pair in pem_key_cert_pairs:
+ *     if not isinstance(pair, SslPemKeyCertPair):
+ *       raise TypeError("expected pem_key_cert_pairs to be sequence of "             # <<<<<<<<<<<<<<
+ *                       "SslPemKeyCertPair")
+ *   cdef size_t c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs)
+ */
+  __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_expected_pem_key_cert_pairs_to_b); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(5, 244, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__23);
+  __Pyx_GIVEREF(__pyx_tuple__23);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":300
+ *                                                bint force_client_auth):
+ *   if not isinstance(initial_cert_config, grpc.ServerCertificateConfiguration):
+ *     raise TypeError(             # <<<<<<<<<<<<<<
+ *         'initial_cert_config must be a grpc.ServerCertificateConfiguration')
+ *   if not callable(cert_config_fetcher):
+ */
+  __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_initial_cert_config_must_be_a_gr); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(5, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__24);
+  __Pyx_GIVEREF(__pyx_tuple__24);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":303
+ *         'initial_cert_config must be a grpc.ServerCertificateConfiguration')
+ *   if not callable(cert_config_fetcher):
+ *     raise TypeError('cert_config_fetcher must be callable')             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.initial_cert_config = initial_cert_config
+ */
+  __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_cert_config_fetcher_must_be_call); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(5, 303, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__25);
+  __Pyx_GIVEREF(__pyx_tuple__25);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":323
+ *   cdef ServerCertificateConfig cert_config = None
+ *   if not user_data:
+ *     raise ValueError('internal error: user_data must be specified')             # <<<<<<<<<<<<<<
+ *   credentials = <ServerCredentials>user_data
+ *   if not credentials.initial_cert_config_fetched:
+ */
+  __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_internal_error_user_data_must_be); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(5, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__26);
+  __Pyx_GIVEREF(__pyx_tuple__26);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":437
+ *     self._call_creds = call_creds.c()
+ *     if self._call_creds == NULL:
+ *       raise ValueError("Call credentials may not be NULL.")             # <<<<<<<<<<<<<<
+ * 
+ *   cdef grpc_channel_credentials *c(self) except *:
+ */
+  __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_s_Call_credentials_may_not_be_NULL); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(5, 437, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__27);
+  __Pyx_GIVEREF(__pyx_tuple__27);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":122
+ *   def clear(self):
+ *     if not self.is_shutting_down:
+ *       raise ValueError('queue must be shutting down to be cleared')             # <<<<<<<<<<<<<<
+ *     while self.poll().type != GRPC_QUEUE_SHUTDOWN:
+ *       pass
+ */
+  __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_s_queue_must_be_shutting_down_to_b); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(15, 122, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__28);
+  __Pyx_GIVEREF(__pyx_tuple__28);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":40
+ *       CompletionQueue server_queue not None, tag):
+ *     if not self.is_started or self.is_shutting_down:
+ *       raise ValueError("server must be started and not shutting down")             # <<<<<<<<<<<<<<
+ *     if server_queue not in self.registered_completion_queues:
+ *       raise ValueError("server_queue must be a registered completion queue")
+ */
+  __pyx_tuple__29 = PyTuple_Pack(1, __pyx_kp_s_server_must_be_started_and_not_s); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(23, 40, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__29);
+  __Pyx_GIVEREF(__pyx_tuple__29);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":42
+ *       raise ValueError("server must be started and not shutting down")
+ *     if server_queue not in self.registered_completion_queues:
+ *       raise ValueError("server_queue must be a registered completion queue")             # <<<<<<<<<<<<<<
+ *     cdef _RequestCallTag request_call_tag = _RequestCallTag(tag)
+ *     request_call_tag.prepare()
+ */
+  __pyx_tuple__30 = PyTuple_Pack(1, __pyx_kp_s_server_queue_must_be_a_registere); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(23, 42, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__30);
+  __Pyx_GIVEREF(__pyx_tuple__30);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":56
+ *       self, CompletionQueue queue not None):
+ *     if self.is_started:
+ *       raise ValueError("cannot register completion queues after start")             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_server_register_completion_queue(
+ */
+  __pyx_tuple__31 = PyTuple_Pack(1, __pyx_kp_s_cannot_register_completion_queue); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(23, 56, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__31);
+  __Pyx_GIVEREF(__pyx_tuple__31);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":71
+ *     """
+ *     if self.is_started:
+ *       raise ValueError("the server has already started")             # <<<<<<<<<<<<<<
+ *     if backup_queue:
+ *       self.backup_shutdown_queue = CompletionQueue(shutdown_cq=True)
+ */
+  __pyx_tuple__32 = PyTuple_Pack(1, __pyx_kp_s_the_server_has_already_started); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(23, 71, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__32);
+  __Pyx_GIVEREF(__pyx_tuple__32);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":112
+ *   def shutdown(self, CompletionQueue queue not None, tag):
+ *     if queue.is_shutting_down:
+ *       raise ValueError("queue must be live")             # <<<<<<<<<<<<<<
+ *     elif not self.is_started:
+ *       raise ValueError("the server hasn't started yet")
+ */
+  __pyx_tuple__33 = PyTuple_Pack(1, __pyx_kp_s_queue_must_be_live); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(23, 112, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__33);
+  __Pyx_GIVEREF(__pyx_tuple__33);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":114
+ *       raise ValueError("queue must be live")
+ *     elif not self.is_started:
+ *       raise ValueError("the server hasn't started yet")             # <<<<<<<<<<<<<<
+ *     elif self.is_shutting_down:
+ *       return
+ */
+  __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s_the_server_hasn_t_started_yet); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(23, 114, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__34);
+  __Pyx_GIVEREF(__pyx_tuple__34);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":118
+ *       return
+ *     elif queue not in self.registered_completion_queues:
+ *       raise ValueError("expected registered completion queue")             # <<<<<<<<<<<<<<
+ *     else:
+ *       self._c_shutdown(queue, tag)
+ */
+  __pyx_tuple__35 = PyTuple_Pack(1, __pyx_kp_s_expected_registered_completion_q); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(23, 118, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__35);
+  __Pyx_GIVEREF(__pyx_tuple__35);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":17
+ * 
+ * cdef object _custom_op_on_c_call(int op, grpc_call *call):
+ *   raise NotImplementedError("No custom hooks are implemented")             # <<<<<<<<<<<<<<
+ * 
+ * def install_context_from_request_call_event(RequestCallEvent event):
+ */
+  __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s_No_custom_hooks_are_implemented); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(26, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__36);
+  __Pyx_GIVEREF(__pyx_tuple__36);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":99
+ *       break
+ *     fn = to_call[0]
+ *     args = to_call[1:]             # <<<<<<<<<<<<<<
+ *     fn(*args)
+ * 
+ */
+  __pyx_slice__37 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__37)) __PYX_ERR(28, 99, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_slice__37);
+  __Pyx_GIVEREF(__pyx_slice__37);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":123
+ * 
+ *   import gevent
+ *   import gevent.pool             # <<<<<<<<<<<<<<
+ * 
+ *   gevent_hub = gevent.hub
+ */
+  __pyx_tuple__39 = PyTuple_Pack(2, __pyx_n_s_gevent, __pyx_n_s_pool); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(28, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__39);
+  __Pyx_GIVEREF(__pyx_tuple__39);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":52
+ *     def _run_with_context(target):
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):             # <<<<<<<<<<<<<<
+ *             ctx.run(target, *args)
+ *         return _run
+ */
+  __pyx_tuple__40 = PyTuple_Pack(1, __pyx_n_s_args); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(29, 52, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__40);
+  __Pyx_GIVEREF(__pyx_tuple__40);
+  __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_3, __pyx_n_s_run_2, 52, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(29, 52, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":57
+ * else:
+ *     def _run_with_context(target):
+ *         def _run(*args):             # <<<<<<<<<<<<<<
+ *             target(*args)
+ *         return _run
+ */
+  __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_3, __pyx_n_s_run_2, 57, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(29, 57, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":105
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):             # <<<<<<<<<<<<<<
+ *                 try:
+ *                     target(*args)
+ */
+  __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_managed_target, 105, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(1, 105, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":153
+ *     queue = asyncio.Queue(maxsize=1)
+ * 
+ *     def yield_to_queue():             # <<<<<<<<<<<<<<
+ *         try:
+ *             for item in gen:
+ */
+  __pyx_tuple__46 = PyTuple_Pack(1, __pyx_n_s_item); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(6, 153, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__46);
+  __Pyx_GIVEREF(__pyx_tuple__46);
+  __pyx_codeobj__47 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__46, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_yield_to_queue, 153, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__47)) __PYX_ERR(6, 153, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":188
+ *             with warnings.catch_warnings():
+ *                 # Convert DeprecationWarning to errors so we can capture them with except
+ *                 warnings.simplefilter("error", DeprecationWarning)             # <<<<<<<<<<<<<<
+ *                 try:
+ *                     return asyncio.get_event_loop_policy().get_event_loop()
+ */
+  __pyx_tuple__48 = PyTuple_Pack(2, __pyx_n_s_error, __pyx_builtin_DeprecationWarning); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(6, 188, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__48);
+  __Pyx_GIVEREF(__pyx_tuple__48);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":108
+ *             if event.type == GRPC_QUEUE_TIMEOUT:
+ *                 with gil:
+ *                     raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!")             # <<<<<<<<<<<<<<
+ *             elif event.type == GRPC_QUEUE_SHUTDOWN:
+ *                 self._shutdown = True
+ */
+  __pyx_tuple__50 = PyTuple_Pack(1, __pyx_kp_s_Core_should_not_return_GRPC_QUEU); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(7, 108, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__50);
+  __Pyx_GIVEREF(__pyx_tuple__50);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":231
+ *     def set_compression(self, object compression):
+ *         if self._rpc_state.metadata_sent:
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')             # <<<<<<<<<<<<<<
+ *         else:
+ *             self._rpc_state.compression_algorithm = compression
+ */
+  __pyx_tuple__79 = PyTuple_Pack(1, __pyx_kp_s_Compression_setting_must_be_spec); if (unlikely(!__pyx_tuple__79)) __PYX_ERR(9, 231, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__79);
+  __Pyx_GIVEREF(__pyx_tuple__79);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":372
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):             # <<<<<<<<<<<<<<
+ *         for generic_handler in generic_handlers:
+ *             method_handler = generic_handler.service(handler_call_details)
+ */
+  __pyx_tuple__83 = PyTuple_Pack(3, __pyx_n_s_handler_call_details, __pyx_n_s_generic_handler, __pyx_n_s_method_handler); if (unlikely(!__pyx_tuple__83)) __PYX_ERR(9, 372, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__83);
+  __Pyx_GIVEREF(__pyx_tuple__83);
+  __pyx_codeobj__84 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__83, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_query_handlers, 372, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__84)) __PYX_ERR(9, 372, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":744
+ * cdef _add_callback_handler(object rpc_task, RPCState rpc_state):
+ * 
+ *     def handle_callbacks(object unused_task):             # <<<<<<<<<<<<<<
+ *         try:
+ *             for callback in rpc_state.callbacks:
+ */
+  __pyx_tuple__93 = PyTuple_Pack(2, __pyx_n_s_unused_task, __pyx_n_s_callback); if (unlikely(!__pyx_tuple__93)) __PYX_ERR(9, 744, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__93);
+  __Pyx_GIVEREF(__pyx_tuple__93);
+  __pyx_codeobj__94 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__93, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_handle_callbacks, 744, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__94)) __PYX_ERR(9, 744, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":864
+ *     def __cinit__(self, int maximum_concurrent_rpcs):
+ *         if maximum_concurrent_rpcs <= 0:
+ *             raise ValueError("maximum_concurrent_rpcs should be a postive integer")             # <<<<<<<<<<<<<<
+ *         self._maximum_concurrent_rpcs = maximum_concurrent_rpcs
+ *         self._active_rpcs = 0
+ */
+  __pyx_tuple__98 = PyTuple_Pack(1, __pyx_kp_s_maximum_concurrent_rpcs_should_b); if (unlikely(!__pyx_tuple__98)) __PYX_ERR(9, 864, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__98);
+  __Pyx_GIVEREF(__pyx_tuple__98);
+
+  /* "(tree fragment)":4
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ *     if __pyx_checksum not in (0xe3b0c44, 0xda39a3e, 0xd41d8cd):             # <<<<<<<<<<<<<<
+ *         from pickle import PickleError as __pyx_PickleError
+ *         raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xe3b0c44, 0xda39a3e, 0xd41d8cd) = ())" % __pyx_checksum
+ */
+  __pyx_tuple__105 = PyTuple_Pack(3, __pyx_int_238750788, __pyx_int_228825662, __pyx_int_222419149); if (unlikely(!__pyx_tuple__105)) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__105);
+  __Pyx_GIVEREF(__pyx_tuple__105);
+  __pyx_tuple__106 = PyTuple_Pack(3, __pyx_int_171651213, __pyx_int_118587260, __pyx_int_171381981); if (unlikely(!__pyx_tuple__106)) __PYX_ERR(10, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__106);
+  __Pyx_GIVEREF(__pyx_tuple__106);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_tuple__108 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__108)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__108);
+  __Pyx_GIVEREF(__pyx_tuple__108);
+  __pyx_codeobj__109 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__109)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ */
+  __pyx_tuple__110 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_pyx_state); if (unlikely(!__pyx_tuple__110)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__110);
+  __Pyx_GIVEREF(__pyx_tuple__110);
+  __pyx_codeobj__111 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__111)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__112 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__112)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ */
+  __pyx_codeobj__113 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__113)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__114 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__114)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__115 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__115)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":24
+ *     self.references = []
+ * 
+ *   def _start_batch(self, operations, tag, retain_self):             # <<<<<<<<<<<<<<
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")
+ */
+  __pyx_tuple__116 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_operations, __pyx_n_s_tag, __pyx_n_s_retain_self, __pyx_n_s_batch_operation_tag, __pyx_n_s_error); if (unlikely(!__pyx_tuple__116)) __PYX_ERR(4, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__116);
+  __Pyx_GIVEREF(__pyx_tuple__116);
+  __pyx_codeobj__117 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__116, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_7, __pyx_n_s_start_batch, 24, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__117)) __PYX_ERR(4, 24, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":38
+ *     return error
+ * 
+ *   def start_client_batch(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     # We don't reference this call in the operations tag because
+ *     # it should be cancelled when it goes out of scope
+ */
+  __pyx_tuple__118 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_operations, __pyx_n_s_tag); if (unlikely(!__pyx_tuple__118)) __PYX_ERR(4, 38, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__118);
+  __Pyx_GIVEREF(__pyx_tuple__118);
+  __pyx_codeobj__119 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__118, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_7, __pyx_n_s_start_client_batch, 38, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__119)) __PYX_ERR(4, 38, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":43
+ *     return self._start_batch(operations, tag, False)
+ * 
+ *   def start_server_batch(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return self._start_batch(operations, tag, True)
+ * 
+ */
+  __pyx_codeobj__120 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__118, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_7, __pyx_n_s_start_server_batch, 43, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__120)) __PYX_ERR(4, 43, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":46
+ *     return self._start_batch(operations, tag, True)
+ * 
+ *   def cancel(             # <<<<<<<<<<<<<<
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):
+ */
+  __pyx_tuple__121 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_error_code, __pyx_n_s_details, __pyx_n_s_result, __pyx_n_s_c_details); if (unlikely(!__pyx_tuple__121)) __PYX_ERR(4, 46, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__121);
+  __Pyx_GIVEREF(__pyx_tuple__121);
+  __pyx_codeobj__122 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__121, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_7, __pyx_n_s_cancel, 46, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__122)) __PYX_ERR(4, 46, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":69
+ *       return result
+ * 
+ *   def set_credentials(self, CallCredentials call_credentials not None):             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_credentials *c_call_credentials = call_credentials.c()
+ *     cdef grpc_call_error call_error = grpc_call_set_credentials(
+ */
+  __pyx_tuple__123 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_call_credentials, __pyx_n_s_c_call_credentials, __pyx_n_s_call_error); if (unlikely(!__pyx_tuple__123)) __PYX_ERR(4, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__123);
+  __Pyx_GIVEREF(__pyx_tuple__123);
+  __pyx_codeobj__124 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__123, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_7, __pyx_n_s_set_credentials, 69, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__124)) __PYX_ERR(4, 69, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":76
+ *     return call_error
+ * 
+ *   def peer(self):             # <<<<<<<<<<<<<<
+ *     cdef char *peer = NULL
+ *     with nogil:
+ */
+  __pyx_tuple__125 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_peer, __pyx_n_s_result); if (unlikely(!__pyx_tuple__125)) __PYX_ERR(4, 76, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__125);
+  __Pyx_GIVEREF(__pyx_tuple__125);
+  __pyx_codeobj__126 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__125, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_7, __pyx_n_s_peer, 76, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__126)) __PYX_ERR(4, 76, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":96
+ *     return self.c_call != NULL
+ * 
+ *   def _custom_op_on_c_call(self, int op):             # <<<<<<<<<<<<<<
+ *     return _custom_op_on_c_call(op, self.c_call)
+ */
+  __pyx_tuple__127 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_op); if (unlikely(!__pyx_tuple__127)) __PYX_ERR(4, 96, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__127);
+  __Pyx_GIVEREF(__pyx_tuple__127);
+  __pyx_codeobj__128 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__127, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_7, __pyx_n_s_custom_op_on_c_call, 96, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__128)) __PYX_ERR(4, 96, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__129 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__129)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__130 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__130)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__131 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__131)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__132 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__132)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__133 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__133)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__134 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__134)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__135 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__135)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__136 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__136)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":328
+ *     self._call_state = call_state
+ * 
+ *   def operate(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return _operate_from_integrated_call(
+ *         self._channel_state, self._call_state, operations, tag)
+ */
+  __pyx_codeobj__137 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__118, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_operate, 328, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__137)) __PYX_ERR(12, 328, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":332
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ *   def cancel(self, code, details):             # <<<<<<<<<<<<<<
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ */
+  __pyx_tuple__138 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_code, __pyx_n_s_details); if (unlikely(!__pyx_tuple__138)) __PYX_ERR(12, 332, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__138);
+  __Pyx_GIVEREF(__pyx_tuple__138);
+  __pyx_codeobj__139 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__138, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_cancel, 332, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__139)) __PYX_ERR(12, 332, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__140 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__140)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__141 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__141)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":377
+ *     self._call_state = call_state
+ * 
+ *   def operate(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return _operate_from_segregated_call(
+ *         self._channel_state, self._call_state, operations, tag)
+ */
+  __pyx_codeobj__142 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__118, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_operate, 377, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__142)) __PYX_ERR(12, 377, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":381
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ *   def cancel(self, code, details):             # <<<<<<<<<<<<<<
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ */
+  __pyx_codeobj__143 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__138, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_cancel, 381, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__143)) __PYX_ERR(12, 381, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":384
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ *   def next_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       _process_segregated_call_tag(
+ */
+  __pyx_tuple__144 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_on_success, __pyx_n_s_on_success, __pyx_n_s_on_failure, __pyx_n_s_on_failure); if (unlikely(!__pyx_tuple__144)) __PYX_ERR(12, 384, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__144);
+  __Pyx_GIVEREF(__pyx_tuple__144);
+  __pyx_codeobj__145 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__144, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_next_event, 384, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__145)) __PYX_ERR(12, 384, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__146 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__146)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__147 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__147)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":520
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ * 
+ *   def target(self):             # <<<<<<<<<<<<<<
+ *     cdef char *c_target
+ *     with self._state.condition:
+ */
+  __pyx_tuple__148 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_c_target, __pyx_n_s_target); if (unlikely(!__pyx_tuple__148)) __PYX_ERR(12, 520, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__148);
+  __Pyx_GIVEREF(__pyx_tuple__148);
+  __pyx_codeobj__149 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__148, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_target, 520, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__149)) __PYX_ERR(12, 520, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":528
+ *       return target
+ * 
+ *   def integrated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+  __pyx_tuple__150 = PyTuple_Pack(10, __pyx_n_s_self, __pyx_n_s_flags, __pyx_n_s_method, __pyx_n_s_host, __pyx_n_s_deadline, __pyx_n_s_metadata, __pyx_n_s_credentials, __pyx_n_s_operationses_and_tags, __pyx_n_s_context, __pyx_n_s_registered_call_handle); if (unlikely(!__pyx_tuple__150)) __PYX_ERR(12, 528, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__150);
+  __Pyx_GIVEREF(__pyx_tuple__150);
+  __pyx_codeobj__151 = (PyObject*)__Pyx_PyCode_New(10, 0, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__150, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_integrated_call, 528, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__151)) __PYX_ERR(12, 528, __pyx_L1_error)
+  __pyx_tuple__152 = PyTuple_Pack(2, Py_None, Py_None); if (unlikely(!__pyx_tuple__152)) __PYX_ERR(12, 528, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__152);
+  __Pyx_GIVEREF(__pyx_tuple__152);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":536
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def next_call_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       if tag is not None:
+ */
+  __pyx_tuple__153 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_on_success, __pyx_n_s_on_success, __pyx_n_s_queue_deadline); if (unlikely(!__pyx_tuple__153)) __PYX_ERR(12, 536, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__153);
+  __Pyx_GIVEREF(__pyx_tuple__153);
+  __pyx_codeobj__154 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__153, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_next_call_event, 536, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__154)) __PYX_ERR(12, 536, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":550
+ *                             on_success, None, queue_deadline)
+ * 
+ *   def segregated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+  __pyx_codeobj__155 = (PyObject*)__Pyx_PyCode_New(10, 0, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__150, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_segregated_call, 550, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__155)) __PYX_ERR(12, 550, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":558
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def check_connectivity_state(self, bint try_to_connect):             # <<<<<<<<<<<<<<
+ *     with self._state.condition:
+ *       if self._state.open:
+ */
+  __pyx_tuple__156 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_try_to_connect); if (unlikely(!__pyx_tuple__156)) __PYX_ERR(12, 558, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__156);
+  __Pyx_GIVEREF(__pyx_tuple__156);
+  __pyx_codeobj__157 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__156, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_check_connectivity_state, 558, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__157)) __PYX_ERR(12, 558, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":566
+ *         raise ValueError('Cannot invoke RPC: %s' % self._state.closed_reason)
+ * 
+ *   def watch_connectivity_state(             # <<<<<<<<<<<<<<
+ *       self, grpc_connectivity_state last_observed_state, object deadline):
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)
+ */
+  __pyx_tuple__158 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_last_observed_state, __pyx_n_s_deadline); if (unlikely(!__pyx_tuple__158)) __PYX_ERR(12, 566, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__158);
+  __Pyx_GIVEREF(__pyx_tuple__158);
+  __pyx_codeobj__159 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__158, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_watch_connectivity_state, 566, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__159)) __PYX_ERR(12, 566, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":570
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)
+ * 
+ *   def close(self, code, details):             # <<<<<<<<<<<<<<
+ *     _close(self, code, details, False)
+ * 
+ */
+  __pyx_codeobj__160 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__138, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_close, 570, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__160)) __PYX_ERR(12, 570, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":573
+ *     _close(self, code, details, False)
+ * 
+ *   def close_on_fork(self, code, details):             # <<<<<<<<<<<<<<
+ *     _close(self, code, details, True)
+ * 
+ */
+  __pyx_codeobj__161 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__138, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_close_on_fork_2, 573, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__161)) __PYX_ERR(12, 573, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":576
+ *     _close(self, code, details, True)
+ * 
+ *   def get_registered_call_handle(self, method):             # <<<<<<<<<<<<<<
+ *     """
+ *     Get or registers a call handler for a method.
+ */
+  __pyx_tuple__162 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_method); if (unlikely(!__pyx_tuple__162)) __PYX_ERR(12, 576, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__162);
+  __Pyx_GIVEREF(__pyx_tuple__162);
+  __pyx_codeobj__163 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__162, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython, __pyx_n_s_get_registered_call_handle, 576, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__163)) __PYX_ERR(12, 576, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__164 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__164)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__165 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__165)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":16
+ * 
+ * 
+ * def channelz_get_top_channels(start_channel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_top_channels(
+ *         start_channel_id,
+ */
+  __pyx_tuple__166 = PyTuple_Pack(2, __pyx_n_s_start_channel_id, __pyx_n_s_c_returned_str); if (unlikely(!__pyx_tuple__166)) __PYX_ERR(13, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__166);
+  __Pyx_GIVEREF(__pyx_tuple__166);
+  __pyx_codeobj__167 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__166, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_8, __pyx_n_s_channelz_get_top_channels, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__167)) __PYX_ERR(13, 16, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":25
+ *     return c_returned_str
+ * 
+ * def channelz_get_servers(start_server_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_servers(start_server_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_tuple__168 = PyTuple_Pack(2, __pyx_n_s_start_server_id, __pyx_n_s_c_returned_str); if (unlikely(!__pyx_tuple__168)) __PYX_ERR(13, 25, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__168);
+  __Pyx_GIVEREF(__pyx_tuple__168);
+  __pyx_codeobj__169 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__168, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_8, __pyx_n_s_channelz_get_servers, 25, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__169)) __PYX_ERR(13, 25, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":32
+ *     return c_returned_str
+ * 
+ * def channelz_get_server(server_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_server(server_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_tuple__170 = PyTuple_Pack(2, __pyx_n_s_server_id, __pyx_n_s_c_returned_str); if (unlikely(!__pyx_tuple__170)) __PYX_ERR(13, 32, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__170);
+  __Pyx_GIVEREF(__pyx_tuple__170);
+  __pyx_codeobj__171 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__170, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_8, __pyx_n_s_channelz_get_server, 32, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__171)) __PYX_ERR(13, 32, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":39
+ *     return c_returned_str
+ * 
+ * def channelz_get_server_sockets(server_id, start_socket_id, max_results):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_server_sockets(
+ *         server_id,
+ */
+  __pyx_tuple__172 = PyTuple_Pack(4, __pyx_n_s_server_id, __pyx_n_s_start_socket_id, __pyx_n_s_max_results, __pyx_n_s_c_returned_str); if (unlikely(!__pyx_tuple__172)) __PYX_ERR(13, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__172);
+  __Pyx_GIVEREF(__pyx_tuple__172);
+  __pyx_codeobj__173 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__172, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_8, __pyx_n_s_channelz_get_server_sockets, 39, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__173)) __PYX_ERR(13, 39, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":52
+ *     return c_returned_str
+ * 
+ * def channelz_get_channel(channel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_channel(channel_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_tuple__174 = PyTuple_Pack(2, __pyx_n_s_channel_id, __pyx_n_s_c_returned_str); if (unlikely(!__pyx_tuple__174)) __PYX_ERR(13, 52, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__174);
+  __Pyx_GIVEREF(__pyx_tuple__174);
+  __pyx_codeobj__175 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__174, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_8, __pyx_n_s_channelz_get_channel, 52, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__175)) __PYX_ERR(13, 52, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":59
+ *     return c_returned_str
+ * 
+ * def channelz_get_subchannel(subchannel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_subchannel(subchannel_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_tuple__176 = PyTuple_Pack(2, __pyx_n_s_subchannel_id, __pyx_n_s_c_returned_str); if (unlikely(!__pyx_tuple__176)) __PYX_ERR(13, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__176);
+  __Pyx_GIVEREF(__pyx_tuple__176);
+  __pyx_codeobj__177 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__176, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_8, __pyx_n_s_channelz_get_subchannel, 59, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__177)) __PYX_ERR(13, 59, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":66
+ *     return c_returned_str
+ * 
+ * def channelz_get_socket(socket_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_socket(socket_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_tuple__178 = PyTuple_Pack(2, __pyx_n_s_socket_id, __pyx_n_s_c_returned_str); if (unlikely(!__pyx_tuple__178)) __PYX_ERR(13, 66, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__178);
+  __Pyx_GIVEREF(__pyx_tuple__178);
+  __pyx_codeobj__179 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__178, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_8, __pyx_n_s_channelz_get_socket, 66, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__179)) __PYX_ERR(13, 66, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":16
+ * 
+ * 
+ * def dump_xds_configs():             # <<<<<<<<<<<<<<
+ *     cdef grpc_slice client_config_in_slice
+ *     with nogil:
+ */
+  __pyx_tuple__180 = PyTuple_Pack(2, __pyx_n_s_client_config_in_slice, __pyx_n_s_result); if (unlikely(!__pyx_tuple__180)) __PYX_ERR(14, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__180);
+  __Pyx_GIVEREF(__pyx_tuple__180);
+  __pyx_codeobj__181 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__180, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_9, __pyx_n_s_dump_xds_configs, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__181)) __PYX_ERR(14, 16, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":16
+ * 
+ * 
+ * def _spawn_callback_in_thread(cb_func, args):             # <<<<<<<<<<<<<<
+ *   t = ForkManagedThread(target=cb_func, args=args)
+ *   t.setDaemon(True)
+ */
+  __pyx_tuple__182 = PyTuple_Pack(3, __pyx_n_s_cb_func, __pyx_n_s_args, __pyx_n_s_t); if (unlikely(!__pyx_tuple__182)) __PYX_ERR(5, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__182);
+  __Pyx_GIVEREF(__pyx_tuple__182);
+  __pyx_codeobj__183 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__182, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_spawn_callback_in_thread, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__183)) __PYX_ERR(5, 16, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":23
+ * async_callback_func = _spawn_callback_in_thread
+ * 
+ * def set_async_callback_func(callback_func):             # <<<<<<<<<<<<<<
+ *   global async_callback_func
+ *   async_callback_func = callback_func
+ */
+  __pyx_tuple__184 = PyTuple_Pack(1, __pyx_n_s_callback_func); if (unlikely(!__pyx_tuple__184)) __PYX_ERR(5, 23, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__184);
+  __Pyx_GIVEREF(__pyx_tuple__184);
+  __pyx_codeobj__185 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__184, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_set_async_callback_func, 23, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__185)) __PYX_ERR(5, 23, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":27
+ *   async_callback_func = callback_func
+ * 
+ * def _spawn_callback_async(callback, args):             # <<<<<<<<<<<<<<
+ *   async_callback_func(callback, args)
+ * 
+ */
+  __pyx_tuple__186 = PyTuple_Pack(2, __pyx_n_s_callback, __pyx_n_s_args); if (unlikely(!__pyx_tuple__186)) __PYX_ERR(5, 27, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__186);
+  __Pyx_GIVEREF(__pyx_tuple__186);
+  __pyx_codeobj__187 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__186, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_spawn_callback_async, 27, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__187)) __PYX_ERR(5, 27, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__188 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__188)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ */
+  __pyx_codeobj__189 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__189)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__190 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__190)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__191 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__191)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__192 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__192)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__193 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__193)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_tuple__194 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_state, __pyx_n_s_dict_2, __pyx_n_s_use_setstate); if (unlikely(!__pyx_tuple__194)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__194);
+  __Pyx_GIVEREF(__pyx_tuple__194);
+  __pyx_codeobj__195 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__194, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__195)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_ChannelCredentials__set_state(self, __pyx_state)
+ */
+  __pyx_codeobj__196 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__196)) __PYX_ERR(10, 16, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__197 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__197)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__198 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__198)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__199 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__199)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__200 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__200)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__201 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__201)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__202 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__202)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__203 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__203)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__204 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__204)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__205 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__205)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__206 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__206)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__207 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__207)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__208 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__208)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":257
+ *   return c_ssl_pem_key_cert_pairs
+ * 
+ * def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs,             # <<<<<<<<<<<<<<
+ *                            bint force_client_auth):
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ */
+  __pyx_tuple__209 = PyTuple_Pack(7, __pyx_n_s_pem_root_certs, __pyx_n_s_pem_key_cert_pairs, __pyx_n_s_force_client_auth, __pyx_n_s_credentials, __pyx_n_s_c_pem_root_certs, __pyx_n_s_c_cert_config, __pyx_n_s_c_options); if (unlikely(!__pyx_tuple__209)) __PYX_ERR(5, 257, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__209);
+  __Pyx_GIVEREF(__pyx_tuple__209);
+  __pyx_codeobj__210 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__209, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_server_credentials_ssl, 257, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__210)) __PYX_ERR(5, 257, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":282
+ *   return credentials
+ * 
+ * def server_certificate_config_ssl(pem_root_certs, pem_key_cert_pairs):             # <<<<<<<<<<<<<<
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ */
+  __pyx_tuple__211 = PyTuple_Pack(3, __pyx_n_s_pem_root_certs, __pyx_n_s_pem_key_cert_pairs, __pyx_n_s_cert_config); if (unlikely(!__pyx_tuple__211)) __PYX_ERR(5, 282, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__211);
+  __Pyx_GIVEREF(__pyx_tuple__211);
+  __pyx_codeobj__212 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__211, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_server_certificate_config_ssl, 282, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__212)) __PYX_ERR(5, 282, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":296
+ *   return cert_config
+ * 
+ * def server_credentials_ssl_dynamic_cert_config(initial_cert_config,             # <<<<<<<<<<<<<<
+ *                                                cert_config_fetcher,
+ *                                                bint force_client_auth):
+ */
+  __pyx_tuple__213 = PyTuple_Pack(5, __pyx_n_s_initial_cert_config, __pyx_n_s_cert_config_fetcher, __pyx_n_s_force_client_auth, __pyx_n_s_credentials, __pyx_n_s_c_options); if (unlikely(!__pyx_tuple__213)) __PYX_ERR(5, 296, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__213);
+  __Pyx_GIVEREF(__pyx_tuple__213);
+  __pyx_codeobj__214 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__213, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_server_credentials_ssl_dynamic_c, 296, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__214)) __PYX_ERR(5, 296, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__215 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__215)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__216 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__216)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":370
+ *     return grpc_local_credentials_create(local_connect_type)
+ * 
+ * def channel_credentials_local(grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *   return LocalChannelCredentials(local_connect_type)
+ * 
+ */
+  __pyx_tuple__217 = PyTuple_Pack(1, __pyx_n_s_local_connect_type); if (unlikely(!__pyx_tuple__217)) __PYX_ERR(5, 370, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__217);
+  __Pyx_GIVEREF(__pyx_tuple__217);
+  __pyx_codeobj__218 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__217, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_channel_credentials_local, 370, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__218)) __PYX_ERR(5, 370, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_codeobj__219 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__194, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__219)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_InsecureChannelCredentials__set_state(self, __pyx_state)
+ */
+  __pyx_codeobj__220 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__220)) __PYX_ERR(10, 16, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":378
+ *     return grpc_insecure_credentials_create()
+ * 
+ * def channel_credentials_insecure():             # <<<<<<<<<<<<<<
+ *   return InsecureChannelCredentials()
+ * 
+ */
+  __pyx_codeobj__221 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_channel_credentials_insecure, 378, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__221)) __PYX_ERR(5, 378, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":381
+ *   return InsecureChannelCredentials()
+ * 
+ * def server_credentials_local(grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type)
+ */
+  __pyx_tuple__222 = PyTuple_Pack(2, __pyx_n_s_local_connect_type, __pyx_n_s_credentials); if (unlikely(!__pyx_tuple__222)) __PYX_ERR(5, 381, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__222);
+  __Pyx_GIVEREF(__pyx_tuple__222);
+  __pyx_codeobj__223 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__222, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_server_credentials_local, 381, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__223)) __PYX_ERR(5, 381, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":386
+ *   return credentials
+ * 
+ * def xds_server_credentials(ServerCredentials fallback_credentials):             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_xds_server_credentials_create(fallback_credentials.c_credentials)
+ */
+  __pyx_tuple__224 = PyTuple_Pack(2, __pyx_n_s_fallback_credentials, __pyx_n_s_credentials); if (unlikely(!__pyx_tuple__224)) __PYX_ERR(5, 386, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__224);
+  __Pyx_GIVEREF(__pyx_tuple__224);
+  __pyx_codeobj__225 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__224, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_xds_server_credentials, 386, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__225)) __PYX_ERR(5, 386, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":394
+ *   return credentials
+ * 
+ * def insecure_server_credentials():             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_insecure_server_credentials_create()
+ */
+  __pyx_tuple__226 = PyTuple_Pack(1, __pyx_n_s_credentials); if (unlikely(!__pyx_tuple__226)) __PYX_ERR(5, 394, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__226);
+  __Pyx_GIVEREF(__pyx_tuple__226);
+  __pyx_codeobj__227 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__226, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_insecure_server_credentials, 394, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__227)) __PYX_ERR(5, 394, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__228 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__228)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__229 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__229)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":416
+ * 
+ * 
+ * def channel_credentials_alts(list service_accounts):             # <<<<<<<<<<<<<<
+ *   return ALTSChannelCredentials(service_accounts)
+ * 
+ */
+  __pyx_tuple__230 = PyTuple_Pack(1, __pyx_n_s_service_accounts); if (unlikely(!__pyx_tuple__230)) __PYX_ERR(5, 416, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__230);
+  __Pyx_GIVEREF(__pyx_tuple__230);
+  __pyx_codeobj__231 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__230, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_channel_credentials_alts, 416, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__231)) __PYX_ERR(5, 416, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":420
+ * 
+ * 
+ * def server_credentials_alts():             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   cdef grpc_alts_credentials_options* c_options = grpc_alts_credentials_server_options_create()
+ */
+  __pyx_tuple__232 = PyTuple_Pack(2, __pyx_n_s_credentials, __pyx_n_s_c_options); if (unlikely(!__pyx_tuple__232)) __PYX_ERR(5, 420, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__232);
+  __Pyx_GIVEREF(__pyx_tuple__232);
+  __pyx_codeobj__233 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__232, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_server_credentials_alts, 420, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__233)) __PYX_ERR(5, 420, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__234 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__234)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__235 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__235)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":445
+ * 
+ * 
+ * def channel_credentials_compute_engine(call_creds):             # <<<<<<<<<<<<<<
+ *   return ComputeEngineChannelCredentials(call_creds)
+ */
+  __pyx_tuple__236 = PyTuple_Pack(1, __pyx_n_s_call_creds); if (unlikely(!__pyx_tuple__236)) __PYX_ERR(5, 445, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__236);
+  __Pyx_GIVEREF(__pyx_tuple__236);
+  __pyx_codeobj__237 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__236, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_2, __pyx_n_s_channel_credentials_compute_engi, 445, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__237)) __PYX_ERR(5, 445, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":103
+ *     return event
+ * 
+ *   def _internal_poll(self, deadline):             # <<<<<<<<<<<<<<
+ *     return self._interpret_event(_next(self.c_completion_queue, deadline))
+ * 
+ */
+  __pyx_tuple__238 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_deadline); if (unlikely(!__pyx_tuple__238)) __PYX_ERR(15, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__238);
+  __Pyx_GIVEREF(__pyx_tuple__238);
+  __pyx_codeobj__239 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__238, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_10, __pyx_n_s_internal_poll, 103, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__239)) __PYX_ERR(15, 103, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":108
+ *   # We name this 'poll' to avoid problems with CPython's expectations for
+ *   # 'special' methods (like next and __next__).
+ *   def poll(self, deadline=None):             # <<<<<<<<<<<<<<
+ *     global g_gevent_activated
+ *     if g_gevent_activated:
+ */
+  __pyx_codeobj__240 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__238, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_10, __pyx_n_s_poll, 108, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__240)) __PYX_ERR(15, 108, __pyx_L1_error)
+  __pyx_tuple__241 = PyTuple_Pack(1, Py_None); if (unlikely(!__pyx_tuple__241)) __PYX_ERR(15, 108, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__241);
+  __Pyx_GIVEREF(__pyx_tuple__241);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":115
+ *       return self._internal_poll(deadline)
+ * 
+ *   def shutdown(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_completion_queue_shutdown(self.c_completion_queue)
+ */
+  __pyx_codeobj__242 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_10, __pyx_n_s_shutdown, 115, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__242)) __PYX_ERR(15, 115, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":120
+ *     self.is_shutting_down = True
+ * 
+ *   def clear(self):             # <<<<<<<<<<<<<<
+ *     if not self.is_shutting_down:
+ *       raise ValueError('queue must be shutting down to be cleared')
+ */
+  __pyx_codeobj__243 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_10, __pyx_n_s_clear, 120, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__243)) __PYX_ERR(15, 120, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__244 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__244)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__245 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__245)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__246 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__246)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__247 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__247)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__248 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__248)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__249 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__249)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__250 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__250)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__251 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__251)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__252 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__252)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__253 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__253)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":24
+ * 
+ * 
+ * _Metadatum = collections.namedtuple('_Metadatum', ('key', 'value',))             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_tuple__254 = PyTuple_Pack(2, __pyx_n_s_key, __pyx_n_s_value); if (unlikely(!__pyx_tuple__254)) __PYX_ERR(18, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__254);
+  __Pyx_GIVEREF(__pyx_tuple__254);
+  __pyx_tuple__255 = PyTuple_Pack(2, __pyx_n_s_Metadatum, __pyx_tuple__254); if (unlikely(!__pyx_tuple__255)) __PYX_ERR(18, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__255);
+  __Pyx_GIVEREF(__pyx_tuple__255);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__256 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__256)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ */
+  __pyx_codeobj__257 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__257)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":31
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_INITIAL_METADATA
+ * 
+ */
+  __pyx_codeobj__258 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_type, 31, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__258)) __PYX_ERR(19, 31, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__259 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__259)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__260 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__260)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":58
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_MESSAGE
+ * 
+ */
+  __pyx_codeobj__261 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_type, 58, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__261)) __PYX_ERR(19, 58, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__262 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__262)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__263 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__263)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":80
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ * 
+ */
+  __pyx_codeobj__264 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_type, 80, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__264)) __PYX_ERR(19, 80, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__265 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__265)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__266 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__266)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":99
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_STATUS_FROM_SERVER
+ * 
+ */
+  __pyx_codeobj__267 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_type, 99, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__267)) __PYX_ERR(19, 99, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__268 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__268)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__269 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__269)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":127
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_INITIAL_METADATA
+ * 
+ */
+  __pyx_codeobj__270 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_type, 127, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__270)) __PYX_ERR(19, 127, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":141
+ *     grpc_metadata_array_destroy(&self._c_initial_metadata)
+ * 
+ *   def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *     return self._initial_metadata
+ * 
+ */
+  __pyx_codeobj__271 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_initial_metadata, 141, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__271)) __PYX_ERR(19, 141, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__272 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__272)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__273 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__273)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":150
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_MESSAGE
+ * 
+ */
+  __pyx_codeobj__274 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_type, 150, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__274)) __PYX_ERR(19, 150, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":183
+ *       self._message = None
+ * 
+ *   def message(self):             # <<<<<<<<<<<<<<
+ *     return self._message
+ * 
+ */
+  __pyx_codeobj__275 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_message, 183, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__275)) __PYX_ERR(19, 183, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__276 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__276)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__277 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__277)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":192
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_STATUS_ON_CLIENT
+ * 
+ */
+  __pyx_codeobj__278 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_type, 192, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__278)) __PYX_ERR(19, 192, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":220
+ *       self._error_string = ""
+ * 
+ *   def trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *     return self._trailing_metadata
+ * 
+ */
+  __pyx_codeobj__279 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_trailing_metadata, 220, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__279)) __PYX_ERR(19, 220, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":223
+ *     return self._trailing_metadata
+ * 
+ *   def code(self):             # <<<<<<<<<<<<<<
+ *     return self._code
+ * 
+ */
+  __pyx_codeobj__280 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_code, 223, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__280)) __PYX_ERR(19, 223, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":226
+ *     return self._code
+ * 
+ *   def details(self):             # <<<<<<<<<<<<<<
+ *     return self._details
+ * 
+ */
+  __pyx_codeobj__281 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_details, 226, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__281)) __PYX_ERR(19, 226, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":229
+ *     return self._details
+ * 
+ *   def error_string(self):             # <<<<<<<<<<<<<<
+ *     return self._error_string
+ * 
+ */
+  __pyx_codeobj__282 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_error_string, 229, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__282)) __PYX_ERR(19, 229, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__283 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__283)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__284 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__284)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":238
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_CLOSE_ON_SERVER
+ * 
+ */
+  __pyx_codeobj__285 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_type, 238, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__285)) __PYX_ERR(19, 238, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":249
+ *     self._cancelled = bool(self._c_cancelled)
+ * 
+ *   def cancelled(self):             # <<<<<<<<<<<<<<
+ *     return self._cancelled
+ */
+  __pyx_codeobj__286 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_11, __pyx_n_s_cancelled, 249, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__286)) __PYX_ERR(19, 249, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__287 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__287)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__288 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__288)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__289 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__289)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__290 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__290)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__291 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__291)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__292 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__292)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":170
+ *       grpc_compression_options_init(&self.c_options)
+ * 
+ *   def enable_algorithm(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ */
+  __pyx_tuple__293 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_algorithm); if (unlikely(!__pyx_tuple__293)) __PYX_ERR(21, 170, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__293);
+  __Pyx_GIVEREF(__pyx_tuple__293);
+  __pyx_codeobj__294 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__293, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_12, __pyx_n_s_enable_algorithm, 170, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__294)) __PYX_ERR(21, 170, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":174
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ * 
+ *   def disable_algorithm(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ */
+  __pyx_codeobj__295 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__293, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_12, __pyx_n_s_disable_algorithm, 174, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__295)) __PYX_ERR(21, 174, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":178
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ * 
+ *   def is_algorithm_enabled(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     cdef int result
+ *     with nogil:
+ */
+  __pyx_tuple__296 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_algorithm, __pyx_n_s_result); if (unlikely(!__pyx_tuple__296)) __PYX_ERR(21, 178, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__296);
+  __Pyx_GIVEREF(__pyx_tuple__296);
+  __pyx_codeobj__297 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__296, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_12, __pyx_n_s_is_algorithm_enabled, 178, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__297)) __PYX_ERR(21, 178, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":185
+ *     return result
+ * 
+ *   def to_channel_arg(self):             # <<<<<<<<<<<<<<
+ *     return (
+ *         GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
+ */
+  __pyx_codeobj__298 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_12, __pyx_n_s_to_channel_arg, 185, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__298)) __PYX_ERR(21, 185, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__299 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__299)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__300 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__300)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":192
+ * 
+ * 
+ * def compression_algorithm_name(grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *   cdef const char* name
+ *   with nogil:
+ */
+  __pyx_tuple__301 = PyTuple_Pack(2, __pyx_n_s_algorithm, __pyx_n_s_name); if (unlikely(!__pyx_tuple__301)) __PYX_ERR(21, 192, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__301);
+  __Pyx_GIVEREF(__pyx_tuple__301);
+  __pyx_codeobj__302 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__301, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_12, __pyx_n_s_compression_algorithm_name, 192, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__302)) __PYX_ERR(21, 192, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":200
+ * 
+ * 
+ * def reset_grpc_config_vars():             # <<<<<<<<<<<<<<
+ *   ConfigVars.Reset()
+ */
+  __pyx_codeobj__303 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_12, __pyx_n_s_reset_grpc_config_vars, 200, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__303)) __PYX_ERR(21, 200, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":36
+ * 
+ * 
+ * def peer_identities(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef grpc_auth_property_iterator properties
+ */
+  __pyx_tuple__304 = PyTuple_Pack(5, __pyx_n_s_call, __pyx_n_s_auth_context, __pyx_n_s_properties, __pyx_n_s_property, __pyx_n_s_identities); if (unlikely(!__pyx_tuple__304)) __PYX_ERR(22, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__304);
+  __Pyx_GIVEREF(__pyx_tuple__304);
+  __pyx_codeobj__305 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__304, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_13, __pyx_n_s_peer_identities, 36, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__305)) __PYX_ERR(22, 36, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":55
+ *   return identities if identities else None
+ * 
+ * def peer_identity_key(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef const char* c_key
+ */
+  __pyx_tuple__306 = PyTuple_Pack(4, __pyx_n_s_call, __pyx_n_s_auth_context, __pyx_n_s_c_key, __pyx_n_s_key); if (unlikely(!__pyx_tuple__306)) __PYX_ERR(22, 55, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__306);
+  __Pyx_GIVEREF(__pyx_tuple__306);
+  __pyx_codeobj__307 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__306, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_13, __pyx_n_s_peer_identity_key, 55, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__307)) __PYX_ERR(22, 55, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":69
+ *   return key
+ * 
+ * def auth_context(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef grpc_auth_property_iterator properties
+ */
+  __pyx_tuple__308 = PyTuple_Pack(6, __pyx_n_s_call, __pyx_n_s_auth_context, __pyx_n_s_properties, __pyx_n_s_property, __pyx_n_s_py_auth_context, __pyx_n_s_key); if (unlikely(!__pyx_tuple__308)) __PYX_ERR(22, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__308);
+  __Pyx_GIVEREF(__pyx_tuple__308);
+  __pyx_codeobj__309 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__308, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_13, __pyx_n_s_auth_context, 69, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__309)) __PYX_ERR(22, 69, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":36
+ *     self.references.append(arguments)
+ * 
+ *   def request_call(             # <<<<<<<<<<<<<<
+ *       self, CompletionQueue call_queue not None,
+ *       CompletionQueue server_queue not None, tag):
+ */
+  __pyx_tuple__310 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_call_queue, __pyx_n_s_server_queue, __pyx_n_s_tag, __pyx_n_s_request_call_tag); if (unlikely(!__pyx_tuple__310)) __PYX_ERR(23, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__310);
+  __Pyx_GIVEREF(__pyx_tuple__310);
+  __pyx_codeobj__311 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__310, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_14, __pyx_n_s_request_call_2, 36, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__311)) __PYX_ERR(23, 36, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":53
+ *         <cpython.PyObject *>request_call_tag)
+ * 
+ *   def register_completion_queue(             # <<<<<<<<<<<<<<
+ *       self, CompletionQueue queue not None):
+ *     if self.is_started:
+ */
+  __pyx_tuple__312 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_queue); if (unlikely(!__pyx_tuple__312)) __PYX_ERR(23, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__312);
+  __Pyx_GIVEREF(__pyx_tuple__312);
+  __pyx_codeobj__313 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__312, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_14, __pyx_n_s_register_completion_queue, 53, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__313)) __PYX_ERR(23, 53, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":62
+ *     self.registered_completion_queues.append(queue)
+ * 
+ *   def start(self, backup_queue=True):             # <<<<<<<<<<<<<<
+ *     """Start the Cython gRPC Server.
+ * 
+ */
+  __pyx_tuple__314 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_backup_queue); if (unlikely(!__pyx_tuple__314)) __PYX_ERR(23, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__314);
+  __Pyx_GIVEREF(__pyx_tuple__314);
+  __pyx_codeobj__315 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__314, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_14, __pyx_n_s_start, 62, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__315)) __PYX_ERR(23, 62, __pyx_L1_error)
+  __pyx_tuple__316 = PyTuple_Pack(1, Py_True); if (unlikely(!__pyx_tuple__316)) __PYX_ERR(23, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__316);
+  __Pyx_GIVEREF(__pyx_tuple__316);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":82
+ *       self.backup_shutdown_queue.poll(deadline=time.time())
+ * 
+ *   def add_http2_port(self, bytes address,             # <<<<<<<<<<<<<<
+ *                      ServerCredentials server_credentials=None):
+ *     address = str_to_bytes(address)
+ */
+  __pyx_tuple__317 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_address, __pyx_n_s_server_credentials, __pyx_n_s_result, __pyx_n_s_address_c_string, __pyx_n_s_creds); if (unlikely(!__pyx_tuple__317)) __PYX_ERR(23, 82, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__317);
+  __Pyx_GIVEREF(__pyx_tuple__317);
+  __pyx_codeobj__318 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__317, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_14, __pyx_n_s_add_http2_port, 82, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__318)) __PYX_ERR(23, 82, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":110
+ *           <cpython.PyObject *>server_shutdown_tag)
+ * 
+ *   def shutdown(self, CompletionQueue queue not None, tag):             # <<<<<<<<<<<<<<
+ *     if queue.is_shutting_down:
+ *       raise ValueError("queue must be live")
+ */
+  __pyx_tuple__319 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_queue, __pyx_n_s_tag); if (unlikely(!__pyx_tuple__319)) __PYX_ERR(23, 110, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__319);
+  __Pyx_GIVEREF(__pyx_tuple__319);
+  __pyx_codeobj__320 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__319, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_14, __pyx_n_s_shutdown, 110, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__320)) __PYX_ERR(23, 110, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":127
+ *     self.is_shutdown = True
+ * 
+ *   def cancel_all_calls(self):             # <<<<<<<<<<<<<<
+ *     if not self.is_shutting_down:
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ */
+  __pyx_codeobj__321 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_14, __pyx_n_s_cancel_all_calls, 127, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__321)) __PYX_ERR(23, 127, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":139
+ *   # portion of this is safe to call from __dealloc__, and potentially remove
+ *   # backup_shutdown_queue.
+ *   def destroy(self):             # <<<<<<<<<<<<<<
+ *     if self.c_server != NULL:
+ *       if not self.is_started:
+ */
+  __pyx_codeobj__322 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_14, __pyx_n_s_destroy, 139, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__322)) __PYX_ERR(23, 139, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__323 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__323)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__324 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__324)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_codeobj__325 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__194, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__325)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle__Tag__set_state(self, __pyx_state)
+ */
+  __pyx_codeobj__326 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__326)) __PYX_ERR(10, 16, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__327 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__327)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__328 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__328)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__329 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__329)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__330 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__330)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__331 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__331)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__332 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__332)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__333 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__333)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__334 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__334)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":19
+ *   raise NotImplementedError("No custom hooks are implemented")
+ * 
+ * def install_context_from_request_call_event(RequestCallEvent event):             # <<<<<<<<<<<<<<
+ *   maybe_save_server_trace_context(event)
+ * 
+ */
+  __pyx_tuple__335 = PyTuple_Pack(1, __pyx_n_s_event); if (unlikely(!__pyx_tuple__335)) __PYX_ERR(26, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__335);
+  __Pyx_GIVEREF(__pyx_tuple__335);
+  __pyx_codeobj__336 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__335, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_15, __pyx_n_s_install_context_from_request_cal_2, 19, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__336)) __PYX_ERR(26, 19, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":22
+ *   maybe_save_server_trace_context(event)
+ * 
+ * def install_context_from_request_call_event_aio(GrpcCallWrapper event):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_codeobj__337 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__335, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_15, __pyx_n_s_install_context_from_request_cal, 22, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__337)) __PYX_ERR(26, 22, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":25
+ *   pass
+ * 
+ * def uninstall_context():             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_codeobj__338 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_15, __pyx_n_s_uninstall_context, 25, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__338)) __PYX_ERR(26, 25, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":28
+ *   pass
+ * 
+ * def build_census_context():             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_codeobj__339 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_15, __pyx_n_s_build_census_context, 28, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__339)) __PYX_ERR(26, 28, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_codeobj__340 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__194, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__340)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_CensusContext__set_state(self, __pyx_state)
+ */
+  __pyx_codeobj__341 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__341)) __PYX_ERR(10, 16, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":34
+ *   pass
+ * 
+ * def set_census_context_on_call(_CallState call_state, CensusContext census_ctx):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_tuple__342 = PyTuple_Pack(2, __pyx_n_s_call_state, __pyx_n_s_census_ctx); if (unlikely(!__pyx_tuple__342)) __PYX_ERR(26, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__342);
+  __Pyx_GIVEREF(__pyx_tuple__342);
+  __pyx_codeobj__343 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__342, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_15, __pyx_n_s_set_census_context_on_call, 34, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__343)) __PYX_ERR(26, 34, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":37
+ *   pass
+ * 
+ * def set_instrumentation_context_on_call_aio(GrpcCallWrapper call_state, CensusContext census_ctx):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_codeobj__344 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__342, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_15, __pyx_n_s_set_instrumentation_context_on_c, 37, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__344)) __PYX_ERR(26, 37, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":40
+ *   pass
+ * 
+ * def get_deadline_from_context():             # <<<<<<<<<<<<<<
+ *   return None
+ */
+  __pyx_codeobj__345 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_15, __pyx_n_s_get_deadline_from_context, 40, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__345)) __PYX_ERR(26, 40, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":26
+ * 
+ * 
+ * def set_server_call_tracer_factory(object observability_plugin) -> None:             # <<<<<<<<<<<<<<
+ *   capsule = observability_plugin.create_server_call_tracer_factory()
+ *   capsule_ptr = cpython.PyCapsule_GetPointer(capsule, SERVER_CALL_TRACER_FACTORY)
+ */
+  __pyx_tuple__346 = PyTuple_Pack(3, __pyx_n_s_observability_plugin, __pyx_n_s_capsule, __pyx_n_s_capsule_ptr); if (unlikely(!__pyx_tuple__346)) __PYX_ERR(27, 26, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__346);
+  __Pyx_GIVEREF(__pyx_tuple__346);
+  __pyx_codeobj__347 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__346, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_16, __pyx_n_s_set_server_call_tracer_factory, 26, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__347)) __PYX_ERR(27, 26, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":32
+ * 
+ * 
+ * def clear_server_call_tracer_factory() -> None:             # <<<<<<<<<<<<<<
+ *   _register_server_call_tracer_factory(NULL)
+ * 
+ */
+  __pyx_codeobj__348 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_16, __pyx_n_s_clear_server_call_tracer_factory, 32, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__348)) __PYX_ERR(27, 32, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":36
+ * 
+ * 
+ * def maybe_save_server_trace_context(RequestCallEvent event) -> None:             # <<<<<<<<<<<<<<
+ *   cdef ServerCallTracer* server_call_tracer
+ *   with _observability.get_plugin() as plugin:
+ */
+  __pyx_tuple__349 = PyTuple_Pack(6, __pyx_n_s_event, __pyx_n_s_server_call_tracer, __pyx_n_s_plugin, __pyx_n_s_trace_id, __pyx_n_s_span_id, __pyx_n_s_is_sampled); if (unlikely(!__pyx_tuple__349)) __PYX_ERR(27, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__349);
+  __Pyx_GIVEREF(__pyx_tuple__349);
+  __pyx_codeobj__350 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__349, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_16, __pyx_n_s_maybe_save_server_trace_context, 36, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__350)) __PYX_ERR(27, 36, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":49
+ * 
+ * 
+ * cpdef void gevent_increment_channel_count():             # <<<<<<<<<<<<<<
+ *   global g_channel_count
+ *   cdef int old_channel_count
+ */
+  __pyx_codeobj__351 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_17, __pyx_n_s_gevent_increment_channel_count, 49, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__351)) __PYX_ERR(28, 49, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":61
+ * 
+ * 
+ * cpdef void gevent_decrement_channel_count():             # <<<<<<<<<<<<<<
+ *   global g_channel_count
+ *   with nogil:
+ */
+  __pyx_codeobj__352 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_17, __pyx_n_s_gevent_decrement_channel_count, 61, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__352)) __PYX_ERR(28, 61, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":93
+ *   return to_call
+ * 
+ * def spawn_greenlets():             # <<<<<<<<<<<<<<
+ *   while True:
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())
+ */
+  __pyx_tuple__353 = PyTuple_Pack(3, __pyx_n_s_to_call, __pyx_n_s_fn, __pyx_n_s_args); if (unlikely(!__pyx_tuple__353)) __PYX_ERR(28, 93, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__353);
+  __Pyx_GIVEREF(__pyx_tuple__353);
+  __pyx_codeobj__354 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__353, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_17, __pyx_n_s_spawn_greenlets, 93, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__354)) __PYX_ERR(28, 93, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":102
+ *     fn(*args)
+ * 
+ * def run_spawn_greenlets():             # <<<<<<<<<<<<<<
+ *   g_gevent_pool.spawn(spawn_greenlets)
+ * 
+ */
+  __pyx_codeobj__355 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_17, __pyx_n_s_run_spawn_greenlets, 102, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__355)) __PYX_ERR(28, 102, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":105
+ *   g_gevent_pool.spawn(spawn_greenlets)
+ * 
+ * def shutdown_await_next_greenlet():             # <<<<<<<<<<<<<<
+ *   global g_shutdown_greenlets_to_run_queue
+ *   cdef unique_lock[mutex]* lk
+ */
+  __pyx_tuple__356 = PyTuple_Pack(1, __pyx_n_s_lk); if (unlikely(!__pyx_tuple__356)) __PYX_ERR(28, 105, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__356);
+  __Pyx_GIVEREF(__pyx_tuple__356);
+  __pyx_codeobj__357 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__356, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_17, __pyx_n_s_shutdown_await_next_greenlet, 105, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__357)) __PYX_ERR(28, 105, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":114
+ *   g_greenlets_cv.notify_all()
+ * 
+ * def init_grpc_gevent():             # <<<<<<<<<<<<<<
+ *   # Lazily import gevent
+ *   global gevent_hub
+ */
+  __pyx_tuple__358 = PyTuple_Pack(1, __pyx_n_s_gevent); if (unlikely(!__pyx_tuple__358)) __PYX_ERR(28, 114, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__358);
+  __Pyx_GIVEREF(__pyx_tuple__358);
+  __pyx_codeobj__359 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__358, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_17, __pyx_n_s_init_grpc_gevent, 114, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__359)) __PYX_ERR(28, 114, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * def _contextvars_supported():             # <<<<<<<<<<<<<<
+ *     """Determines if the contextvars module is supported.
+ * 
+ */
+  __pyx_tuple__360 = PyTuple_Pack(1, __pyx_n_s_contextvars); if (unlikely(!__pyx_tuple__360)) __PYX_ERR(29, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__360);
+  __Pyx_GIVEREF(__pyx_tuple__360);
+  __pyx_codeobj__361 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__360, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_3, __pyx_n_s_contextvars_supported, 15, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__361)) __PYX_ERR(29, 15, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":33
+ * 
+ * 
+ * def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *     """Runs a callable with contextvars propagated.
+ * 
+ */
+  __pyx_tuple__362 = PyTuple_Pack(1, __pyx_n_s_target); if (unlikely(!__pyx_tuple__362)) __PYX_ERR(29, 33, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__362);
+  __Pyx_GIVEREF(__pyx_tuple__362);
+  __pyx_codeobj__363 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__362, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_3, __pyx_n_s_run_with_context, 33, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__363)) __PYX_ERR(29, 33, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":50
+ * if _contextvars_supported():
+ *     import contextvars
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):
+ */
+  __pyx_tuple__364 = PyTuple_Pack(4, __pyx_n_s_target, __pyx_n_s_ctx, __pyx_n_s_run_2, __pyx_n_s_run_2); if (unlikely(!__pyx_tuple__364)) __PYX_ERR(29, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__364);
+  __Pyx_GIVEREF(__pyx_tuple__364);
+  __pyx_codeobj__365 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__364, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_3, __pyx_n_s_run_with_context, 50, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__365)) __PYX_ERR(29, 50, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":56
+ *         return _run
+ * else:
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         def _run(*args):
+ *             target(*args)
+ */
+  __pyx_tuple__366 = PyTuple_Pack(3, __pyx_n_s_target, __pyx_n_s_run_2, __pyx_n_s_run_2); if (unlikely(!__pyx_tuple__366)) __PYX_ERR(29, 56, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__366);
+  __Pyx_GIVEREF(__pyx_tuple__366);
+  __pyx_codeobj__367 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__366, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_3, __pyx_n_s_run_with_context, 56, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__367)) __PYX_ERR(29, 56, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":33
+ * # This flag is also not supported for non-native IO manager.
+ * _GRPC_ENABLE_FORK_SUPPORT = (
+ *     os.environ.get('GRPC_ENABLE_FORK_SUPPORT', '0')             # <<<<<<<<<<<<<<
+ *         .lower() in _TRUE_VALUES)
+ * 
+ */
+  __pyx_tuple__368 = PyTuple_Pack(2, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT_2, __pyx_kp_s_0); if (unlikely(!__pyx_tuple__368)) __PYX_ERR(1, 33, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__368);
+  __Pyx_GIVEREF(__pyx_tuple__368);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":89
+ * 
+ * 
+ * def fork_handlers_and_grpc_init():             # <<<<<<<<<<<<<<
+ *     grpc_init()
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ */
+  __pyx_codeobj__369 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_fork_handlers_and_grpc_init, 89, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__369)) __PYX_ERR(1, 89, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":102
+ * 
+ * 
+ * class ForkManagedThread(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ */
+  __pyx_tuple__370 = PyTuple_Pack(1, __pyx_builtin_object); if (unlikely(!__pyx_tuple__370)) __PYX_ERR(1, 102, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__370);
+  __Pyx_GIVEREF(__pyx_tuple__370);
+  __pyx_tuple__371 = PyTuple_Pack(1, __pyx_builtin_object); if (unlikely(!__pyx_tuple__371)) __PYX_ERR(1, 102, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__371);
+  __Pyx_GIVEREF(__pyx_tuple__371);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":103
+ * 
+ * class ForkManagedThread(object):
+ *     def __init__(self, target, args=()):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):
+ */
+  __pyx_tuple__372 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_target, __pyx_n_s_args, __pyx_n_s_managed_target, __pyx_n_s_managed_target); if (unlikely(!__pyx_tuple__372)) __PYX_ERR(1, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__372);
+  __Pyx_GIVEREF(__pyx_tuple__372);
+  __pyx_codeobj__373 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__372, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_init, 103, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__373)) __PYX_ERR(1, 103, __pyx_L1_error)
+  __pyx_tuple__374 = PyTuple_Pack(1, ((PyObject*)__pyx_empty_tuple)); if (unlikely(!__pyx_tuple__374)) __PYX_ERR(1, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__374);
+  __Pyx_GIVEREF(__pyx_tuple__374);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":114
+ *             self._thread = threading.Thread(target=_run_with_context(target), args=args)
+ * 
+ *     def setDaemon(self, daemonic):             # <<<<<<<<<<<<<<
+ *         self._thread.daemon = daemonic
+ * 
+ */
+  __pyx_tuple__375 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_daemonic); if (unlikely(!__pyx_tuple__375)) __PYX_ERR(1, 114, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__375);
+  __Pyx_GIVEREF(__pyx_tuple__375);
+  __pyx_codeobj__376 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__375, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_setDaemon, 114, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__376)) __PYX_ERR(1, 114, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":117
+ *         self._thread.daemon = daemonic
+ * 
+ *     def start(self):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             _fork_state.active_thread_count.increment()
+ */
+  __pyx_codeobj__377 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_start, 117, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__377)) __PYX_ERR(1, 117, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":122
+ *         self._thread.start()
+ * 
+ *     def join(self):             # <<<<<<<<<<<<<<
+ *         self._thread.join()
+ * 
+ */
+  __pyx_codeobj__378 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_join, 122, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__378)) __PYX_ERR(1, 122, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":126
+ * 
+ * 
+ * def block_if_fork_in_progress(postfork_state_to_reset=None):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_in_progress_condition:
+ */
+  __pyx_tuple__379 = PyTuple_Pack(1, __pyx_n_s_postfork_state_to_reset); if (unlikely(!__pyx_tuple__379)) __PYX_ERR(1, 126, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__379);
+  __Pyx_GIVEREF(__pyx_tuple__379);
+  __pyx_codeobj__380 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__379, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_block_if_fork_in_progress, 126, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__380)) __PYX_ERR(1, 126, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":138
+ * 
+ * 
+ * def enter_user_request_generator():             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.decrement()
+ */
+  __pyx_codeobj__381 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_enter_user_request_generator, 138, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__381)) __PYX_ERR(1, 138, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":143
+ * 
+ * 
+ * def return_from_user_request_generator():             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.increment()
+ */
+  __pyx_codeobj__382 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_return_from_user_request_generat, 143, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__382)) __PYX_ERR(1, 143, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":149
+ * 
+ * 
+ * def get_fork_epoch():             # <<<<<<<<<<<<<<
+ *     return _fork_state.fork_epoch
+ * 
+ */
+  __pyx_codeobj__383 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_get_fork_epoch, 149, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__383)) __PYX_ERR(1, 149, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":153
+ * 
+ * 
+ * def is_fork_support_enabled():             # <<<<<<<<<<<<<<
+ *     return _GRPC_ENABLE_FORK_SUPPORT
+ * 
+ */
+  __pyx_codeobj__384 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_is_fork_support_enabled, 153, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__384)) __PYX_ERR(1, 153, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":157
+ * 
+ * 
+ * def fork_register_channel(channel):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.add(channel)
+ */
+  __pyx_tuple__385 = PyTuple_Pack(1, __pyx_n_s_channel); if (unlikely(!__pyx_tuple__385)) __PYX_ERR(1, 157, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__385);
+  __Pyx_GIVEREF(__pyx_tuple__385);
+  __pyx_codeobj__386 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__385, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_fork_register_channel, 157, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__386)) __PYX_ERR(1, 157, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":162
+ * 
+ * 
+ * def fork_unregister_channel(channel):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.discard(channel)
+ */
+  __pyx_codeobj__387 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__385, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_fork_unregister_channel, 162, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__387)) __PYX_ERR(1, 162, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":167
+ * 
+ * 
+ * class _ActiveThreadCount(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self):
+ *         self._num_active_threads = 0
+ */
+  __pyx_tuple__388 = PyTuple_Pack(1, __pyx_builtin_object); if (unlikely(!__pyx_tuple__388)) __PYX_ERR(1, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__388);
+  __Pyx_GIVEREF(__pyx_tuple__388);
+  __pyx_tuple__389 = PyTuple_Pack(1, __pyx_builtin_object); if (unlikely(!__pyx_tuple__389)) __PYX_ERR(1, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__389);
+  __Pyx_GIVEREF(__pyx_tuple__389);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":168
+ * 
+ * class _ActiveThreadCount(object):
+ *     def __init__(self):             # <<<<<<<<<<<<<<
+ *         self._num_active_threads = 0
+ *         self._condition = threading.Condition()
+ */
+  __pyx_codeobj__390 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_init, 168, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__390)) __PYX_ERR(1, 168, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":172
+ *         self._condition = threading.Condition()
+ * 
+ *     def increment(self):             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             self._num_active_threads += 1
+ */
+  __pyx_codeobj__391 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_increment, 172, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__391)) __PYX_ERR(1, 172, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":176
+ *             self._num_active_threads += 1
+ * 
+ *     def decrement(self):             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             self._num_active_threads -= 1
+ */
+  __pyx_codeobj__392 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_decrement, 176, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__392)) __PYX_ERR(1, 176, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":182
+ *                 self._condition.notify_all()
+ * 
+ *     def await_zero_threads(self, timeout_secs):             # <<<<<<<<<<<<<<
+ *         end_time = time.time() + timeout_secs
+ *         wait_time = timeout_secs
+ */
+  __pyx_tuple__393 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_timeout_secs, __pyx_n_s_end_time, __pyx_n_s_wait_time); if (unlikely(!__pyx_tuple__393)) __PYX_ERR(1, 182, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__393);
+  __Pyx_GIVEREF(__pyx_tuple__393);
+  __pyx_codeobj__394 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__393, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_await_zero_threads, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__394)) __PYX_ERR(1, 182, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":199
+ * 
+ * 
+ * class _ForkState(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self):
+ *         self.fork_in_progress_condition = threading.Condition()
+ */
+  __pyx_tuple__395 = PyTuple_Pack(1, __pyx_builtin_object); if (unlikely(!__pyx_tuple__395)) __PYX_ERR(1, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__395);
+  __Pyx_GIVEREF(__pyx_tuple__395);
+  __pyx_tuple__396 = PyTuple_Pack(1, __pyx_builtin_object); if (unlikely(!__pyx_tuple__396)) __PYX_ERR(1, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__396);
+  __Pyx_GIVEREF(__pyx_tuple__396);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":200
+ * 
+ * class _ForkState(object):
+ *     def __init__(self):             # <<<<<<<<<<<<<<
+ *         self.fork_in_progress_condition = threading.Condition()
+ *         self.fork_in_progress = False
+ */
+  __pyx_codeobj__397 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_4, __pyx_n_s_init, 200, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__397)) __PYX_ERR(1, 200, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":61
+ * class _EOF:
+ * 
+ *     def __bool__(self):             # <<<<<<<<<<<<<<
+ *         return False
+ * 
+ */
+  __pyx_codeobj__398 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_bool, 61, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__398)) __PYX_ERR(6, 61, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":64
+ *         return False
+ * 
+ *     def __len__(self):             # <<<<<<<<<<<<<<
+ *         return 0
+ * 
+ */
+  __pyx_codeobj__399 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_len, 64, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__399)) __PYX_ERR(6, 64, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":67
+ *         return 0
+ * 
+ *     def _repr(self) -> str:             # <<<<<<<<<<<<<<
+ *         return '<grpc.aio.EOF>'
+ * 
+ */
+  __pyx_codeobj__400 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_repr, 67, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__400)) __PYX_ERR(6, 67, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":70
+ *         return '<grpc.aio.EOF>'
+ * 
+ *     def __repr__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+  __pyx_codeobj__401 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_repr_2, 70, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__401)) __PYX_ERR(6, 70, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":73
+ *         return self._repr()
+ * 
+ *     def __str__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+  __pyx_codeobj__402 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_str_2, 73, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__402)) __PYX_ERR(6, 73, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":110
+ * 
+ * 
+ * def schedule_coro_threadsafe(object coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         return loop.create_task(coro)
+ */
+  __pyx_tuple__403 = PyTuple_Pack(3, __pyx_n_s_coro, __pyx_n_s_loop, __pyx_n_s_runtime_error); if (unlikely(!__pyx_tuple__403)) __PYX_ERR(6, 110, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__403);
+  __Pyx_GIVEREF(__pyx_tuple__403);
+  __pyx_codeobj__404 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__403, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_schedule_coro_threadsafe, 110, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__404)) __PYX_ERR(6, 110, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":123
+ * 
+ * 
+ * def async_generator_to_generator(object agen, object loop):             # <<<<<<<<<<<<<<
+ *     """Converts an async generator into generator."""
+ *     try:
+ */
+  __pyx_tuple__405 = PyTuple_Pack(4, __pyx_n_s_agen, __pyx_n_s_loop, __pyx_n_s_future, __pyx_n_s_response); if (unlikely(!__pyx_tuple__405)) __PYX_ERR(6, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__405);
+  __Pyx_GIVEREF(__pyx_tuple__405);
+  __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_GENERATOR, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__405, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_async_generator_to_generator, 123, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(6, 123, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":141
+ * 
+ * 
+ * async def generator_to_async_generator(object gen, object loop, object thread_pool):             # <<<<<<<<<<<<<<
+ *     """Converts a generator into async generator.
+ * 
+ */
+  __pyx_tuple__406 = PyTuple_Pack(8, __pyx_n_s_gen, __pyx_n_s_loop, __pyx_n_s_thread_pool, __pyx_n_s_queue, __pyx_n_s_yield_to_queue, __pyx_n_s_yield_to_queue, __pyx_n_s_future, __pyx_n_s_response); if (unlikely(!__pyx_tuple__406)) __PYX_ERR(6, 141, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__406);
+  __Pyx_GIVEREF(__pyx_tuple__406);
+  __pyx_codeobj__45 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_ASYNC_GENERATOR, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__406, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_generator_to_async_generator, 141, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__45)) __PYX_ERR(6, 141, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":177
+ * 
+ * if PY_MAJOR_VERSION >= 3 and PY_MINOR_VERSION >= 7:
+ *     def get_working_loop():             # <<<<<<<<<<<<<<
+ *         """Returns a running event loop.
+ * 
+ */
+  __pyx_codeobj__407 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_get_working_loop, 177, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__407)) __PYX_ERR(6, 177, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":196
+ *                     return asyncio.get_event_loop_policy().new_event_loop()
+ * else:
+ *     def get_working_loop():             # <<<<<<<<<<<<<<
+ *         """Returns a running event loop."""
+ *         return asyncio.get_event_loop()
+ */
+  __pyx_codeobj__408 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_get_working_loop, 196, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__408)) __PYX_ERR(6, 196, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":201
+ * 
+ * 
+ * def raise_if_not_valid_trailing_metadata(object metadata):             # <<<<<<<<<<<<<<
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+  __pyx_tuple__409 = PyTuple_Pack(2, __pyx_n_s_metadata, __pyx_n_s_item); if (unlikely(!__pyx_tuple__409)) __PYX_ERR(6, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__409);
+  __Pyx_GIVEREF(__pyx_tuple__409);
+  __pyx_codeobj__410 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__409, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_5, __pyx_n_s_raise_if_not_valid_trailing_meta, 201, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__410)) __PYX_ERR(6, 201, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":31
+ *         self._debug_error_string = debug_error_string
+ * 
+ *     cpdef grpc_status_code code(self):             # <<<<<<<<<<<<<<
+ *         return self._code
+ * 
+ */
+  __pyx_codeobj__411 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_18, __pyx_n_s_code, 31, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__411)) __PYX_ERR(30, 31, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":34
+ *         return self._code
+ * 
+ *     cpdef str details(self):             # <<<<<<<<<<<<<<
+ *         return self._details
+ * 
+ */
+  __pyx_codeobj__412 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_18, __pyx_n_s_details, 34, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__412)) __PYX_ERR(30, 34, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":37
+ *         return self._details
+ * 
+ *     cpdef tuple trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._trailing_metadata
+ * 
+ */
+  __pyx_codeobj__413 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_18, __pyx_n_s_trailing_metadata, 37, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__413)) __PYX_ERR(30, 37, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":40
+ *         return self._trailing_metadata
+ * 
+ *     cpdef str debug_error_string(self):             # <<<<<<<<<<<<<<
+ *         return self._debug_error_string
+ * 
+ */
+  __pyx_codeobj__414 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_18, __pyx_n_s_debug_error_string, 40, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__414)) __PYX_ERR(30, 40, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__415 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__415)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__416 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__416)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":34
+ * 
+ * 
+ * def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success):             # <<<<<<<<<<<<<<
+ *     CallbackWrapper.functor_run(callback_wrapper.c_functor(), success)
+ * 
+ */
+  __pyx_tuple__417 = PyTuple_Pack(2, __pyx_n_s_callback_wrapper, __pyx_n_s_success); if (unlikely(!__pyx_tuple__417)) __PYX_ERR(7, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__417);
+  __Pyx_GIVEREF(__pyx_tuple__417);
+  __pyx_codeobj__418 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__417, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_19, __pyx_n_s_handle_callback_wrapper, 34, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__418)) __PYX_ERR(7, 34, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__419 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__419)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ */
+  __pyx_codeobj__420 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__420)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":66
+ *                 self._has_reader = False
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         if self.loop:
+ *             if self._has_reader:
+ */
+  __pyx_codeobj__421 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_19, __pyx_n_s_close, 66, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__421)) __PYX_ERR(7, 66, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__422 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__422)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__423 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__423)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":91
+ *         self._queue = cpp_event_queue()
+ * 
+ *     def bind_loop(self, object loop):             # <<<<<<<<<<<<<<
+ *         if loop in self._loops:
+ *             return
+ */
+  __pyx_tuple__424 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_loop); if (unlikely(!__pyx_tuple__424)) __PYX_ERR(7, 91, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__424);
+  __Pyx_GIVEREF(__pyx_tuple__424);
+  __pyx_codeobj__425 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__424, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_19, __pyx_n_s_bind_loop, 91, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__425)) __PYX_ERR(7, 91, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":124
+ *                         self._handle_events(None)
+ * 
+ *     def _poll_wrapper(self):             # <<<<<<<<<<<<<<
+ *         with nogil:
+ *             self._poll()
+ */
+  __pyx_codeobj__426 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_19, __pyx_n_s_poll_wrapper, 124, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__426)) __PYX_ERR(7, 124, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":143
+ *         self._write_socket.close()
+ * 
+ *     def _handle_events(self, object context_loop):             # <<<<<<<<<<<<<<
+ *         cdef bytes data
+ *         if _has_fd_monitoring:
+ */
+  __pyx_tuple__427 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_context_loop, __pyx_n_s_data, __pyx_n_s_event, __pyx_n_s_context, __pyx_n_s_loop); if (unlikely(!__pyx_tuple__427)) __PYX_ERR(7, 143, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__427);
+  __Pyx_GIVEREF(__pyx_tuple__427);
+  __pyx_codeobj__428 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__427, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_19, __pyx_n_s_handle_events, 143, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__428)) __PYX_ERR(7, 143, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__429 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__429)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__430 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__430)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__431 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__431)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__432 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__432)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__433 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__433)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__434 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__434)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":77
+ * 
+ * 
+ * async def execute_batch(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                tuple operations,
+ *                                object loop):
+ */
+  __pyx_tuple__435 = PyTuple_Pack(9, __pyx_n_s_grpc_call_wrapper, __pyx_n_s_operations, __pyx_n_s_loop, __pyx_n_s_batch_operation_tag, __pyx_n_s_future, __pyx_n_s_wrapper, __pyx_n_s_error, __pyx_n_s_grpc_call_error_string, __pyx_n_s_c_event); if (unlikely(!__pyx_tuple__435)) __PYX_ERR(32, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__435);
+  __Pyx_GIVEREF(__pyx_tuple__435);
+  __pyx_codeobj__51 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 9, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__435, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_20, __pyx_n_s_execute_batch, 77, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__51)) __PYX_ERR(32, 77, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":115
+ * 
+ * 
+ * async def _receive_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                            object loop):
+ *     """Retrives parsed messages from Core.
+ */
+  __pyx_tuple__436 = PyTuple_Pack(5, __pyx_n_s_grpc_call_wrapper, __pyx_n_s_loop, __pyx_n_s_receive_op, __pyx_n_s_ops, __pyx_n_s_e); if (unlikely(!__pyx_tuple__436)) __PYX_ERR(32, 115, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__436);
+  __Pyx_GIVEREF(__pyx_tuple__436);
+  __pyx_codeobj__52 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__436, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_20, __pyx_n_s_receive_message, 115, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__52)) __PYX_ERR(32, 115, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":139
+ * 
+ * 
+ * async def _send_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                         bytes message,
+ *                         Operation send_initial_metadata_op,
+ */
+  __pyx_tuple__437 = PyTuple_Pack(7, __pyx_n_s_grpc_call_wrapper, __pyx_n_s_message, __pyx_n_s_send_initial_metadata_op, __pyx_n_s_write_flag, __pyx_n_s_loop, __pyx_n_s_op, __pyx_n_s_ops); if (unlikely(!__pyx_tuple__437)) __PYX_ERR(32, 139, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__437);
+  __Pyx_GIVEREF(__pyx_tuple__437);
+  __pyx_codeobj__53 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__437, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_20, __pyx_n_s_send_message, 139, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__53)) __PYX_ERR(32, 139, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":151
+ * 
+ * 
+ * async def _send_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                  tuple metadata,
+ *                                  int flags,
+ */
+  __pyx_tuple__438 = PyTuple_Pack(6, __pyx_n_s_grpc_call_wrapper, __pyx_n_s_metadata, __pyx_n_s_flags, __pyx_n_s_loop, __pyx_n_s_op, __pyx_n_s_ops); if (unlikely(!__pyx_tuple__438)) __PYX_ERR(32, 151, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__438);
+  __Pyx_GIVEREF(__pyx_tuple__438);
+  __pyx_codeobj__54 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__438, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_20, __pyx_n_s_send_initial_metadata, 151, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__54)) __PYX_ERR(32, 151, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":162
+ * 
+ * 
+ * async def _receive_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                     object loop):
+ *     cdef ReceiveInitialMetadataOperation op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ */
+  __pyx_tuple__439 = PyTuple_Pack(4, __pyx_n_s_grpc_call_wrapper, __pyx_n_s_loop, __pyx_n_s_op, __pyx_n_s_ops); if (unlikely(!__pyx_tuple__439)) __PYX_ERR(32, 162, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__439);
+  __Pyx_GIVEREF(__pyx_tuple__439);
+  __pyx_codeobj__55 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__439, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_20, __pyx_n_s_receive_initial_metadata, 162, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__55)) __PYX_ERR(32, 162, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":169
+ *     return op.initial_metadata()
+ * 
+ * async def _send_error_status_from_server(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                          grpc_status_code code,
+ *                                          str details,
+ */
+  __pyx_tuple__440 = PyTuple_Pack(8, __pyx_n_s_grpc_call_wrapper, __pyx_n_s_code, __pyx_n_s_details, __pyx_n_s_trailing_metadata, __pyx_n_s_send_initial_metadata_op, __pyx_n_s_loop, __pyx_n_s_op, __pyx_n_s_ops); if (unlikely(!__pyx_tuple__440)) __PYX_ERR(32, 169, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__440);
+  __Pyx_GIVEREF(__pyx_tuple__440);
+  __pyx_codeobj__56 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__440, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_20, __pyx_n_s_send_error_status_from_server, 169, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__56)) __PYX_ERR(32, 169, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":17
+ * import enum
+ * 
+ * cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'poller').upper()             # <<<<<<<<<<<<<<
+ * cdef _AioState _global_aio_state = _AioState()
+ * 
+ */
+  __pyx_tuple__441 = PyTuple_Pack(2, __pyx_n_s_GRPC_ASYNCIO_ENGINE, __pyx_n_s_poller); if (unlikely(!__pyx_tuple__441)) __PYX_ERR(33, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__441);
+  __Pyx_GIVEREF(__pyx_tuple__441);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__442 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__442)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__443 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__443)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":68
+ * 
+ * 
+ * def _grpc_shutdown_wrapper(_):             # <<<<<<<<<<<<<<
+ *     """A thin Python wrapper of Core's shutdown function.
+ * 
+ */
+  __pyx_tuple__444 = PyTuple_Pack(1, __pyx_n_s__57); if (unlikely(!__pyx_tuple__444)) __PYX_ERR(33, 68, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__444);
+  __Pyx_GIVEREF(__pyx_tuple__444);
+  __pyx_codeobj__445 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__444, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_21, __pyx_n_s_grpc_shutdown_wrapper, 68, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__445)) __PYX_ERR(33, 68, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":91
+ * 
+ * 
+ * cpdef init_grpc_aio():             # <<<<<<<<<<<<<<
+ *     """Initializes the gRPC AsyncIO module.
+ * 
+ */
+  __pyx_codeobj__446 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_21, __pyx_n_s_init_grpc_aio, 91, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__446)) __PYX_ERR(33, 91, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":104
+ * 
+ * 
+ * cpdef shutdown_grpc_aio():             # <<<<<<<<<<<<<<
+ *     """Shuts down the gRPC AsyncIO module.
+ * 
+ */
+  __pyx_codeobj__447 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_21, __pyx_n_s_shutdown_grpc_aio, 104, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__447)) __PYX_ERR(33, 104, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":69
+ *         shutdown_grpc_aio()
+ * 
+ *     def _repr(self) -> str:             # <<<<<<<<<<<<<<
+ *         """Assembles the RPC representation string."""
+ *         # This needs to be loaded at run time once everything
+ */
+  __pyx_tuple__448 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_common); if (unlikely(!__pyx_tuple__448)) __PYX_ERR(34, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__448);
+  __Pyx_GIVEREF(__pyx_tuple__448);
+  __pyx_codeobj__449 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__448, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_repr, 69, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__449)) __PYX_ERR(34, 69, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":170
+ *         self._waiters_initial_metadata = []
+ * 
+ *     def add_done_callback(self, callback):             # <<<<<<<<<<<<<<
+ *         if self.done():
+ *             callback()
+ */
+  __pyx_tuple__450 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_callback); if (unlikely(!__pyx_tuple__450)) __PYX_ERR(34, 170, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__450);
+  __Pyx_GIVEREF(__pyx_tuple__450);
+  __pyx_codeobj__451 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__450, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_add_done_callback, 170, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__451)) __PYX_ERR(34, 170, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":176
+ *             self._done_callbacks.append(callback)
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         if self._deadline is None:
+ *             return None
+ */
+  __pyx_codeobj__452 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_time_remaining, 176, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__452)) __PYX_ERR(34, 176, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":182
+ *             return max(0, self._deadline - time.time())
+ * 
+ *     def cancel(self, str details):             # <<<<<<<<<<<<<<
+ *         """Cancels the RPC in Core with given RPC status.
+ * 
+ */
+  __pyx_tuple__453 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_details, __pyx_n_s_details_bytes, __pyx_n_s_c_details, __pyx_n_s_error); if (unlikely(!__pyx_tuple__453)) __PYX_ERR(34, 182, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__453);
+  __Pyx_GIVEREF(__pyx_tuple__453);
+  __pyx_codeobj__454 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__453, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_cancel, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__454)) __PYX_ERR(34, 182, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":213
+ *         assert error == GRPC_CALL_OK
+ * 
+ *     def done(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC call has finished.
+ * 
+ */
+  __pyx_codeobj__455 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_done, 213, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__455)) __PYX_ERR(34, 213, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":224
+ *         return self._status is not None
+ * 
+ *     def cancelled(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC was cancelled.
+ * 
+ */
+  __pyx_codeobj__456 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_cancelled, 224, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__456)) __PYX_ERR(34, 224, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":235
+ *         return self._status.code() == StatusCode.cancelled
+ * 
+ *     async def status(self):             # <<<<<<<<<<<<<<
+ *         """Returns the status of the RPC call.
+ * 
+ */
+  __pyx_tuple__457 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_future); if (unlikely(!__pyx_tuple__457)) __PYX_ERR(34, 235, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__457);
+  __Pyx_GIVEREF(__pyx_tuple__457);
+  __pyx_codeobj__59 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__457, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_status, 235, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__59)) __PYX_ERR(34, 235, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":254
+ *         return self._status
+ * 
+ *     def is_ok(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC is ended with ok."""
+ *         return self.done() and self._status.code() == StatusCode.ok
+ */
+  __pyx_codeobj__458 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_is_ok, 254, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__458)) __PYX_ERR(34, 254, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":258
+ *         return self.done() and self._status.code() == StatusCode.ok
+ * 
+ *     async def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *         """Returns the initial metadata of the RPC call.
+ * 
+ */
+  __pyx_codeobj__60 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__457, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_initial_metadata, 258, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__60)) __PYX_ERR(34, 258, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":276
+ *         return self._initial_metadata
+ * 
+ *     def is_locally_cancelled(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC was cancelled locally.
+ * 
+ */
+  __pyx_codeobj__459 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_is_locally_cancelled, 276, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__459)) __PYX_ERR(34, 276, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":288
+ *         return False
+ * 
+ *     def set_internal_error(self, str error_str):             # <<<<<<<<<<<<<<
+ *         self._set_status(AioRpcStatus(
+ *             StatusCode.internal,
+ */
+  __pyx_tuple__460 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_error_str); if (unlikely(!__pyx_tuple__460)) __PYX_ERR(34, 288, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__460);
+  __Pyx_GIVEREF(__pyx_tuple__460);
+  __pyx_codeobj__461 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__460, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_set_internal_error, 288, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__461)) __PYX_ERR(34, 288, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":296
+ *         ))
+ * 
+ *     async def unary_unary(self,             # <<<<<<<<<<<<<<
+ *                           bytes request,
+ *                           tuple outbound_initial_metadata,
+ */
+  __pyx_tuple__462 = PyTuple_Pack(12, __pyx_n_s_self, __pyx_n_s_request, __pyx_n_s_outbound_initial_metadata, __pyx_n_s_context, __pyx_n_s_ops, __pyx_n_s_initial_metadata_op, __pyx_n_s_send_message_op, __pyx_n_s_send_close_op, __pyx_n_s_receive_initial_metadata_op, __pyx_n_s_receive_message_op, __pyx_n_s_receive_status_on_client_op, __pyx_n_s_code); if (unlikely(!__pyx_tuple__462)) __PYX_ERR(34, 296, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__462);
+  __Pyx_GIVEREF(__pyx_tuple__462);
+  __pyx_codeobj__61 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 12, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__462, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_unary_unary, 296, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__61)) __PYX_ERR(34, 296, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":347
+ *             return None
+ * 
+ *     async def _handle_status_once_received(self):             # <<<<<<<<<<<<<<
+ *         """Handles the status sent by peer once received."""
+ *         cdef ReceiveStatusOnClientOperation op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ */
+  __pyx_tuple__463 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_op, __pyx_n_s_ops); if (unlikely(!__pyx_tuple__463)) __PYX_ERR(34, 347, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__463);
+  __Pyx_GIVEREF(__pyx_tuple__463);
+  __pyx_codeobj__62 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__463, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_handle_status_once_received, 347, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__62)) __PYX_ERR(34, 347, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":364
+ *         ))
+ * 
+ *     async def receive_serialized_message(self):             # <<<<<<<<<<<<<<
+ *         """Receives one single raw message in bytes."""
+ *         cdef bytes received_message
+ */
+  __pyx_tuple__464 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_received_message); if (unlikely(!__pyx_tuple__464)) __PYX_ERR(34, 364, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__464);
+  __Pyx_GIVEREF(__pyx_tuple__464);
+  __pyx_codeobj__63 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__464, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_receive_serialized_message, 364, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__63)) __PYX_ERR(34, 364, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":381
+ *             return EOF
+ * 
+ *     async def send_serialized_message(self, bytes message):             # <<<<<<<<<<<<<<
+ *         """Sends one single raw message in bytes."""
+ *         await _send_message(self,
+ */
+  __pyx_tuple__465 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_message); if (unlikely(!__pyx_tuple__465)) __PYX_ERR(34, 381, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__465);
+  __Pyx_GIVEREF(__pyx_tuple__465);
+  __pyx_codeobj__64 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__465, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_send_serialized_message, 381, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__64)) __PYX_ERR(34, 381, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":389
+ *                             self._loop)
+ * 
+ *     async def send_receive_close(self):             # <<<<<<<<<<<<<<
+ *         """Half close the RPC on the client-side."""
+ *         cdef SendCloseFromClientOperation op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ */
+  __pyx_codeobj__65 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__463, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_send_receive_close, 389, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__65)) __PYX_ERR(34, 389, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":395
+ *         await execute_batch(self, ops, self._loop)
+ * 
+ *     async def initiate_unary_stream(self,             # <<<<<<<<<<<<<<
+ *                            bytes request,
+ *                            tuple outbound_initial_metadata,
+ */
+  __pyx_tuple__466 = PyTuple_Pack(10, __pyx_n_s_self, __pyx_n_s_request, __pyx_n_s_outbound_initial_metadata, __pyx_n_s_context, __pyx_n_s_status_task, __pyx_n_s_outbound_ops, __pyx_n_s_initial_metadata_op, __pyx_n_s_send_message_op, __pyx_n_s_send_close_op, __pyx_n_s_batch_error); if (unlikely(!__pyx_tuple__466)) __PYX_ERR(34, 395, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__466);
+  __Pyx_GIVEREF(__pyx_tuple__466);
+  __pyx_codeobj__66 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__466, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_initiate_unary_stream, 395, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__66)) __PYX_ERR(34, 395, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":437
+ *             await status_task
+ * 
+ *     async def stream_unary(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+  __pyx_tuple__467 = PyTuple_Pack(8, __pyx_n_s_self, __pyx_n_s_outbound_initial_metadata, __pyx_n_s_metadata_sent_observer, __pyx_n_s_context, __pyx_n_s_inbound_ops, __pyx_n_s_receive_message_op, __pyx_n_s_receive_status_on_client_op, __pyx_n_s_code); if (unlikely(!__pyx_tuple__467)) __PYX_ERR(34, 437, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__467);
+  __Pyx_GIVEREF(__pyx_tuple__467);
+  __pyx_codeobj__67 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__467, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_stream_unary, 437, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__67)) __PYX_ERR(34, 437, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":496
+ *             return None
+ * 
+ *     async def initiate_stream_stream(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+  __pyx_tuple__468 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_outbound_initial_metadata, __pyx_n_s_metadata_sent_observer, __pyx_n_s_context, __pyx_n_s_status_task, __pyx_n_s_batch_error); if (unlikely(!__pyx_tuple__468)) __PYX_ERR(34, 496, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__468);
+  __Pyx_GIVEREF(__pyx_tuple__468);
+  __pyx_codeobj__68 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__468, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_22, __pyx_n_s_initiate_stream_stream, 496, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__68)) __PYX_ERR(34, 496, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__469 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__469)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__470 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__470)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":61
+ *         return f"<{class_name} {id_}>"
+ * 
+ *     def check_connectivity_state(self, bint try_to_connect):             # <<<<<<<<<<<<<<
+ *         """A Cython wrapper for Core's check connectivity state API."""
+ *         if self._status == AIO_CHANNEL_STATUS_DESTROYED:
+ */
+  __pyx_codeobj__471 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__156, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_23, __pyx_n_s_check_connectivity_state, 61, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__471)) __PYX_ERR(8, 61, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":71
+ *             )
+ * 
+ *     async def watch_connectivity_state(self,             # <<<<<<<<<<<<<<
+ *                                        grpc_connectivity_state last_observed_state,
+ *                                        object deadline):
+ */
+  __pyx_tuple__472 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_last_observed_state, __pyx_n_s_deadline, __pyx_n_s_c_deadline, __pyx_n_s_future, __pyx_n_s_wrapper); if (unlikely(!__pyx_tuple__472)) __PYX_ERR(8, 71, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__472);
+  __Pyx_GIVEREF(__pyx_tuple__472);
+  __pyx_codeobj__72 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__472, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_23, __pyx_n_s_watch_connectivity_state, 71, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__72)) __PYX_ERR(8, 71, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":103
+ *             return True
+ * 
+ *     def closing(self):             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING
+ * 
+ */
+  __pyx_codeobj__473 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_23, __pyx_n_s_closing, 103, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__473)) __PYX_ERR(8, 103, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":106
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_DESTROYED
+ *         grpc_channel_destroy(self.channel)
+ */
+  __pyx_codeobj__474 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_23, __pyx_n_s_close, 106, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__474)) __PYX_ERR(8, 106, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":110
+ *         grpc_channel_destroy(self.channel)
+ * 
+ *     def closed(self):             # <<<<<<<<<<<<<<
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)
+ * 
+ */
+  __pyx_codeobj__475 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_23, __pyx_n_s_closed, 110, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__475)) __PYX_ERR(8, 110, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":113
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)
+ * 
+ *     def call(self,             # <<<<<<<<<<<<<<
+ *              bytes method,
+ *              object deadline,
+ */
+  __pyx_tuple__476 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_method, __pyx_n_s_deadline, __pyx_n_s_python_call_credentials, __pyx_n_s_wait_for_ready, __pyx_n_s_cython_call_credentials); if (unlikely(!__pyx_tuple__476)) __PYX_ERR(8, 113, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__476);
+  __Pyx_GIVEREF(__pyx_tuple__476);
+  __pyx_codeobj__477 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__476, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_23, __pyx_n_s_call, 113, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__477)) __PYX_ERR(8, 113, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__478 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__478)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__479 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__479)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__480 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__480)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__481 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__481)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__482 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__482)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__483 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__483)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":127
+ *         self._loop = loop
+ * 
+ *     async def read(self):             # <<<<<<<<<<<<<<
+ *         cdef bytes raw_message
+ *         self._rpc_state.raise_for_termination()
+ */
+  __pyx_tuple__484 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_raw_message); if (unlikely(!__pyx_tuple__484)) __PYX_ERR(9, 127, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__484);
+  __Pyx_GIVEREF(__pyx_tuple__484);
+  __pyx_codeobj__73 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__484, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_read, 127, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__73)) __PYX_ERR(9, 127, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":140
+ *                             raw_message)
+ * 
+ *     async def write(self, object message):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+  __pyx_codeobj__74 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__465, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_write, 140, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__74)) __PYX_ERR(9, 140, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":150
+ *         self._rpc_state.metadata_sent = True
+ * 
+ *     async def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+  __pyx_tuple__485 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_metadata); if (unlikely(!__pyx_tuple__485)) __PYX_ERR(9, 150, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__485);
+  __Pyx_GIVEREF(__pyx_tuple__485);
+  __pyx_codeobj__75 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__485, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_send_initial_metadata_2, 150, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__75)) __PYX_ERR(9, 150, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":164
+ *             self._rpc_state.metadata_sent = True
+ * 
+ *     async def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+  __pyx_tuple__486 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_code, __pyx_n_s_details, __pyx_n_s_trailing_metadata, __pyx_n_s_actual_code); if (unlikely(!__pyx_tuple__486)) __PYX_ERR(9, 164, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__486);
+  __Pyx_GIVEREF(__pyx_tuple__486);
+  __pyx_codeobj__77 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__486, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_abort, 164, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__77)) __PYX_ERR(9, 164, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":203
+ *             raise self._rpc_state.abort_exception
+ * 
+ *     async def abort_with_status(self, object status):             # <<<<<<<<<<<<<<
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ */
+  __pyx_tuple__487 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_status); if (unlikely(!__pyx_tuple__487)) __PYX_ERR(9, 203, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__487);
+  __Pyx_GIVEREF(__pyx_tuple__487);
+  __pyx_codeobj__78 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__487, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_abort_with_status, 203, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__78)) __PYX_ERR(9, 203, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":206
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ *     def set_trailing_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         raise_if_not_valid_trailing_metadata(metadata)
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ */
+  __pyx_codeobj__488 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__485, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_set_trailing_metadata, 206, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__488)) __PYX_ERR(9, 206, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":210
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ * 
+ *     def trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.trailing_metadata
+ * 
+ */
+  __pyx_codeobj__489 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_trailing_metadata, 210, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__489)) __PYX_ERR(9, 210, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":213
+ *         return self._rpc_state.trailing_metadata
+ * 
+ *     def invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.invocation_metadata()
+ * 
+ */
+  __pyx_codeobj__490 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_invocation_metadata, 213, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__490)) __PYX_ERR(9, 213, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":216
+ *         return self._rpc_state.invocation_metadata()
+ * 
+ *     def set_code(self, object code):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.status_code = get_status_code(code)
+ *         self._rpc_state.py_status_code = code
+ */
+  __pyx_tuple__491 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_code); if (unlikely(!__pyx_tuple__491)) __PYX_ERR(9, 216, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__491);
+  __Pyx_GIVEREF(__pyx_tuple__491);
+  __pyx_codeobj__492 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__491, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_set_code, 216, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__492)) __PYX_ERR(9, 216, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":220
+ *         self._rpc_state.py_status_code = code
+ * 
+ *     def code(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.py_status_code
+ * 
+ */
+  __pyx_codeobj__493 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_code, 220, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__493)) __PYX_ERR(9, 220, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":223
+ *         return self._rpc_state.py_status_code
+ * 
+ *     def set_details(self, str details):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.status_details = details
+ * 
+ */
+  __pyx_tuple__494 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_details); if (unlikely(!__pyx_tuple__494)) __PYX_ERR(9, 223, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__494);
+  __Pyx_GIVEREF(__pyx_tuple__494);
+  __pyx_codeobj__495 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__494, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_set_details, 223, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__495)) __PYX_ERR(9, 223, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":226
+ *         self._rpc_state.status_details = details
+ * 
+ *     def details(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_details
+ * 
+ */
+  __pyx_codeobj__496 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_details, 226, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__496)) __PYX_ERR(9, 226, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":229
+ *         return self._rpc_state.status_details
+ * 
+ *     def set_compression(self, object compression):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.metadata_sent:
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')
+ */
+  __pyx_tuple__497 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_compression); if (unlikely(!__pyx_tuple__497)) __PYX_ERR(9, 229, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__497);
+  __Pyx_GIVEREF(__pyx_tuple__497);
+  __pyx_codeobj__498 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__497, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_set_compression, 229, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__498)) __PYX_ERR(9, 229, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":235
+ *             self._rpc_state.compression_algorithm = compression
+ * 
+ *     def disable_next_message_compression(self):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.disable_next_compression = True
+ * 
+ */
+  __pyx_codeobj__499 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_disable_next_message_compression, 235, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__499)) __PYX_ERR(9, 235, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":238
+ *         self._rpc_state.disable_next_compression = True
+ * 
+ *     def peer(self):             # <<<<<<<<<<<<<<
+ *         cdef char *c_peer = NULL
+ *         c_peer = grpc_call_get_peer(self._rpc_state.call)
+ */
+  __pyx_tuple__500 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_c_peer, __pyx_n_s_peer); if (unlikely(!__pyx_tuple__500)) __PYX_ERR(9, 238, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__500);
+  __Pyx_GIVEREF(__pyx_tuple__500);
+  __pyx_codeobj__501 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__500, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_peer, 238, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__501)) __PYX_ERR(9, 238, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":245
+ *         return peer
+ * 
+ *     def peer_identities(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+  __pyx_tuple__502 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_query_call, __pyx_n_s_identities); if (unlikely(!__pyx_tuple__502)) __PYX_ERR(9, 245, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__502);
+  __Pyx_GIVEREF(__pyx_tuple__502);
+  __pyx_codeobj__503 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__502, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_peer_identities, 245, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__503)) __PYX_ERR(9, 245, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":252
+ *         return identities
+ * 
+ *     def peer_identity_key(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+  __pyx_tuple__504 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_query_call, __pyx_n_s_identity_key); if (unlikely(!__pyx_tuple__504)) __PYX_ERR(9, 252, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__504);
+  __Pyx_GIVEREF(__pyx_tuple__504);
+  __pyx_codeobj__505 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__504, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_peer_identity_key, 252, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__505)) __PYX_ERR(9, 252, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":262
+ *             return None
+ * 
+ *     def auth_context(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+  __pyx_tuple__506 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_query_call, __pyx_n_s_bytes_ctx, __pyx_n_s_ctx, __pyx_n_s_key); if (unlikely(!__pyx_tuple__506)) __PYX_ERR(9, 262, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__506);
+  __Pyx_GIVEREF(__pyx_tuple__506);
+  __pyx_codeobj__507 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__506, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_auth_context, 262, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__507)) __PYX_ERR(9, 262, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":275
+ *             return {}
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.details.deadline.seconds == _GPR_INF_FUTURE.seconds:
+ *             return None
+ */
+  __pyx_codeobj__508 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_time_remaining, 275, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__508)) __PYX_ERR(9, 275, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":281
+ *             return max(_time_from_timespec(self._rpc_state.details.deadline) - time.time(), 0)
+ * 
+ *     def add_done_callback(self, callback):             # <<<<<<<<<<<<<<
+ *         cb = functools.partial(callback, self)
+ *         self._rpc_state.callbacks.append(cb)
+ */
+  __pyx_tuple__509 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_callback, __pyx_n_s_cb); if (unlikely(!__pyx_tuple__509)) __PYX_ERR(9, 281, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__509);
+  __Pyx_GIVEREF(__pyx_tuple__509);
+  __pyx_codeobj__510 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__509, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_add_done_callback, 281, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__510)) __PYX_ERR(9, 281, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":285
+ *         self._rpc_state.callbacks.append(cb)
+ * 
+ *     def done(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_sent
+ * 
+ */
+  __pyx_codeobj__511 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_done, 285, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__511)) __PYX_ERR(9, 285, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":288
+ *         return self._rpc_state.status_sent
+ * 
+ *     def cancelled(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_code == StatusCode.cancelled
+ * 
+ */
+  __pyx_codeobj__512 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_cancelled, 288, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__512)) __PYX_ERR(9, 288, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__513 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__513)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__514 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__514)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":301
+ *         self._loop = context._loop
+ * 
+ *     def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+  __pyx_tuple__515 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_code, __pyx_n_s_details, __pyx_n_s_trailing_metadata, __pyx_n_s_future); if (unlikely(!__pyx_tuple__515)) __PYX_ERR(9, 301, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__515);
+  __Pyx_GIVEREF(__pyx_tuple__515);
+  __pyx_codeobj__516 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__515, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_abort, 301, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__516)) __PYX_ERR(9, 301, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":311
+ *         future.exception()
+ * 
+ *     def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.send_initial_metadata(metadata),
+ */
+  __pyx_tuple__517 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_metadata, __pyx_n_s_future); if (unlikely(!__pyx_tuple__517)) __PYX_ERR(9, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__517);
+  __Pyx_GIVEREF(__pyx_tuple__517);
+  __pyx_codeobj__518 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__517, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_send_initial_metadata_2, 311, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__518)) __PYX_ERR(9, 311, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":317
+ *         future.result()
+ * 
+ *     def set_trailing_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._context.set_trailing_metadata(metadata)
+ * 
+ */
+  __pyx_codeobj__519 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__485, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_set_trailing_metadata, 317, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__519)) __PYX_ERR(9, 317, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":320
+ *         self._context.set_trailing_metadata(metadata)
+ * 
+ *     def invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._context.invocation_metadata()
+ * 
+ */
+  __pyx_codeobj__520 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_invocation_metadata, 320, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__520)) __PYX_ERR(9, 320, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":323
+ *         return self._context.invocation_metadata()
+ * 
+ *     def set_code(self, object code):             # <<<<<<<<<<<<<<
+ *         self._context.set_code(code)
+ * 
+ */
+  __pyx_codeobj__521 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__491, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_set_code, 323, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__521)) __PYX_ERR(9, 323, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":326
+ *         self._context.set_code(code)
+ * 
+ *     def set_details(self, str details):             # <<<<<<<<<<<<<<
+ *         self._context.set_details(details)
+ * 
+ */
+  __pyx_codeobj__522 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__494, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_set_details, 326, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__522)) __PYX_ERR(9, 326, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":329
+ *         self._context.set_details(details)
+ * 
+ *     def set_compression(self, object compression):             # <<<<<<<<<<<<<<
+ *         self._context.set_compression(compression)
+ * 
+ */
+  __pyx_codeobj__523 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__497, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_set_compression, 329, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__523)) __PYX_ERR(9, 329, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":332
+ *         self._context.set_compression(compression)
+ * 
+ *     def disable_next_message_compression(self):             # <<<<<<<<<<<<<<
+ *         self._context.disable_next_message_compression()
+ * 
+ */
+  __pyx_codeobj__524 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_disable_next_message_compression, 332, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__524)) __PYX_ERR(9, 332, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":335
+ *         self._context.disable_next_message_compression()
+ * 
+ *     def add_callback(self, object callback):             # <<<<<<<<<<<<<<
+ *         self._callbacks.append(callback)
+ * 
+ */
+  __pyx_codeobj__525 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__450, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_add_callback, 335, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__525)) __PYX_ERR(9, 335, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":338
+ *         self._callbacks.append(callback)
+ * 
+ *     def peer(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer()
+ * 
+ */
+  __pyx_codeobj__526 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_peer, 338, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__526)) __PYX_ERR(9, 338, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":341
+ *         return self._context.peer()
+ * 
+ *     def peer_identities(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer_identities()
+ * 
+ */
+  __pyx_codeobj__527 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_peer_identities, 341, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__527)) __PYX_ERR(9, 341, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":344
+ *         return self._context.peer_identities()
+ * 
+ *     def peer_identity_key(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer_identity_key()
+ * 
+ */
+  __pyx_codeobj__528 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_peer_identity_key, 344, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__528)) __PYX_ERR(9, 344, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":347
+ *         return self._context.peer_identity_key()
+ * 
+ *     def auth_context(self):             # <<<<<<<<<<<<<<
+ *         return self._context.auth_context()
+ * 
+ */
+  __pyx_codeobj__529 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_auth_context, 347, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__529)) __PYX_ERR(9, 347, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":350
+ *         return self._context.auth_context()
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         return self._context.time_remaining()
+ * 
+ */
+  __pyx_codeobj__530 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_time_remaining, 350, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__530)) __PYX_ERR(9, 350, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__531 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__531)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__532 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__532)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":354
+ * 
+ * 
+ * async def _run_interceptor(object interceptors, object query_handler,             # <<<<<<<<<<<<<<
+ *                            object handler_call_details):
+ *     interceptor = next(interceptors, None)
+ */
+  __pyx_tuple__533 = PyTuple_Pack(5, __pyx_n_s_interceptors, __pyx_n_s_query_handler, __pyx_n_s_handler_call_details, __pyx_n_s_interceptor, __pyx_n_s_continuation); if (unlikely(!__pyx_tuple__533)) __PYX_ERR(9, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__533);
+  __Pyx_GIVEREF(__pyx_tuple__533);
+  __pyx_codeobj__81 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__533, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_run_interceptor, 354, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__81)) __PYX_ERR(9, 354, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":365
+ * 
+ * 
+ * def _is_async_handler(object handler):             # <<<<<<<<<<<<<<
+ *     """Inspect if a method handler is async or sync."""
+ *     return inspect.isawaitable(handler) or inspect.iscoroutinefunction(handler) or inspect.isasyncgenfunction(handler)
+ */
+  __pyx_tuple__534 = PyTuple_Pack(1, __pyx_n_s_handler); if (unlikely(!__pyx_tuple__534)) __PYX_ERR(9, 365, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__534);
+  __Pyx_GIVEREF(__pyx_tuple__534);
+  __pyx_codeobj__535 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__534, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_is_async_handler, 365, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__535)) __PYX_ERR(9, 365, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":370
+ * 
+ * 
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,             # <<<<<<<<<<<<<<
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):
+ */
+  __pyx_tuple__536 = PyTuple_Pack(7, __pyx_n_s_method, __pyx_n_s_metadata, __pyx_n_s_generic_handlers, __pyx_n_s_interceptors, __pyx_n_s_query_handlers, __pyx_n_s_query_handlers, __pyx_n_s_handler_call_details); if (unlikely(!__pyx_tuple__536)) __PYX_ERR(9, 370, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__536);
+  __Pyx_GIVEREF(__pyx_tuple__536);
+  __pyx_codeobj__82 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__536, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_find_method_handler, 370, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__82)) __PYX_ERR(9, 370, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":389
+ * 
+ * 
+ * async def _finish_handler_with_unary_response(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                               object unary_handler,
+ *                                               object request,
+ */
+  __pyx_tuple__537 = PyTuple_Pack(11, __pyx_n_s_rpc_state, __pyx_n_s_unary_handler, __pyx_n_s_request, __pyx_n_s_servicer_context, __pyx_n_s_response_serializer, __pyx_n_s_loop, __pyx_n_s_response_message, __pyx_n_s_sync_servicer_context, __pyx_n_s_callback, __pyx_n_s_response_raw, __pyx_n_s_finish_ops); if (unlikely(!__pyx_tuple__537)) __PYX_ERR(9, 389, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__537);
+  __Pyx_GIVEREF(__pyx_tuple__537);
+  __pyx_codeobj__85 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 11, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__537, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_finish_handler_with_unary_respo, 389, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__85)) __PYX_ERR(9, 389, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":460
+ * 
+ * 
+ * async def _finish_handler_with_stream_responses(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                                 object stream_handler,
+ *                                                 object request,
+ */
+  __pyx_tuple__538 = PyTuple_Pack(11, __pyx_n_s_rpc_state, __pyx_n_s_stream_handler, __pyx_n_s_request, __pyx_n_s_servicer_context, __pyx_n_s_loop, __pyx_n_s_async_response_generator, __pyx_n_s_response_message, __pyx_n_s_sync_servicer_context, __pyx_n_s_gen, __pyx_n_s_op, __pyx_n_s_finish_ops); if (unlikely(!__pyx_tuple__538)) __PYX_ERR(9, 460, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__538);
+  __Pyx_GIVEREF(__pyx_tuple__538);
+  __pyx_codeobj__86 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 11, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__538, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_finish_handler_with_stream_resp, 460, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__86)) __PYX_ERR(9, 460, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":530
+ * 
+ * 
+ * async def _handle_unary_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                   RPCState rpc_state,
+ *                                   object loop):
+ */
+  __pyx_tuple__539 = PyTuple_Pack(6, __pyx_n_s_method_handler, __pyx_n_s_rpc_state, __pyx_n_s_loop, __pyx_n_s_request_raw, __pyx_n_s_request_message, __pyx_n_s_servicer_context); if (unlikely(!__pyx_tuple__539)) __PYX_ERR(9, 530, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__539);
+  __Pyx_GIVEREF(__pyx_tuple__539);
+  __pyx_codeobj__87 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__539, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_handle_unary_unary_rpc, 530, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__87)) __PYX_ERR(9, 530, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":564
+ * 
+ * 
+ * async def _handle_unary_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+  __pyx_codeobj__88 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__539, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_handle_unary_stream_rpc, 564, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__88)) __PYX_ERR(9, 564, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":603
+ *         self._agen = None
+ * 
+ *     async def _async_message_receiver(self):             # <<<<<<<<<<<<<<
+ *         """An async generator that receives messages."""
+ *         cdef object message
+ */
+  __pyx_codeobj__89 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_ASYNC_GENERATOR, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__465, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_async_message_receiver, 603, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__89)) __PYX_ERR(9, 603, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__540 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__540)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__541 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__541)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":623
+ * 
+ * 
+ * async def _handle_stream_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+  __pyx_tuple__542 = PyTuple_Pack(5, __pyx_n_s_method_handler, __pyx_n_s_rpc_state, __pyx_n_s_loop, __pyx_n_s_servicer_context, __pyx_n_s_request_iterator); if (unlikely(!__pyx_tuple__542)) __PYX_ERR(9, 623, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__542);
+  __Pyx_GIVEREF(__pyx_tuple__542);
+  __pyx_codeobj__90 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__542, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_handle_stream_unary_rpc, 623, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__90)) __PYX_ERR(9, 623, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":655
+ * 
+ * 
+ * async def _handle_stream_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                     RPCState rpc_state,
+ *                                     object loop):
+ */
+  __pyx_codeobj__91 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__542, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_handle_stream_stream_rpc, 655, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__91)) __PYX_ERR(9, 655, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":686
+ * 
+ * 
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         try:
+ */
+  __pyx_tuple__543 = PyTuple_Pack(5, __pyx_n_s_rpc_state, __pyx_n_s_rpc_coro, __pyx_n_s_loop, __pyx_n_s_e, __pyx_n_s_status_code); if (unlikely(!__pyx_tuple__543)) __PYX_ERR(9, 686, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__543);
+  __Pyx_GIVEREF(__pyx_tuple__543);
+  __pyx_codeobj__92 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__543, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_handle_exceptions, 686, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__92)) __PYX_ERR(9, 686, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":755
+ * 
+ * 
+ * async def _handle_cancellation_from_core(object rpc_task,             # <<<<<<<<<<<<<<
+ *                                          RPCState rpc_state,
+ *                                          object loop):
+ */
+  __pyx_tuple__544 = PyTuple_Pack(5, __pyx_n_s_rpc_task, __pyx_n_s_rpc_state, __pyx_n_s_loop, __pyx_n_s_op, __pyx_n_s_ops); if (unlikely(!__pyx_tuple__544)) __PYX_ERR(9, 755, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__544);
+  __Pyx_GIVEREF(__pyx_tuple__544);
+  __pyx_codeobj__95 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__544, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_handle_cancellation_from_core, 755, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__95)) __PYX_ERR(9, 755, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":772
+ * 
+ * 
+ * async def _schedule_rpc_coro(object rpc_coro,             # <<<<<<<<<<<<<<
+ *                              RPCState rpc_state,
+ *                              object loop):
+ */
+  __pyx_tuple__545 = PyTuple_Pack(4, __pyx_n_s_rpc_coro, __pyx_n_s_rpc_state, __pyx_n_s_loop, __pyx_n_s_rpc_task); if (unlikely(!__pyx_tuple__545)) __PYX_ERR(9, 772, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__545);
+  __Pyx_GIVEREF(__pyx_tuple__545);
+  __pyx_codeobj__96 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__545, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_schedule_rpc_coro, 772, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__96)) __PYX_ERR(9, 772, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":785
+ * 
+ * 
+ * async def _handle_rpc(list generic_handlers, tuple interceptors,             # <<<<<<<<<<<<<<
+ *                       RPCState rpc_state, object loop, bint concurrency_exceeded):
+ *     cdef object method_handler
+ */
+  __pyx_tuple__546 = PyTuple_Pack(6, __pyx_n_s_generic_handlers, __pyx_n_s_interceptors, __pyx_n_s_rpc_state, __pyx_n_s_loop, __pyx_n_s_concurrency_exceeded, __pyx_n_s_method_handler); if (unlikely(!__pyx_tuple__546)) __PYX_ERR(9, 785, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__546);
+  __Pyx_GIVEREF(__pyx_tuple__546);
+  __pyx_codeobj__97 = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__546, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_handle_rpc, 785, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__97)) __PYX_ERR(9, 785, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":869
+ *         self.limiter_concurrency_exceeded = False
+ * 
+ *     def check_before_request_call(self):             # <<<<<<<<<<<<<<
+ *         if self._active_rpcs >= self._maximum_concurrent_rpcs:
+ *             self.limiter_concurrency_exceeded = True
+ */
+  __pyx_codeobj__547 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_check_before_request_call, 869, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__547)) __PYX_ERR(9, 869, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":875
+ *             self._active_rpcs += 1
+ * 
+ *     def _decrease_active_rpcs_count(self, unused_future):             # <<<<<<<<<<<<<<
+ *         self._active_rpcs -= 1
+ *         if self._active_rpcs < self._maximum_concurrent_rpcs:
+ */
+  __pyx_tuple__548 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_unused_future); if (unlikely(!__pyx_tuple__548)) __PYX_ERR(9, 875, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__548);
+  __Pyx_GIVEREF(__pyx_tuple__548);
+  __pyx_codeobj__549 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__548, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_decrease_active_rpcs_count, 875, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__549)) __PYX_ERR(9, 875, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":880
+ *             self.limiter_concurrency_exceeded = False
+ * 
+ *     def decrease_once_finished(self, object rpc_task):             # <<<<<<<<<<<<<<
+ *         rpc_task.add_done_callback(self._decrease_active_rpcs_count)
+ * 
+ */
+  __pyx_tuple__550 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_rpc_task); if (unlikely(!__pyx_tuple__550)) __PYX_ERR(9, 880, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__550);
+  __Pyx_GIVEREF(__pyx_tuple__550);
+  __pyx_codeobj__551 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__550, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_decrease_once_finished, 880, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__551)) __PYX_ERR(9, 880, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_codeobj__552 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__552)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_codeobj__553 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__553)) __PYX_ERR(10, 3, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":922
+ *             self._limiter = _ConcurrentRpcLimiter(maximum_concurrent_rpcs)
+ * 
+ *     def add_generic_rpc_handlers(self, object generic_rpc_handlers):             # <<<<<<<<<<<<<<
+ *         self._generic_handlers.extend(generic_rpc_handlers)
+ * 
+ */
+  __pyx_tuple__554 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_generic_rpc_handlers); if (unlikely(!__pyx_tuple__554)) __PYX_ERR(9, 922, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__554);
+  __Pyx_GIVEREF(__pyx_tuple__554);
+  __pyx_codeobj__555 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__554, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_add_generic_rpc_handlers, 922, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__555)) __PYX_ERR(9, 922, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":925
+ *         self._generic_handlers.extend(generic_rpc_handlers)
+ * 
+ *     def add_insecure_port(self, address):             # <<<<<<<<<<<<<<
+ *         return self._server.add_http2_port(address)
+ * 
+ */
+  __pyx_tuple__556 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_address); if (unlikely(!__pyx_tuple__556)) __PYX_ERR(9, 925, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__556);
+  __Pyx_GIVEREF(__pyx_tuple__556);
+  __pyx_codeobj__557 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__556, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_add_insecure_port, 925, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__557)) __PYX_ERR(9, 925, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":928
+ *         return self._server.add_http2_port(address)
+ * 
+ *     def add_secure_port(self, address, server_credentials):             # <<<<<<<<<<<<<<
+ *         return self._server.add_http2_port(address,
+ *                                            server_credentials._credentials)
+ */
+  __pyx_tuple__558 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_address, __pyx_n_s_server_credentials); if (unlikely(!__pyx_tuple__558)) __PYX_ERR(9, 928, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__558);
+  __Pyx_GIVEREF(__pyx_tuple__558);
+  __pyx_codeobj__559 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__558, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_add_secure_port, 928, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__559)) __PYX_ERR(9, 928, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":932
+ *                                            server_credentials._credentials)
+ * 
+ *     async def _request_call(self):             # <<<<<<<<<<<<<<
+ *         cdef grpc_call_error error
+ *         cdef RPCState rpc_state = RPCState(self)
+ */
+  __pyx_tuple__560 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_error, __pyx_n_s_rpc_state, __pyx_n_s_future, __pyx_n_s_wrapper); if (unlikely(!__pyx_tuple__560)) __PYX_ERR(9, 932, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__560);
+  __Pyx_GIVEREF(__pyx_tuple__560);
+  __pyx_codeobj__99 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__560, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_request_call, 932, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__99)) __PYX_ERR(9, 932, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":952
+ *         return rpc_state
+ * 
+ *     async def _server_main_loop(self,             # <<<<<<<<<<<<<<
+ *                                 object server_started):
+ *         self._server.start(backup_queue=False)
+ */
+  __pyx_tuple__561 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_server_started, __pyx_n_s_rpc_state, __pyx_n_s_concurrency_exceeded, __pyx_n_s_rpc_coro, __pyx_n_s_rpc_task); if (unlikely(!__pyx_tuple__561)) __PYX_ERR(9, 952, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__561);
+  __Pyx_GIVEREF(__pyx_tuple__561);
+  __pyx_codeobj__100 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__561, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_server_main_loop, 952, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__100)) __PYX_ERR(9, 952, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":994
+ *                 self._limiter.decrease_once_finished(rpc_task)
+ * 
+ *     def _serving_task_crash_handler(self, object task):             # <<<<<<<<<<<<<<
+ *         """Shutdown the server immediately if unexpectedly exited."""
+ *         if task.cancelled():
+ */
+  __pyx_tuple__562 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_task); if (unlikely(!__pyx_tuple__562)) __PYX_ERR(9, 994, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__562);
+  __Pyx_GIVEREF(__pyx_tuple__562);
+  __pyx_codeobj__563 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__562, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_serving_task_crash_handler, 994, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__563)) __PYX_ERR(9, 994, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1005
+ *             self._loop.create_task(self.shutdown(None))
+ * 
+ *     async def start(self):             # <<<<<<<<<<<<<<
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:
+ *             return
+ */
+  __pyx_tuple__564 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_server_started); if (unlikely(!__pyx_tuple__564)) __PYX_ERR(9, 1005, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__564);
+  __Pyx_GIVEREF(__pyx_tuple__564);
+  __pyx_codeobj__101 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__564, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_start, 1005, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__101)) __PYX_ERR(9, 1005, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1019
+ *         await server_started
+ * 
+ *     async def _start_shutting_down(self):             # <<<<<<<<<<<<<<
+ *         """Prepares the server to shutting down.
+ * 
+ */
+  __pyx_codeobj__102 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_start_shutting_down, 1019, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__102)) __PYX_ERR(9, 1019, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1036
+ *             pass
+ * 
+ *     async def shutdown(self, grace):             # <<<<<<<<<<<<<<
+ *         """Gracefully shutdown the Core server.
+ * 
+ */
+  __pyx_tuple__565 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_grace); if (unlikely(!__pyx_tuple__565)) __PYX_ERR(9, 1036, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__565);
+  __Pyx_GIVEREF(__pyx_tuple__565);
+  __pyx_codeobj__103 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__565, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_shutdown, 1036, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__103)) __PYX_ERR(9, 1036, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1076
+ *                 self._status = AIO_SERVER_STATUS_STOPPED
+ * 
+ *     async def wait_for_termination(self, object timeout):             # <<<<<<<<<<<<<<
+ *         if timeout is None:
+ *             await self._shutdown_completed
+ */
+  __pyx_tuple__566 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_timeout); if (unlikely(!__pyx_tuple__566)) __PYX_ERR(9, 1076, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__566);
+  __Pyx_GIVEREF(__pyx_tuple__566);
+  __pyx_codeobj__104 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_COROUTINE, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__566, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_wait_for_termination, 1076, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__104)) __PYX_ERR(9, 1076, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1109
+ *         return self._thread_pool
+ * 
+ *     def is_running(self):             # <<<<<<<<<<<<<<
+ *         return self._status == AIO_SERVER_STATUS_RUNNING
+ */
+  __pyx_codeobj__567 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__108, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_python_grpcio_grpc__cython_6, __pyx_n_s_is_running, 1109, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__567)) __PYX_ERR(9, 1109, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_codeobj__568 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__194, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__568)) __PYX_ERR(10, 1, __pyx_L1_error)
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_AioServer__set_state(self, __pyx_state)
+ */
+  __pyx_codeobj__569 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__110, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__569)) __PYX_ERR(10, 16, __pyx_L1_error)
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle_ChannelCredentials(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+  __pyx_tuple__570 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__570)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__570);
+  __Pyx_GIVEREF(__pyx_tuple__570);
+  __pyx_codeobj__571 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__570, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_ChannelCredential, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__571)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __pyx_codeobj__572 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__570, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_InsecureChannelCr, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__572)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __pyx_codeobj__573 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__570, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__Tag, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__573)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __pyx_codeobj__574 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__570, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_CensusContext, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__574)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __pyx_codeobj__575 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__570, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_AioServer, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__575)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_RefNannyFinishContext();
+  return 0;
+  __pyx_L1_error:;
+  __Pyx_RefNannyFinishContext();
+  return -1;
+}
+/* #### Code section: init_constants ### */
+
+static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) {
+  __pyx_umethod_PyDict_Type_get.type = (PyObject*)&PyDict_Type;
+  __pyx_umethod_PyDict_Type_get.method_name = &__pyx_n_s_get;
+  __pyx_umethod_PyDict_Type_keys.type = (PyObject*)&PyDict_Type;
+  __pyx_umethod_PyDict_Type_keys.method_name = &__pyx_n_s_keys;
+  __pyx_umethod_PyDict_Type_pop.type = (PyObject*)&PyDict_Type;
+  __pyx_umethod_PyDict_Type_pop.method_name = &__pyx_n_s_pop;
+  __pyx_umethod_PyDict_Type_values.type = (PyObject*)&PyDict_Type;
+  __pyx_umethod_PyDict_Type_values.method_name = &__pyx_n_s_values;
+  if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error);
+  __pyx_float_1_0 = PyFloat_FromDouble(1.0); if (unlikely(!__pyx_float_1_0)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_118587260 = PyInt_FromLong(118587260L); if (unlikely(!__pyx_int_118587260)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_171381981 = PyInt_FromLong(171381981L); if (unlikely(!__pyx_int_171381981)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_171651213 = PyInt_FromLong(171651213L); if (unlikely(!__pyx_int_171651213)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_222419149 = PyInt_FromLong(222419149L); if (unlikely(!__pyx_int_222419149)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_228825662 = PyInt_FromLong(228825662L); if (unlikely(!__pyx_int_228825662)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_int_238750788 = PyInt_FromLong(238750788L); if (unlikely(!__pyx_int_238750788)) __PYX_ERR(0, 1, __pyx_L1_error)
+  return 0;
+  __pyx_L1_error:;
+  return -1;
+}
+/* #### Code section: init_globals ### */
+
+static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {
+  /* AssertionsEnabled.init */
+  if (likely(__Pyx_init_assertions_enabled() == 0)); else
+
+if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error)
+
+  return 0;
+  __pyx_L1_error:;
+  return -1;
+}
+/* #### Code section: init_module ### */
+
+static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/
+
+static int __Pyx_modinit_global_init_code(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0);
+  /*--- Global init code ---*/
+  __pyx_v_7_cython_6cygrpc_CQ_SHUTDOWN_FAILURE_HANDLER = ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)Py_None); Py_INCREF(Py_None);
+  __pyx_v_7_cython_6cygrpc__GRPC_ASYNCIO_ENGINE = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  __pyx_v_7_cython_6cygrpc__global_aio_state = ((struct __pyx_obj_7_cython_6cygrpc__AioState *)Py_None); Py_INCREF(Py_None);
+  __pyx_v_7_cython_6cygrpc__WATCH_CONNECTIVITY_FAILURE_HANDLER = ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)Py_None); Py_INCREF(Py_None);
+  __pyx_v_7_cython_6cygrpc__RPC_FINISHED_DETAILS = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  __pyx_v_7_cython_6cygrpc__SERVER_STOPPED_DETAILS = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  __pyx_v_7_cython_6cygrpc_REQUEST_CALL_FAILURE_HANDLER = ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)Py_None); Py_INCREF(Py_None);
+  __pyx_v_7_cython_6cygrpc_SERVER_SHUTDOWN_FAILURE_HANDLER = ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)Py_None); Py_INCREF(Py_None);
+  __Pyx_RefNannyFinishContext();
+  return 0;
+}
+
+static int __Pyx_modinit_variable_export_code(void) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0);
+  /*--- Variable export code ---*/
+  if (__Pyx_ExportVoidPtr(__pyx_n_s_g_interrupt_check_period_ms, (void *)&__pyx_v_7_cython_6cygrpc_g_interrupt_check_period_ms, "int") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportVoidPtr(__pyx_n_s_default_vtable, (void *)&__pyx_v_7_cython_6cygrpc_default_vtable, "grpc_arg_pointer_vtable") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  __Pyx_RefNannyFinishContext();
+  return 0;
+  __pyx_L1_error:;
+  __Pyx_RefNannyFinishContext();
+  return -1;
+}
+
+static int __Pyx_modinit_function_export_code(void) {
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0);
+  /*--- Function export code ---*/
+  if (__Pyx_ExportFunction("_wrap_grpc_arg", (void (*)(void))__pyx_f_7_cython_6cygrpc__wrap_grpc_arg, "PyObject *(grpc_arg)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_unwrap_grpc_arg", (void (*)(void))__pyx_f_7_cython_6cygrpc__unwrap_grpc_arg, "grpc_arg (PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_check_call_error_no_metadata", (void (*)(void))__pyx_f_7_cython_6cygrpc__check_call_error_no_metadata, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_check_and_raise_call_error_no_metadata", (void (*)(void))__pyx_f_7_cython_6cygrpc__check_and_raise_call_error_no_metadata, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_check_call_error", (void (*)(void))__pyx_f_7_cython_6cygrpc__check_call_error, "PyObject *(PyObject *, PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_get_metadata", (void (*)(void))__pyx_f_7_cython_6cygrpc__get_metadata, "int (void *, grpc_auth_metadata_context, grpc_credentials_plugin_metadata_cb, void *, grpc_metadata *, size_t *, grpc_status_code *, char const **)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_destroy", (void (*)(void))__pyx_f_7_cython_6cygrpc__destroy, "void (void *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_composition", (void (*)(void))__pyx_f_7_cython_6cygrpc__composition, "grpc_call_credentials *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_next", (void (*)(void))__pyx_f_7_cython_6cygrpc__next, "grpc_event (grpc_completion_queue *, PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_interpret_event", (void (*)(void))__pyx_f_7_cython_6cygrpc__interpret_event, "PyObject *(grpc_event)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_store_c_metadata", (void (*)(void))__pyx_f_7_cython_6cygrpc__store_c_metadata, "void (PyObject *, grpc_metadata **, size_t *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_release_c_metadata", (void (*)(void))__pyx_f_7_cython_6cygrpc__release_c_metadata, "void (grpc_metadata *, int)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_metadatum", (void (*)(void))__pyx_f_7_cython_6cygrpc__metadatum, "PyObject *(grpc_slice, grpc_slice)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_metadata", (void (*)(void))__pyx_f_7_cython_6cygrpc__metadata, "PyObject *(grpc_metadata_array *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_slice_bytes", (void (*)(void))__pyx_f_7_cython_6cygrpc__slice_bytes, "PyObject *(grpc_slice)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_copy_slice", (void (*)(void))__pyx_f_7_cython_6cygrpc__copy_slice, "grpc_slice (grpc_slice)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_slice_from_bytes", (void (*)(void))__pyx_f_7_cython_6cygrpc__slice_from_bytes, "grpc_slice (PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("ssl_roots_override_callback", (void (*)(void))__pyx_f_7_cython_6cygrpc_ssl_roots_override_callback, "grpc_ssl_roots_override_result (char **)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_timespec_from_time", (void (*)(void))__pyx_f_7_cython_6cygrpc__timespec_from_time, "gpr_timespec (PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_time_from_timespec", (void (*)(void))__pyx_f_7_cython_6cygrpc__time_from_timespec, "double (gpr_timespec)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_copy_pointer", (void (*)(void))__pyx_f_7_cython_6cygrpc__copy_pointer, "void *(void *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_destroy_pointer", (void (*)(void))__pyx_f_7_cython_6cygrpc__destroy_pointer, "void (void *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_compare_pointer", (void (*)(void))__pyx_f_7_cython_6cygrpc__compare_pointer, "int (void *, void *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_custom_op_on_c_call", (void (*)(void))__pyx_f_7_cython_6cygrpc__custom_op_on_c_call, "PyObject *(int, grpc_call *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("gevent_increment_channel_count", (void (*)(void))__pyx_f_7_cython_6cygrpc_gevent_increment_channel_count, "void (int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("gevent_decrement_channel_count", (void (*)(void))__pyx_f_7_cython_6cygrpc_gevent_decrement_channel_count, "void (int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("__prefork", (void (*)(void))__pyx_f_7_cython_6cygrpc___prefork, "void (void)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("__postfork_parent", (void (*)(void))__pyx_f_7_cython_6cygrpc___postfork_parent, "void (void)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("__postfork_child", (void (*)(void))__pyx_f_7_cython_6cygrpc___postfork_child, "void (void)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("_unified_socket_write", (void (*)(void))__pyx_f_7_cython_6cygrpc__unified_socket_write, "void (int)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("global_completion_queue", (void (*)(void))__pyx_f_7_cython_6cygrpc_global_completion_queue, "grpc_completion_queue *(void)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("init_grpc_aio", (void (*)(void))__pyx_f_7_cython_6cygrpc_init_grpc_aio, "PyObject *(int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (__Pyx_ExportFunction("shutdown_grpc_aio", (void (*)(void))__pyx_f_7_cython_6cygrpc_shutdown_grpc_aio, "PyObject *(int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  __Pyx_RefNannyFinishContext();
+  return 0;
+  __pyx_L1_error:;
+  __Pyx_RefNannyFinishContext();
+  return -1;
+}
+
+static int __Pyx_modinit_type_init_code(void) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0);
+  /*--- Type init code ---*/
+  __pyx_vtabptr_7_cython_6cygrpc__ChannelArg = &__pyx_vtable_7_cython_6cygrpc__ChannelArg;
+  __pyx_vtable_7_cython_6cygrpc__ChannelArg.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc__ChannelArg *, PyObject *, PyObject *))__pyx_f_7_cython_6cygrpc_11_ChannelArg_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__ChannelArg = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__ChannelArg_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__ChannelArg)) __PYX_ERR(3, 32, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__ChannelArg_spec, __pyx_ptype_7_cython_6cygrpc__ChannelArg) < 0) __PYX_ERR(3, 32, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__ChannelArg = &__pyx_type_7_cython_6cygrpc__ChannelArg;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__ChannelArg) < 0) __PYX_ERR(3, 32, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__ChannelArg->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__ChannelArg->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__ChannelArg->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__ChannelArg->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__ChannelArg, __pyx_vtabptr_7_cython_6cygrpc__ChannelArg) < 0) __PYX_ERR(3, 32, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__ChannelArg) < 0) __PYX_ERR(3, 32, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ChannelArg, (PyObject *) __pyx_ptype_7_cython_6cygrpc__ChannelArg) < 0) __PYX_ERR(3, 32, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__ChannelArg) < 0) __PYX_ERR(3, 32, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc__ChannelArgs = &__pyx_vtable_7_cython_6cygrpc__ChannelArgs;
+  __pyx_vtable_7_cython_6cygrpc__ChannelArgs.c_args = (grpc_channel_args *(*)(struct __pyx_obj_7_cython_6cygrpc__ChannelArgs *))__pyx_f_7_cython_6cygrpc_12_ChannelArgs_c_args;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__ChannelArgs = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__ChannelArgs_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__ChannelArgs)) __PYX_ERR(3, 64, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__ChannelArgs_spec, __pyx_ptype_7_cython_6cygrpc__ChannelArgs) < 0) __PYX_ERR(3, 64, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__ChannelArgs = &__pyx_type_7_cython_6cygrpc__ChannelArgs;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__ChannelArgs) < 0) __PYX_ERR(3, 64, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__ChannelArgs->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__ChannelArgs->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__ChannelArgs->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__ChannelArgs->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__ChannelArgs, __pyx_vtabptr_7_cython_6cygrpc__ChannelArgs) < 0) __PYX_ERR(3, 64, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__ChannelArgs) < 0) __PYX_ERR(3, 64, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ChannelArgs, (PyObject *) __pyx_ptype_7_cython_6cygrpc__ChannelArgs) < 0) __PYX_ERR(3, 64, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__ChannelArgs) < 0) __PYX_ERR(3, 64, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_Call = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_Call_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_Call)) __PYX_ERR(4, 16, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_Call_spec, __pyx_ptype_7_cython_6cygrpc_Call) < 0) __PYX_ERR(4, 16, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_Call = &__pyx_type_7_cython_6cygrpc_Call;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_Call) < 0) __PYX_ERR(4, 16, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_Call->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_Call->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_Call->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_Call->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Call, (PyObject *) __pyx_ptype_7_cython_6cygrpc_Call) < 0) __PYX_ERR(4, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_Call) < 0) __PYX_ERR(4, 16, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc__CallState = &__pyx_vtable_7_cython_6cygrpc__CallState;
+  __pyx_vtable_7_cython_6cygrpc__CallState.maybe_set_client_call_tracer_on_call = (void (*)(struct __pyx_obj_7_cython_6cygrpc__CallState *, PyObject *, PyObject *))__pyx_f_7_cython_6cygrpc_10_CallState_maybe_set_client_call_tracer_on_call;
+  __pyx_vtable_7_cython_6cygrpc__CallState.maybe_delete_call_tracer = (void (*)(struct __pyx_obj_7_cython_6cygrpc__CallState *))__pyx_f_7_cython_6cygrpc_10_CallState_maybe_delete_call_tracer;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__CallState = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__CallState_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__CallState)) __PYX_ERR(12, 70, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__CallState_spec, __pyx_ptype_7_cython_6cygrpc__CallState) < 0) __PYX_ERR(12, 70, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__CallState = &__pyx_type_7_cython_6cygrpc__CallState;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__CallState) < 0) __PYX_ERR(12, 70, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__CallState->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__CallState->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__CallState->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__CallState->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__CallState, __pyx_vtabptr_7_cython_6cygrpc__CallState) < 0) __PYX_ERR(12, 70, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__CallState) < 0) __PYX_ERR(12, 70, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CallState, (PyObject *) __pyx_ptype_7_cython_6cygrpc__CallState) < 0) __PYX_ERR(12, 70, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__CallState) < 0) __PYX_ERR(12, 70, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__ChannelState = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__ChannelState_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__ChannelState)) __PYX_ERR(12, 93, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__ChannelState_spec, __pyx_ptype_7_cython_6cygrpc__ChannelState) < 0) __PYX_ERR(12, 93, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__ChannelState = &__pyx_type_7_cython_6cygrpc__ChannelState;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__ChannelState) < 0) __PYX_ERR(12, 93, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__ChannelState->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__ChannelState->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__ChannelState->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__ChannelState->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ChannelState, (PyObject *) __pyx_ptype_7_cython_6cygrpc__ChannelState) < 0) __PYX_ERR(12, 93, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__ChannelState) < 0) __PYX_ERR(12, 93, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_IntegratedCall = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_IntegratedCall_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_IntegratedCall)) __PYX_ERR(12, 322, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_IntegratedCall_spec, __pyx_ptype_7_cython_6cygrpc_IntegratedCall) < 0) __PYX_ERR(12, 322, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_IntegratedCall = &__pyx_type_7_cython_6cygrpc_IntegratedCall;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_IntegratedCall) < 0) __PYX_ERR(12, 322, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_IntegratedCall->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_IntegratedCall->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_IntegratedCall->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_IntegratedCall->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_IntegratedCall, (PyObject *) __pyx_ptype_7_cython_6cygrpc_IntegratedCall) < 0) __PYX_ERR(12, 322, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_IntegratedCall) < 0) __PYX_ERR(12, 322, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_SegregatedCall = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_SegregatedCall_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_SegregatedCall)) __PYX_ERR(12, 371, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_SegregatedCall_spec, __pyx_ptype_7_cython_6cygrpc_SegregatedCall) < 0) __PYX_ERR(12, 371, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_SegregatedCall = &__pyx_type_7_cython_6cygrpc_SegregatedCall;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_SegregatedCall) < 0) __PYX_ERR(12, 371, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_SegregatedCall->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_SegregatedCall->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_SegregatedCall->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_SegregatedCall->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SegregatedCall, (PyObject *) __pyx_ptype_7_cython_6cygrpc_SegregatedCall) < 0) __PYX_ERR(12, 371, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_SegregatedCall) < 0) __PYX_ERR(12, 371, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_Channel = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_Channel_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_Channel)) __PYX_ERR(12, 498, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_Channel_spec, __pyx_ptype_7_cython_6cygrpc_Channel) < 0) __PYX_ERR(12, 498, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_Channel = &__pyx_type_7_cython_6cygrpc_Channel;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_Channel) < 0) __PYX_ERR(12, 498, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_Channel->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_Channel->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_Channel->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_Channel->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Channel, (PyObject *) __pyx_ptype_7_cython_6cygrpc_Channel) < 0) __PYX_ERR(12, 498, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_Channel) < 0) __PYX_ERR(12, 498, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_CallHandle = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CallHandle_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CallHandle)) __PYX_ERR(12, 104, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CallHandle_spec, __pyx_ptype_7_cython_6cygrpc_CallHandle) < 0) __PYX_ERR(12, 104, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CallHandle = &__pyx_type_7_cython_6cygrpc_CallHandle;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CallHandle) < 0) __PYX_ERR(12, 104, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CallHandle->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CallHandle->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CallHandle->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CallHandle->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CallHandle, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CallHandle) < 0) __PYX_ERR(12, 104, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CallHandle) < 0) __PYX_ERR(12, 104, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_CallCredentials = &__pyx_vtable_7_cython_6cygrpc_CallCredentials;
+  __pyx_vtable_7_cython_6cygrpc_CallCredentials.c = (grpc_call_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_CallCredentials *))__pyx_f_7_cython_6cygrpc_15CallCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_CallCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CallCredentials_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CallCredentials)) __PYX_ERR(5, 31, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CallCredentials_spec, __pyx_ptype_7_cython_6cygrpc_CallCredentials) < 0) __PYX_ERR(5, 31, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CallCredentials = &__pyx_type_7_cython_6cygrpc_CallCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CallCredentials) < 0) __PYX_ERR(5, 31, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CallCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_CallCredentials, __pyx_vtabptr_7_cython_6cygrpc_CallCredentials) < 0) __PYX_ERR(5, 31, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_CallCredentials) < 0) __PYX_ERR(5, 31, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CallCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CallCredentials) < 0) __PYX_ERR(5, 31, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CallCredentials) < 0) __PYX_ERR(5, 31, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_MetadataPluginCallCredentials = &__pyx_vtable_7_cython_6cygrpc_MetadataPluginCallCredentials;
+  __pyx_vtable_7_cython_6cygrpc_MetadataPluginCallCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_CallCredentials;
+  __pyx_vtable_7_cython_6cygrpc_MetadataPluginCallCredentials.__pyx_base.c = (grpc_call_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_CallCredentials *))__pyx_f_7_cython_6cygrpc_29MetadataPluginCallCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_CallCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials)) __PYX_ERR(5, 73, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials_spec, __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials) < 0) __PYX_ERR(5, 73, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials = &__pyx_type_7_cython_6cygrpc_MetadataPluginCallCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_CallCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials) < 0) __PYX_ERR(5, 73, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials, __pyx_vtabptr_7_cython_6cygrpc_MetadataPluginCallCredentials) < 0) __PYX_ERR(5, 73, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials) < 0) __PYX_ERR(5, 73, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_MetadataPluginCallCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials) < 0) __PYX_ERR(5, 73, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_MetadataPluginCallCredentials) < 0) __PYX_ERR(5, 73, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_CompositeCallCredentials = &__pyx_vtable_7_cython_6cygrpc_CompositeCallCredentials;
+  __pyx_vtable_7_cython_6cygrpc_CompositeCallCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_CallCredentials;
+  __pyx_vtable_7_cython_6cygrpc_CompositeCallCredentials.__pyx_base.c = (grpc_call_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_CallCredentials *))__pyx_f_7_cython_6cygrpc_24CompositeCallCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_CallCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 109, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CompositeCallCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials)) __PYX_ERR(5, 109, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CompositeCallCredentials_spec, __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials) < 0) __PYX_ERR(5, 109, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials = &__pyx_type_7_cython_6cygrpc_CompositeCallCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_CallCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials) < 0) __PYX_ERR(5, 109, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials, __pyx_vtabptr_7_cython_6cygrpc_CompositeCallCredentials) < 0) __PYX_ERR(5, 109, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials) < 0) __PYX_ERR(5, 109, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CompositeCallCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials) < 0) __PYX_ERR(5, 109, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CompositeCallCredentials) < 0) __PYX_ERR(5, 109, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials = &__pyx_vtable_7_cython_6cygrpc_ChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_ChannelCredentials.c = (grpc_channel_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *))__pyx_f_7_cython_6cygrpc_18ChannelCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_ChannelCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ChannelCredentials_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ChannelCredentials)) __PYX_ERR(5, 118, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ChannelCredentials_spec, __pyx_ptype_7_cython_6cygrpc_ChannelCredentials) < 0) __PYX_ERR(5, 118, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ChannelCredentials = &__pyx_type_7_cython_6cygrpc_ChannelCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials) < 0) __PYX_ERR(5, 118, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ChannelCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials, __pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials) < 0) __PYX_ERR(5, 118, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials) < 0) __PYX_ERR(5, 118, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ChannelCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ChannelCredentials) < 0) __PYX_ERR(5, 118, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ChannelCredentials) < 0) __PYX_ERR(5, 118, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU)) __PYX_ERR(5, 124, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU_spec, __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU) < 0) __PYX_ERR(5, 124, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU = &__pyx_type_7_cython_6cygrpc_SSLSessionCacheLRU;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU) < 0) __PYX_ERR(5, 124, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SSLSessionCacheLRU, (PyObject *) __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU) < 0) __PYX_ERR(5, 124, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_SSLSessionCacheLRU) < 0) __PYX_ERR(5, 124, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_SSLChannelCredentials = &__pyx_vtable_7_cython_6cygrpc_SSLChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_SSLChannelCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_SSLChannelCredentials.__pyx_base.c = (grpc_channel_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *))__pyx_f_7_cython_6cygrpc_21SSLChannelCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 139, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_SSLChannelCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials)) __PYX_ERR(5, 139, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_SSLChannelCredentials_spec, __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials) < 0) __PYX_ERR(5, 139, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials = &__pyx_type_7_cython_6cygrpc_SSLChannelCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_ChannelCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials) < 0) __PYX_ERR(5, 139, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials, __pyx_vtabptr_7_cython_6cygrpc_SSLChannelCredentials) < 0) __PYX_ERR(5, 139, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials) < 0) __PYX_ERR(5, 139, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SSLChannelCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials) < 0) __PYX_ERR(5, 139, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_SSLChannelCredentials) < 0) __PYX_ERR(5, 139, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_CompositeChannelCredentials = &__pyx_vtable_7_cython_6cygrpc_CompositeChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_CompositeChannelCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_CompositeChannelCredentials.__pyx_base.c = (grpc_channel_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *))__pyx_f_7_cython_6cygrpc_27CompositeChannelCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 173, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CompositeChannelCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials)) __PYX_ERR(5, 173, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CompositeChannelCredentials_spec, __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials) < 0) __PYX_ERR(5, 173, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials = &__pyx_type_7_cython_6cygrpc_CompositeChannelCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_ChannelCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials) < 0) __PYX_ERR(5, 173, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials, __pyx_vtabptr_7_cython_6cygrpc_CompositeChannelCredentials) < 0) __PYX_ERR(5, 173, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials) < 0) __PYX_ERR(5, 173, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CompositeChannelCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials) < 0) __PYX_ERR(5, 173, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CompositeChannelCredentials) < 0) __PYX_ERR(5, 173, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_XDSChannelCredentials = &__pyx_vtable_7_cython_6cygrpc_XDSChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_XDSChannelCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_XDSChannelCredentials.__pyx_base.c = (grpc_channel_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *))__pyx_f_7_cython_6cygrpc_21XDSChannelCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 192, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_XDSChannelCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials)) __PYX_ERR(5, 192, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_XDSChannelCredentials_spec, __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials) < 0) __PYX_ERR(5, 192, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials = &__pyx_type_7_cython_6cygrpc_XDSChannelCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_ChannelCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials) < 0) __PYX_ERR(5, 192, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials, __pyx_vtabptr_7_cython_6cygrpc_XDSChannelCredentials) < 0) __PYX_ERR(5, 192, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials) < 0) __PYX_ERR(5, 192, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_XDSChannelCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials) < 0) __PYX_ERR(5, 192, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_XDSChannelCredentials) < 0) __PYX_ERR(5, 192, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ServerCertificateConfig_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig)) __PYX_ERR(5, 204, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ServerCertificateConfig_spec, __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig) < 0) __PYX_ERR(5, 204, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig = &__pyx_type_7_cython_6cygrpc_ServerCertificateConfig;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig) < 0) __PYX_ERR(5, 204, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ServerCertificateConfig, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig) < 0) __PYX_ERR(5, 204, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ServerCertificateConfig) < 0) __PYX_ERR(5, 204, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_ServerCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ServerCredentials_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ServerCredentials)) __PYX_ERR(5, 219, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ServerCredentials_spec, __pyx_ptype_7_cython_6cygrpc_ServerCredentials) < 0) __PYX_ERR(5, 219, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ServerCredentials = &__pyx_type_7_cython_6cygrpc_ServerCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ServerCredentials) < 0) __PYX_ERR(5, 219, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ServerCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ServerCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ServerCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ServerCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ServerCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ServerCredentials) < 0) __PYX_ERR(5, 219, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ServerCredentials) < 0) __PYX_ERR(5, 219, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_LocalChannelCredentials = &__pyx_vtable_7_cython_6cygrpc_LocalChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_LocalChannelCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_LocalChannelCredentials.__pyx_base.c = (grpc_channel_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *))__pyx_f_7_cython_6cygrpc_23LocalChannelCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 360, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_LocalChannelCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials)) __PYX_ERR(5, 360, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_LocalChannelCredentials_spec, __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials) < 0) __PYX_ERR(5, 360, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials = &__pyx_type_7_cython_6cygrpc_LocalChannelCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_ChannelCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials) < 0) __PYX_ERR(5, 360, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials, __pyx_vtabptr_7_cython_6cygrpc_LocalChannelCredentials) < 0) __PYX_ERR(5, 360, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials) < 0) __PYX_ERR(5, 360, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_LocalChannelCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials) < 0) __PYX_ERR(5, 360, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_LocalChannelCredentials) < 0) __PYX_ERR(5, 360, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_ALTSChannelCredentials = &__pyx_vtable_7_cython_6cygrpc_ALTSChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_ALTSChannelCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_ALTSChannelCredentials.__pyx_base.c = (grpc_channel_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *))__pyx_f_7_cython_6cygrpc_22ALTSChannelCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 399, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ALTSChannelCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials)) __PYX_ERR(5, 399, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ALTSChannelCredentials_spec, __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials) < 0) __PYX_ERR(5, 399, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials = &__pyx_type_7_cython_6cygrpc_ALTSChannelCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_ChannelCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials) < 0) __PYX_ERR(5, 399, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials, __pyx_vtabptr_7_cython_6cygrpc_ALTSChannelCredentials) < 0) __PYX_ERR(5, 399, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials) < 0) __PYX_ERR(5, 399, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ALTSChannelCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials) < 0) __PYX_ERR(5, 399, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ALTSChannelCredentials) < 0) __PYX_ERR(5, 399, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__LatentEventArg = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__LatentEventArg_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__LatentEventArg)) __PYX_ERR(35, 22, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__LatentEventArg_spec, __pyx_ptype_7_cython_6cygrpc__LatentEventArg) < 0) __PYX_ERR(35, 22, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__LatentEventArg = &__pyx_type_7_cython_6cygrpc__LatentEventArg;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__LatentEventArg) < 0) __PYX_ERR(35, 22, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__LatentEventArg->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__LatentEventArg->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__LatentEventArg->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__LatentEventArg->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_LatentEventArg, (PyObject *) __pyx_ptype_7_cython_6cygrpc__LatentEventArg) < 0) __PYX_ERR(35, 22, __pyx_L1_error)
+  __pyx_vtabptr_7_cython_6cygrpc_CompletionQueue = &__pyx_vtable_7_cython_6cygrpc_CompletionQueue;
+  __pyx_vtable_7_cython_6cygrpc_CompletionQueue._interpret_event = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *, grpc_event))__pyx_f_7_cython_6cygrpc_15CompletionQueue__interpret_event;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_CompletionQueue = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CompletionQueue_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CompletionQueue)) __PYX_ERR(15, 80, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CompletionQueue_spec, __pyx_ptype_7_cython_6cygrpc_CompletionQueue) < 0) __PYX_ERR(15, 80, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CompletionQueue = &__pyx_type_7_cython_6cygrpc_CompletionQueue;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CompletionQueue) < 0) __PYX_ERR(15, 80, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CompletionQueue->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CompletionQueue->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CompletionQueue->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CompletionQueue->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_CompletionQueue, __pyx_vtabptr_7_cython_6cygrpc_CompletionQueue) < 0) __PYX_ERR(15, 80, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_CompletionQueue) < 0) __PYX_ERR(15, 80, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CompletionQueue, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CompletionQueue) < 0) __PYX_ERR(15, 80, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CompletionQueue) < 0) __PYX_ERR(15, 80, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_BaseEvent = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_BaseEvent_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_BaseEvent)) __PYX_ERR(17, 15, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_BaseEvent_spec, __pyx_ptype_7_cython_6cygrpc_BaseEvent) < 0) __PYX_ERR(17, 15, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_BaseEvent = &__pyx_type_7_cython_6cygrpc_BaseEvent;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_BaseEvent) < 0) __PYX_ERR(17, 15, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_BaseEvent->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_BaseEvent, (PyObject *) __pyx_ptype_7_cython_6cygrpc_BaseEvent) < 0) __PYX_ERR(17, 15, __pyx_L1_error)
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_BaseEvent); if (unlikely(!__pyx_t_1)) __PYX_ERR(16, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ConnectivityEvent_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent)) __PYX_ERR(16, 15, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ConnectivityEvent_spec, __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent) < 0) __PYX_ERR(16, 15, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent = &__pyx_type_7_cython_6cygrpc_ConnectivityEvent;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent->tp_base = __pyx_ptype_7_cython_6cygrpc_BaseEvent;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent) < 0) __PYX_ERR(16, 15, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ConnectivityEvent->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ConnectivityEvent, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent) < 0) __PYX_ERR(16, 15, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ConnectivityEvent) < 0) __PYX_ERR(16, 15, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_BaseEvent); if (unlikely(!__pyx_t_1)) __PYX_ERR(16, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_RequestCallEvent = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_RequestCallEvent_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_RequestCallEvent)) __PYX_ERR(16, 24, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_RequestCallEvent_spec, __pyx_ptype_7_cython_6cygrpc_RequestCallEvent) < 0) __PYX_ERR(16, 24, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_RequestCallEvent = &__pyx_type_7_cython_6cygrpc_RequestCallEvent;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_RequestCallEvent->tp_base = __pyx_ptype_7_cython_6cygrpc_BaseEvent;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_RequestCallEvent) < 0) __PYX_ERR(16, 24, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_RequestCallEvent->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_RequestCallEvent->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_RequestCallEvent->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_RequestCallEvent->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RequestCallEvent, (PyObject *) __pyx_ptype_7_cython_6cygrpc_RequestCallEvent) < 0) __PYX_ERR(16, 24, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_RequestCallEvent) < 0) __PYX_ERR(16, 24, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_BaseEvent); if (unlikely(!__pyx_t_1)) __PYX_ERR(16, 37, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_BatchOperationEvent_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent)) __PYX_ERR(16, 37, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_BatchOperationEvent_spec, __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent) < 0) __PYX_ERR(16, 37, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent = &__pyx_type_7_cython_6cygrpc_BatchOperationEvent;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent->tp_base = __pyx_ptype_7_cython_6cygrpc_BaseEvent;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent) < 0) __PYX_ERR(16, 37, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_BatchOperationEvent->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_BatchOperationEvent, (PyObject *) __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent) < 0) __PYX_ERR(16, 37, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_BatchOperationEvent) < 0) __PYX_ERR(16, 37, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_BaseEvent); if (unlikely(!__pyx_t_1)) __PYX_ERR(16, 48, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ServerShutdownEvent_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent)) __PYX_ERR(16, 48, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ServerShutdownEvent_spec, __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent) < 0) __PYX_ERR(16, 48, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent = &__pyx_type_7_cython_6cygrpc_ServerShutdownEvent;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent->tp_base = __pyx_ptype_7_cython_6cygrpc_BaseEvent;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent) < 0) __PYX_ERR(16, 48, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ServerShutdownEvent, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent) < 0) __PYX_ERR(16, 48, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ServerShutdownEvent) < 0) __PYX_ERR(16, 48, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_Operation = &__pyx_vtable_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_Operation.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_9Operation_c;
+  __pyx_vtable_7_cython_6cygrpc_Operation.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_9Operation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_Operation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_Operation_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_Operation)) __PYX_ERR(19, 16, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_Operation_spec, __pyx_ptype_7_cython_6cygrpc_Operation) < 0) __PYX_ERR(19, 16, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_Operation = &__pyx_type_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_Operation) < 0) __PYX_ERR(19, 16, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_Operation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_Operation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_Operation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_Operation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_Operation, __pyx_vtabptr_7_cython_6cygrpc_Operation) < 0) __PYX_ERR(19, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_Operation) < 0) __PYX_ERR(19, 16, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Operation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_Operation) < 0) __PYX_ERR(19, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_Operation) < 0) __PYX_ERR(19, 16, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_SendInitialMetadataOperation = &__pyx_vtable_7_cython_6cygrpc_SendInitialMetadataOperation;
+  __pyx_vtable_7_cython_6cygrpc_SendInitialMetadataOperation.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_SendInitialMetadataOperation.__pyx_base.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_28SendInitialMetadataOperation_c;
+  __pyx_vtable_7_cython_6cygrpc_SendInitialMetadataOperation.__pyx_base.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_28SendInitialMetadataOperation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_Operation); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 25, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation)) __PYX_ERR(19, 25, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation_spec, __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation) < 0) __PYX_ERR(19, 25, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation = &__pyx_type_7_cython_6cygrpc_SendInitialMetadataOperation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation->tp_base = __pyx_ptype_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation) < 0) __PYX_ERR(19, 25, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation, __pyx_vtabptr_7_cython_6cygrpc_SendInitialMetadataOperation) < 0) __PYX_ERR(19, 25, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation) < 0) __PYX_ERR(19, 25, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SendInitialMetadataOperation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation) < 0) __PYX_ERR(19, 25, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation) < 0) __PYX_ERR(19, 25, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_SendMessageOperation = &__pyx_vtable_7_cython_6cygrpc_SendMessageOperation;
+  __pyx_vtable_7_cython_6cygrpc_SendMessageOperation.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_SendMessageOperation.__pyx_base.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_20SendMessageOperation_c;
+  __pyx_vtable_7_cython_6cygrpc_SendMessageOperation.__pyx_base.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_20SendMessageOperation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_Operation); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 49, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_SendMessageOperation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_SendMessageOperation_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_SendMessageOperation)) __PYX_ERR(19, 49, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_SendMessageOperation_spec, __pyx_ptype_7_cython_6cygrpc_SendMessageOperation) < 0) __PYX_ERR(19, 49, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_SendMessageOperation = &__pyx_type_7_cython_6cygrpc_SendMessageOperation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_SendMessageOperation->tp_base = __pyx_ptype_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_SendMessageOperation) < 0) __PYX_ERR(19, 49, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_SendMessageOperation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_SendMessageOperation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_SendMessageOperation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_SendMessageOperation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_SendMessageOperation, __pyx_vtabptr_7_cython_6cygrpc_SendMessageOperation) < 0) __PYX_ERR(19, 49, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_SendMessageOperation) < 0) __PYX_ERR(19, 49, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SendMessageOperation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_SendMessageOperation) < 0) __PYX_ERR(19, 49, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_SendMessageOperation) < 0) __PYX_ERR(19, 49, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_SendCloseFromClientOperation = &__pyx_vtable_7_cython_6cygrpc_SendCloseFromClientOperation;
+  __pyx_vtable_7_cython_6cygrpc_SendCloseFromClientOperation.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_SendCloseFromClientOperation.__pyx_base.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_28SendCloseFromClientOperation_c;
+  __pyx_vtable_7_cython_6cygrpc_SendCloseFromClientOperation.__pyx_base.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_28SendCloseFromClientOperation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_Operation); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 75, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation)) __PYX_ERR(19, 75, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation_spec, __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation) < 0) __PYX_ERR(19, 75, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation = &__pyx_type_7_cython_6cygrpc_SendCloseFromClientOperation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation->tp_base = __pyx_ptype_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation) < 0) __PYX_ERR(19, 75, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation, __pyx_vtabptr_7_cython_6cygrpc_SendCloseFromClientOperation) < 0) __PYX_ERR(19, 75, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation) < 0) __PYX_ERR(19, 75, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SendCloseFromClientOperation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation) < 0) __PYX_ERR(19, 75, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation) < 0) __PYX_ERR(19, 75, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_SendStatusFromServerOperation = &__pyx_vtable_7_cython_6cygrpc_SendStatusFromServerOperation;
+  __pyx_vtable_7_cython_6cygrpc_SendStatusFromServerOperation.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_SendStatusFromServerOperation.__pyx_base.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_29SendStatusFromServerOperation_c;
+  __pyx_vtable_7_cython_6cygrpc_SendStatusFromServerOperation.__pyx_base.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_29SendStatusFromServerOperation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_Operation); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 91, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation)) __PYX_ERR(19, 91, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation_spec, __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation) < 0) __PYX_ERR(19, 91, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation = &__pyx_type_7_cython_6cygrpc_SendStatusFromServerOperation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation->tp_base = __pyx_ptype_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation) < 0) __PYX_ERR(19, 91, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation, __pyx_vtabptr_7_cython_6cygrpc_SendStatusFromServerOperation) < 0) __PYX_ERR(19, 91, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation) < 0) __PYX_ERR(19, 91, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SendStatusFromServerOperation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation) < 0) __PYX_ERR(19, 91, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation) < 0) __PYX_ERR(19, 91, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_ReceiveInitialMetadataOperation = &__pyx_vtable_7_cython_6cygrpc_ReceiveInitialMetadataOperation;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveInitialMetadataOperation.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveInitialMetadataOperation.__pyx_base.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_c;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveInitialMetadataOperation.__pyx_base.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_Operation); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 122, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation)) __PYX_ERR(19, 122, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation_spec, __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation) < 0) __PYX_ERR(19, 122, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation = &__pyx_type_7_cython_6cygrpc_ReceiveInitialMetadataOperation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation->tp_base = __pyx_ptype_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation) < 0) __PYX_ERR(19, 122, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation, __pyx_vtabptr_7_cython_6cygrpc_ReceiveInitialMetadataOperation) < 0) __PYX_ERR(19, 122, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation) < 0) __PYX_ERR(19, 122, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ReceiveInitialMetadataOperation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation) < 0) __PYX_ERR(19, 122, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation) < 0) __PYX_ERR(19, 122, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_ReceiveMessageOperation = &__pyx_vtable_7_cython_6cygrpc_ReceiveMessageOperation;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveMessageOperation.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveMessageOperation.__pyx_base.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_23ReceiveMessageOperation_c;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveMessageOperation.__pyx_base.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_23ReceiveMessageOperation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_Operation); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 145, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ReceiveMessageOperation_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation)) __PYX_ERR(19, 145, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ReceiveMessageOperation_spec, __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation) < 0) __PYX_ERR(19, 145, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation = &__pyx_type_7_cython_6cygrpc_ReceiveMessageOperation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation->tp_base = __pyx_ptype_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation) < 0) __PYX_ERR(19, 145, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation, __pyx_vtabptr_7_cython_6cygrpc_ReceiveMessageOperation) < 0) __PYX_ERR(19, 145, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation) < 0) __PYX_ERR(19, 145, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ReceiveMessageOperation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation) < 0) __PYX_ERR(19, 145, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation) < 0) __PYX_ERR(19, 145, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_ReceiveStatusOnClientOperation = &__pyx_vtable_7_cython_6cygrpc_ReceiveStatusOnClientOperation;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveStatusOnClientOperation.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveStatusOnClientOperation.__pyx_base.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_c;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveStatusOnClientOperation.__pyx_base.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_Operation); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation)) __PYX_ERR(19, 187, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation_spec, __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation) < 0) __PYX_ERR(19, 187, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation = &__pyx_type_7_cython_6cygrpc_ReceiveStatusOnClientOperation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation->tp_base = __pyx_ptype_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation) < 0) __PYX_ERR(19, 187, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation, __pyx_vtabptr_7_cython_6cygrpc_ReceiveStatusOnClientOperation) < 0) __PYX_ERR(19, 187, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation) < 0) __PYX_ERR(19, 187, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ReceiveStatusOnClientOperation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation) < 0) __PYX_ERR(19, 187, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation) < 0) __PYX_ERR(19, 187, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_ReceiveCloseOnServerOperation = &__pyx_vtable_7_cython_6cygrpc_ReceiveCloseOnServerOperation;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveCloseOnServerOperation.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_Operation;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveCloseOnServerOperation.__pyx_base.c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_c;
+  __pyx_vtable_7_cython_6cygrpc_ReceiveCloseOnServerOperation.__pyx_base.un_c = (void (*)(struct __pyx_obj_7_cython_6cygrpc_Operation *))__pyx_f_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_un_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_Operation); if (unlikely(!__pyx_t_1)) __PYX_ERR(19, 233, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation)) __PYX_ERR(19, 233, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation_spec, __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation) < 0) __PYX_ERR(19, 233, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation = &__pyx_type_7_cython_6cygrpc_ReceiveCloseOnServerOperation;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation->tp_base = __pyx_ptype_7_cython_6cygrpc_Operation;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation) < 0) __PYX_ERR(19, 233, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation, __pyx_vtabptr_7_cython_6cygrpc_ReceiveCloseOnServerOperation) < 0) __PYX_ERR(19, 233, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation) < 0) __PYX_ERR(19, 233, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ReceiveCloseOnServerOperation, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation) < 0) __PYX_ERR(19, 233, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation) < 0) __PYX_ERR(19, 233, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_CallDetails = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CallDetails_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CallDetails)) __PYX_ERR(21, 130, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CallDetails_spec, __pyx_ptype_7_cython_6cygrpc_CallDetails) < 0) __PYX_ERR(21, 130, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CallDetails = &__pyx_type_7_cython_6cygrpc_CallDetails;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CallDetails) < 0) __PYX_ERR(21, 130, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CallDetails->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CallDetails->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CallDetails->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CallDetails->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CallDetails, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CallDetails) < 0) __PYX_ERR(21, 130, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CallDetails) < 0) __PYX_ERR(21, 130, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_SslPemKeyCertPair_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair)) __PYX_ERR(21, 155, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_SslPemKeyCertPair_spec, __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair) < 0) __PYX_ERR(21, 155, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair = &__pyx_type_7_cython_6cygrpc_SslPemKeyCertPair;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair) < 0) __PYX_ERR(21, 155, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SslPemKeyCertPair, (PyObject *) __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair) < 0) __PYX_ERR(21, 155, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_SslPemKeyCertPair) < 0) __PYX_ERR(21, 155, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_CompressionOptions = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CompressionOptions_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CompressionOptions)) __PYX_ERR(21, 164, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CompressionOptions_spec, __pyx_ptype_7_cython_6cygrpc_CompressionOptions) < 0) __PYX_ERR(21, 164, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CompressionOptions = &__pyx_type_7_cython_6cygrpc_CompressionOptions;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CompressionOptions) < 0) __PYX_ERR(21, 164, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CompressionOptions->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CompressionOptions->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CompressionOptions->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CompressionOptions->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CompressionOptions, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CompressionOptions) < 0) __PYX_ERR(21, 164, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CompressionOptions) < 0) __PYX_ERR(21, 164, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_Server = &__pyx_vtable_7_cython_6cygrpc_Server;
+  __pyx_vtable_7_cython_6cygrpc_Server._c_shutdown = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_Server *, struct __pyx_obj_7_cython_6cygrpc_CompletionQueue *, PyObject *))__pyx_f_7_cython_6cygrpc_6Server__c_shutdown;
+  __pyx_vtable_7_cython_6cygrpc_Server.notify_shutdown_complete = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_Server *))__pyx_f_7_cython_6cygrpc_6Server_notify_shutdown_complete;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_Server = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_Server_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_Server)) __PYX_ERR(23, 16, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_Server_spec, __pyx_ptype_7_cython_6cygrpc_Server) < 0) __PYX_ERR(23, 16, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_Server = &__pyx_type_7_cython_6cygrpc_Server;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_Server) < 0) __PYX_ERR(23, 16, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_Server->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_Server->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_Server->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_Server->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_Server, __pyx_vtabptr_7_cython_6cygrpc_Server) < 0) __PYX_ERR(23, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_Server) < 0) __PYX_ERR(23, 16, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Server, (PyObject *) __pyx_ptype_7_cython_6cygrpc_Server) < 0) __PYX_ERR(23, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_Server) < 0) __PYX_ERR(23, 16, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc__Tag = &__pyx_vtable_7_cython_6cygrpc__Tag;
+  __pyx_vtable_7_cython_6cygrpc__Tag.event = (struct __pyx_obj_7_cython_6cygrpc_BaseEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__Tag *, grpc_event))__pyx_f_7_cython_6cygrpc_4_Tag_event;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__Tag = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__Tag_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__Tag)) __PYX_ERR(24, 16, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__Tag_spec, __pyx_ptype_7_cython_6cygrpc__Tag) < 0) __PYX_ERR(24, 16, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__Tag = &__pyx_type_7_cython_6cygrpc__Tag;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__Tag) < 0) __PYX_ERR(24, 16, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__Tag->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__Tag->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__Tag->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__Tag->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__Tag, __pyx_vtabptr_7_cython_6cygrpc__Tag) < 0) __PYX_ERR(24, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__Tag) < 0) __PYX_ERR(24, 16, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Tag, (PyObject *) __pyx_ptype_7_cython_6cygrpc__Tag) < 0) __PYX_ERR(24, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__Tag) < 0) __PYX_ERR(24, 16, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc__ConnectivityTag = &__pyx_vtable_7_cython_6cygrpc__ConnectivityTag;
+  __pyx_vtable_7_cython_6cygrpc__ConnectivityTag.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc__Tag;
+  __pyx_vtable_7_cython_6cygrpc__ConnectivityTag.__pyx_base.event = (struct __pyx_obj_7_cython_6cygrpc_BaseEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__Tag *, grpc_event))__pyx_f_7_cython_6cygrpc_16_ConnectivityTag_event__pyx_wrap_1;
+  __pyx_vtable_7_cython_6cygrpc__ConnectivityTag.event = (struct __pyx_obj_7_cython_6cygrpc_ConnectivityEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__ConnectivityTag *, grpc_event))__pyx_f_7_cython_6cygrpc_16_ConnectivityTag_event;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc__Tag); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc__ConnectivityTag = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__ConnectivityTag_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc__ConnectivityTag)) __PYX_ERR(24, 22, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__ConnectivityTag_spec, __pyx_ptype_7_cython_6cygrpc__ConnectivityTag) < 0) __PYX_ERR(24, 22, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__ConnectivityTag = &__pyx_type_7_cython_6cygrpc__ConnectivityTag;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc__ConnectivityTag->tp_base = __pyx_ptype_7_cython_6cygrpc__Tag;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__ConnectivityTag) < 0) __PYX_ERR(24, 22, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__ConnectivityTag->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__ConnectivityTag->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__ConnectivityTag->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__ConnectivityTag->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__ConnectivityTag, __pyx_vtabptr_7_cython_6cygrpc__ConnectivityTag) < 0) __PYX_ERR(24, 22, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__ConnectivityTag) < 0) __PYX_ERR(24, 22, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ConnectivityTag, (PyObject *) __pyx_ptype_7_cython_6cygrpc__ConnectivityTag) < 0) __PYX_ERR(24, 22, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__ConnectivityTag) < 0) __PYX_ERR(24, 22, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc__RequestCallTag = &__pyx_vtable_7_cython_6cygrpc__RequestCallTag;
+  __pyx_vtable_7_cython_6cygrpc__RequestCallTag.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc__Tag;
+  __pyx_vtable_7_cython_6cygrpc__RequestCallTag.__pyx_base.event = (struct __pyx_obj_7_cython_6cygrpc_BaseEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__Tag *, grpc_event))__pyx_f_7_cython_6cygrpc_15_RequestCallTag_event__pyx_wrap_1;
+  __pyx_vtable_7_cython_6cygrpc__RequestCallTag.prepare = (void (*)(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *))__pyx_f_7_cython_6cygrpc_15_RequestCallTag_prepare;
+  __pyx_vtable_7_cython_6cygrpc__RequestCallTag.event = (struct __pyx_obj_7_cython_6cygrpc_RequestCallEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__RequestCallTag *, grpc_event))__pyx_f_7_cython_6cygrpc_15_RequestCallTag_event;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc__Tag); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 31, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc__RequestCallTag = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__RequestCallTag_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc__RequestCallTag)) __PYX_ERR(24, 31, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__RequestCallTag_spec, __pyx_ptype_7_cython_6cygrpc__RequestCallTag) < 0) __PYX_ERR(24, 31, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__RequestCallTag = &__pyx_type_7_cython_6cygrpc__RequestCallTag;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc__RequestCallTag->tp_base = __pyx_ptype_7_cython_6cygrpc__Tag;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__RequestCallTag) < 0) __PYX_ERR(24, 31, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__RequestCallTag->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__RequestCallTag->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__RequestCallTag->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__RequestCallTag->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__RequestCallTag, __pyx_vtabptr_7_cython_6cygrpc__RequestCallTag) < 0) __PYX_ERR(24, 31, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__RequestCallTag) < 0) __PYX_ERR(24, 31, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RequestCallTag, (PyObject *) __pyx_ptype_7_cython_6cygrpc__RequestCallTag) < 0) __PYX_ERR(24, 31, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__RequestCallTag) < 0) __PYX_ERR(24, 31, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc__BatchOperationTag = &__pyx_vtable_7_cython_6cygrpc__BatchOperationTag;
+  __pyx_vtable_7_cython_6cygrpc__BatchOperationTag.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc__Tag;
+  __pyx_vtable_7_cython_6cygrpc__BatchOperationTag.__pyx_base.event = (struct __pyx_obj_7_cython_6cygrpc_BaseEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__Tag *, grpc_event))__pyx_f_7_cython_6cygrpc_18_BatchOperationTag_event__pyx_wrap_1;
+  __pyx_vtable_7_cython_6cygrpc__BatchOperationTag.prepare = (void (*)(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *))__pyx_f_7_cython_6cygrpc_18_BatchOperationTag_prepare;
+  __pyx_vtable_7_cython_6cygrpc__BatchOperationTag.event = (struct __pyx_obj_7_cython_6cygrpc_BatchOperationEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__BatchOperationTag *, grpc_event))__pyx_f_7_cython_6cygrpc_18_BatchOperationTag_event;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc__Tag); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 51, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc__BatchOperationTag = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__BatchOperationTag_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc__BatchOperationTag)) __PYX_ERR(24, 51, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__BatchOperationTag_spec, __pyx_ptype_7_cython_6cygrpc__BatchOperationTag) < 0) __PYX_ERR(24, 51, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__BatchOperationTag = &__pyx_type_7_cython_6cygrpc__BatchOperationTag;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc__BatchOperationTag->tp_base = __pyx_ptype_7_cython_6cygrpc__Tag;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__BatchOperationTag) < 0) __PYX_ERR(24, 51, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__BatchOperationTag->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__BatchOperationTag->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__BatchOperationTag->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__BatchOperationTag->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__BatchOperationTag, __pyx_vtabptr_7_cython_6cygrpc__BatchOperationTag) < 0) __PYX_ERR(24, 51, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__BatchOperationTag) < 0) __PYX_ERR(24, 51, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_BatchOperationTag, (PyObject *) __pyx_ptype_7_cython_6cygrpc__BatchOperationTag) < 0) __PYX_ERR(24, 51, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__BatchOperationTag) < 0) __PYX_ERR(24, 51, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc__ServerShutdownTag = &__pyx_vtable_7_cython_6cygrpc__ServerShutdownTag;
+  __pyx_vtable_7_cython_6cygrpc__ServerShutdownTag.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc__Tag;
+  __pyx_vtable_7_cython_6cygrpc__ServerShutdownTag.__pyx_base.event = (struct __pyx_obj_7_cython_6cygrpc_BaseEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__Tag *, grpc_event))__pyx_f_7_cython_6cygrpc_18_ServerShutdownTag_event__pyx_wrap_1;
+  __pyx_vtable_7_cython_6cygrpc__ServerShutdownTag.event = (struct __pyx_obj_7_cython_6cygrpc_ServerShutdownEvent *(*)(struct __pyx_obj_7_cython_6cygrpc__ServerShutdownTag *, grpc_event))__pyx_f_7_cython_6cygrpc_18_ServerShutdownTag_event;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc__Tag); if (unlikely(!__pyx_t_1)) __PYX_ERR(24, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__ServerShutdownTag_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag)) __PYX_ERR(24, 80, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__ServerShutdownTag_spec, __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag) < 0) __PYX_ERR(24, 80, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag = &__pyx_type_7_cython_6cygrpc__ServerShutdownTag;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag->tp_base = __pyx_ptype_7_cython_6cygrpc__Tag;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag) < 0) __PYX_ERR(24, 80, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag, __pyx_vtabptr_7_cython_6cygrpc__ServerShutdownTag) < 0) __PYX_ERR(24, 80, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__ServerShutdownTag) < 0) __PYX_ERR(24, 80, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ServerShutdownTag, (PyObject *) __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag) < 0) __PYX_ERR(24, 80, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__ServerShutdownTag) < 0) __PYX_ERR(24, 80, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_BaseCompletionQueue = &__pyx_vtable_7_cython_6cygrpc_BaseCompletionQueue;
+  __pyx_vtable_7_cython_6cygrpc_BaseCompletionQueue.c_ptr = (grpc_completion_queue *(*)(struct __pyx_obj_7_cython_6cygrpc_BaseCompletionQueue *))__pyx_f_7_cython_6cygrpc_19BaseCompletionQueue_c_ptr;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_BaseCompletionQueue_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue)) __PYX_ERR(7, 38, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_BaseCompletionQueue_spec, __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue) < 0) __PYX_ERR(7, 38, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue = &__pyx_type_7_cython_6cygrpc_BaseCompletionQueue;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue) < 0) __PYX_ERR(7, 38, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue, __pyx_vtabptr_7_cython_6cygrpc_BaseCompletionQueue) < 0) __PYX_ERR(7, 38, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue) < 0) __PYX_ERR(7, 38, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_BaseCompletionQueue, (PyObject *) __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue) < 0) __PYX_ERR(7, 38, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue) < 0) __PYX_ERR(7, 38, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__BoundEventLoop = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__BoundEventLoop_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__BoundEventLoop)) __PYX_ERR(7, 44, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__BoundEventLoop_spec, __pyx_ptype_7_cython_6cygrpc__BoundEventLoop) < 0) __PYX_ERR(7, 44, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__BoundEventLoop = &__pyx_type_7_cython_6cygrpc__BoundEventLoop;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__BoundEventLoop) < 0) __PYX_ERR(7, 44, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__BoundEventLoop->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__BoundEventLoop->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__BoundEventLoop->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__BoundEventLoop->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_BoundEventLoop, (PyObject *) __pyx_ptype_7_cython_6cygrpc__BoundEventLoop) < 0) __PYX_ERR(7, 44, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__BoundEventLoop) < 0) __PYX_ERR(7, 44, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_PollerCompletionQueue = &__pyx_vtable_7_cython_6cygrpc_PollerCompletionQueue;
+  __pyx_vtable_7_cython_6cygrpc_PollerCompletionQueue.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_BaseCompletionQueue;
+  __pyx_vtable_7_cython_6cygrpc_PollerCompletionQueue._poll = (void (*)(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *))__pyx_f_7_cython_6cygrpc_21PollerCompletionQueue__poll;
+  __pyx_vtable_7_cython_6cygrpc_PollerCompletionQueue.shutdown = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_PollerCompletionQueue *))__pyx_f_7_cython_6cygrpc_21PollerCompletionQueue_shutdown;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 72, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_PollerCompletionQueue_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue)) __PYX_ERR(7, 72, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_PollerCompletionQueue_spec, __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue) < 0) __PYX_ERR(7, 72, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue = &__pyx_type_7_cython_6cygrpc_PollerCompletionQueue;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue->tp_base = __pyx_ptype_7_cython_6cygrpc_BaseCompletionQueue;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue) < 0) __PYX_ERR(7, 72, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue, __pyx_vtabptr_7_cython_6cygrpc_PollerCompletionQueue) < 0) __PYX_ERR(7, 72, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue) < 0) __PYX_ERR(7, 72, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_PollerCompletionQueue, (PyObject *) __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue) < 0) __PYX_ERR(7, 72, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue) < 0) __PYX_ERR(7, 72, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_AioRpcStatus = &__pyx_vtable_7_cython_6cygrpc_AioRpcStatus;
+  __pyx_vtable_7_cython_6cygrpc_AioRpcStatus.code = (grpc_status_code (*)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *, int __pyx_skip_dispatch))__pyx_f_7_cython_6cygrpc_12AioRpcStatus_code;
+  __pyx_vtable_7_cython_6cygrpc_AioRpcStatus.details = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *, int __pyx_skip_dispatch))__pyx_f_7_cython_6cygrpc_12AioRpcStatus_details;
+  __pyx_vtable_7_cython_6cygrpc_AioRpcStatus.trailing_metadata = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *, int __pyx_skip_dispatch))__pyx_f_7_cython_6cygrpc_12AioRpcStatus_trailing_metadata;
+  __pyx_vtable_7_cython_6cygrpc_AioRpcStatus.debug_error_string = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *, int __pyx_skip_dispatch))__pyx_f_7_cython_6cygrpc_12AioRpcStatus_debug_error_string;
+  __pyx_vtable_7_cython_6cygrpc_AioRpcStatus.c_code = (grpc_status_code (*)(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *))__pyx_f_7_cython_6cygrpc_12AioRpcStatus_c_code;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])); if (unlikely(!__pyx_t_1)) __PYX_ERR(30, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_AioRpcStatus = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_AioRpcStatus_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_AioRpcStatus)) __PYX_ERR(30, 17, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_AioRpcStatus_spec, __pyx_ptype_7_cython_6cygrpc_AioRpcStatus) < 0) __PYX_ERR(30, 17, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_AioRpcStatus = &__pyx_type_7_cython_6cygrpc_AioRpcStatus;
+  #endif
+  if (sizeof(struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus) != sizeof(PyBaseExceptionObject)) {
+    if (__Pyx_validate_extern_base((&((PyTypeObject*)PyExc_Exception)[0])) < 0) __PYX_ERR(30, 17, __pyx_L1_error)
+  }
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_AioRpcStatus->tp_base = (&((PyTypeObject*)PyExc_Exception)[0]);
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_AioRpcStatus) < 0) __PYX_ERR(30, 17, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_AioRpcStatus->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_AioRpcStatus->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_AioRpcStatus->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_AioRpcStatus->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_AioRpcStatus, __pyx_vtabptr_7_cython_6cygrpc_AioRpcStatus) < 0) __PYX_ERR(30, 17, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_AioRpcStatus) < 0) __PYX_ERR(30, 17, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_AioRpcStatus, (PyObject *) __pyx_ptype_7_cython_6cygrpc_AioRpcStatus) < 0) __PYX_ERR(30, 17, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_AioRpcStatus) < 0) __PYX_ERR(30, 17, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__AioState = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__AioState_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__AioState)) __PYX_ERR(33, 36, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__AioState_spec, __pyx_ptype_7_cython_6cygrpc__AioState) < 0) __PYX_ERR(33, 36, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__AioState = &__pyx_type_7_cython_6cygrpc__AioState;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__AioState) < 0) __PYX_ERR(33, 36, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__AioState->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__AioState->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__AioState->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__AioState->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_AioState, (PyObject *) __pyx_ptype_7_cython_6cygrpc__AioState) < 0) __PYX_ERR(33, 36, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__AioState) < 0) __PYX_ERR(33, 36, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_CallbackFailureHandler = &__pyx_vtable_7_cython_6cygrpc_CallbackFailureHandler;
+  __pyx_vtable_7_cython_6cygrpc_CallbackFailureHandler.handle = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *, PyObject *))__pyx_f_7_cython_6cygrpc_22CallbackFailureHandler_handle;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CallbackFailureHandler_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler)) __PYX_ERR(32, 16, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CallbackFailureHandler_spec, __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler) < 0) __PYX_ERR(32, 16, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler = &__pyx_type_7_cython_6cygrpc_CallbackFailureHandler;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler) < 0) __PYX_ERR(32, 16, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler, __pyx_vtabptr_7_cython_6cygrpc_CallbackFailureHandler) < 0) __PYX_ERR(32, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler) < 0) __PYX_ERR(32, 16, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CallbackFailureHandler, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler) < 0) __PYX_ERR(32, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler) < 0) __PYX_ERR(32, 16, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_CallbackWrapper = &__pyx_vtable_7_cython_6cygrpc_CallbackWrapper;
+  __pyx_vtable_7_cython_6cygrpc_CallbackWrapper.functor_run = (void (*)(grpc_completion_queue_functor *, int))__pyx_f_7_cython_6cygrpc_15CallbackWrapper_functor_run;
+  __pyx_vtable_7_cython_6cygrpc_CallbackWrapper.c_functor = (grpc_completion_queue_functor *(*)(struct __pyx_obj_7_cython_6cygrpc_CallbackWrapper *))__pyx_f_7_cython_6cygrpc_15CallbackWrapper_c_functor;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_CallbackWrapper = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CallbackWrapper_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CallbackWrapper)) __PYX_ERR(32, 33, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CallbackWrapper_spec, __pyx_ptype_7_cython_6cygrpc_CallbackWrapper) < 0) __PYX_ERR(32, 33, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CallbackWrapper = &__pyx_type_7_cython_6cygrpc_CallbackWrapper;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CallbackWrapper) < 0) __PYX_ERR(32, 33, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CallbackWrapper->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CallbackWrapper->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CallbackWrapper->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CallbackWrapper->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_CallbackWrapper, __pyx_vtabptr_7_cython_6cygrpc_CallbackWrapper) < 0) __PYX_ERR(32, 33, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_CallbackWrapper) < 0) __PYX_ERR(32, 33, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CallbackWrapper, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CallbackWrapper) < 0) __PYX_ERR(32, 33, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CallbackWrapper) < 0) __PYX_ERR(32, 33, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_GrpcCallWrapper_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper)) __PYX_ERR(36, 56, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_GrpcCallWrapper_spec, __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper) < 0) __PYX_ERR(36, 56, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper = &__pyx_type_7_cython_6cygrpc_GrpcCallWrapper;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper) < 0) __PYX_ERR(36, 56, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_GrpcCallWrapper, (PyObject *) __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper) < 0) __PYX_ERR(36, 56, __pyx_L1_error)
+  __pyx_vtabptr_7_cython_6cygrpc__AioCall = &__pyx_vtable_7_cython_6cygrpc__AioCall;
+  __pyx_vtable_7_cython_6cygrpc__AioCall._create_grpc_call = (void (*)(struct __pyx_obj_7_cython_6cygrpc__AioCall *, PyObject *, PyObject *, struct __pyx_obj_7_cython_6cygrpc_CallCredentials *))__pyx_f_7_cython_6cygrpc_8_AioCall__create_grpc_call;
+  __pyx_vtable_7_cython_6cygrpc__AioCall._set_status = (void (*)(struct __pyx_obj_7_cython_6cygrpc__AioCall *, struct __pyx_obj_7_cython_6cygrpc_AioRpcStatus *))__pyx_f_7_cython_6cygrpc_8_AioCall__set_status;
+  __pyx_vtable_7_cython_6cygrpc__AioCall._set_initial_metadata = (void (*)(struct __pyx_obj_7_cython_6cygrpc__AioCall *, PyObject *))__pyx_f_7_cython_6cygrpc_8_AioCall__set_initial_metadata;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper); if (unlikely(!__pyx_t_1)) __PYX_ERR(34, 45, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc__AioCall = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__AioCall_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc__AioCall)) __PYX_ERR(34, 45, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__AioCall_spec, __pyx_ptype_7_cython_6cygrpc__AioCall) < 0) __PYX_ERR(34, 45, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__AioCall = &__pyx_type_7_cython_6cygrpc__AioCall;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc__AioCall->tp_base = __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__AioCall) < 0) __PYX_ERR(34, 45, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__AioCall->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__AioCall->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__AioCall->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__AioCall->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_vtabptr_7_cython_6cygrpc__AioCall) < 0) __PYX_ERR(34, 45, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc__AioCall) < 0) __PYX_ERR(34, 45, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_AioCall, (PyObject *) __pyx_ptype_7_cython_6cygrpc__AioCall) < 0) __PYX_ERR(34, 45, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__AioCall) < 0) __PYX_ERR(34, 45, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_AioChannel = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_AioChannel_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_AioChannel)) __PYX_ERR(8, 28, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_AioChannel_spec, __pyx_ptype_7_cython_6cygrpc_AioChannel) < 0) __PYX_ERR(8, 28, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_AioChannel = &__pyx_type_7_cython_6cygrpc_AioChannel;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_AioChannel) < 0) __PYX_ERR(8, 28, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_AioChannel->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_AioChannel->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_AioChannel->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_AioChannel->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_AioChannel, (PyObject *) __pyx_ptype_7_cython_6cygrpc_AioChannel) < 0) __PYX_ERR(8, 28, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_AioChannel) < 0) __PYX_ERR(8, 28, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__HandlerCallDetails_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__HandlerCallDetails)) __PYX_ERR(9, 35, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__HandlerCallDetails_spec, __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails) < 0) __PYX_ERR(9, 35, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails = &__pyx_type_7_cython_6cygrpc__HandlerCallDetails;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__HandlerCallDetails) < 0) __PYX_ERR(9, 35, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__HandlerCallDetails->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HandlerCallDetails, (PyObject *) __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails) < 0) __PYX_ERR(9, 35, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__HandlerCallDetails) < 0) __PYX_ERR(9, 35, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_RPCState = &__pyx_vtable_7_cython_6cygrpc_RPCState;
+  __pyx_vtable_7_cython_6cygrpc_RPCState.method = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_RPCState *))__pyx_f_7_cython_6cygrpc_8RPCState_method;
+  __pyx_vtable_7_cython_6cygrpc_RPCState.invocation_metadata = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_RPCState *))__pyx_f_7_cython_6cygrpc_8RPCState_invocation_metadata;
+  __pyx_vtable_7_cython_6cygrpc_RPCState.raise_for_termination = (void (*)(struct __pyx_obj_7_cython_6cygrpc_RPCState *))__pyx_f_7_cython_6cygrpc_8RPCState_raise_for_termination;
+  __pyx_vtable_7_cython_6cygrpc_RPCState.get_write_flag = (int (*)(struct __pyx_obj_7_cython_6cygrpc_RPCState *))__pyx_f_7_cython_6cygrpc_8RPCState_get_write_flag;
+  __pyx_vtable_7_cython_6cygrpc_RPCState.create_send_initial_metadata_op_if_not_sent = (struct __pyx_obj_7_cython_6cygrpc_Operation *(*)(struct __pyx_obj_7_cython_6cygrpc_RPCState *))__pyx_f_7_cython_6cygrpc_8RPCState_create_send_initial_metadata_op_if_not_sent;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper); if (unlikely(!__pyx_t_1)) __PYX_ERR(9, 45, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_RPCState = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_RPCState_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_RPCState)) __PYX_ERR(9, 45, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_RPCState_spec, __pyx_ptype_7_cython_6cygrpc_RPCState) < 0) __PYX_ERR(9, 45, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_RPCState = &__pyx_type_7_cython_6cygrpc_RPCState;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_RPCState->tp_base = __pyx_ptype_7_cython_6cygrpc_GrpcCallWrapper;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_RPCState) < 0) __PYX_ERR(9, 45, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_RPCState->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_RPCState->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_RPCState->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_RPCState->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_RPCState, __pyx_vtabptr_7_cython_6cygrpc_RPCState) < 0) __PYX_ERR(9, 45, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_RPCState) < 0) __PYX_ERR(9, 45, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RPCState, (PyObject *) __pyx_ptype_7_cython_6cygrpc_RPCState) < 0) __PYX_ERR(9, 45, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_RPCState) < 0) __PYX_ERR(9, 45, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__ServicerContext = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__ServicerContext_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__ServicerContext)) __PYX_ERR(9, 115, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__ServicerContext_spec, __pyx_ptype_7_cython_6cygrpc__ServicerContext) < 0) __PYX_ERR(9, 115, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__ServicerContext = &__pyx_type_7_cython_6cygrpc__ServicerContext;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__ServicerContext) < 0) __PYX_ERR(9, 115, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__ServicerContext->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__ServicerContext->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__ServicerContext->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__ServicerContext->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ServicerContext, (PyObject *) __pyx_ptype_7_cython_6cygrpc__ServicerContext) < 0) __PYX_ERR(9, 115, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__ServicerContext) < 0) __PYX_ERR(9, 115, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__SyncServicerContext = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__SyncServicerContext_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__SyncServicerContext)) __PYX_ERR(9, 292, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__SyncServicerContext_spec, __pyx_ptype_7_cython_6cygrpc__SyncServicerContext) < 0) __PYX_ERR(9, 292, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__SyncServicerContext = &__pyx_type_7_cython_6cygrpc__SyncServicerContext;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext) < 0) __PYX_ERR(9, 292, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__SyncServicerContext->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__SyncServicerContext->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__SyncServicerContext->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__SyncServicerContext->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_SyncServicerContext, (PyObject *) __pyx_ptype_7_cython_6cygrpc__SyncServicerContext) < 0) __PYX_ERR(9, 292, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__SyncServicerContext) < 0) __PYX_ERR(9, 292, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__MessageReceiver = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__MessageReceiver_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__MessageReceiver)) __PYX_ERR(9, 596, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__MessageReceiver_spec, __pyx_ptype_7_cython_6cygrpc__MessageReceiver) < 0) __PYX_ERR(9, 596, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__MessageReceiver = &__pyx_type_7_cython_6cygrpc__MessageReceiver;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__MessageReceiver) < 0) __PYX_ERR(9, 596, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__MessageReceiver->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__MessageReceiver->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__MessageReceiver->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__MessageReceiver->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_MessageReceiver, (PyObject *) __pyx_ptype_7_cython_6cygrpc__MessageReceiver) < 0) __PYX_ERR(9, 596, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__MessageReceiver) < 0) __PYX_ERR(9, 596, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter)) __PYX_ERR(9, 860, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter_spec, __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter) < 0) __PYX_ERR(9, 860, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter = &__pyx_type_7_cython_6cygrpc__ConcurrentRpcLimiter;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter) < 0) __PYX_ERR(9, 860, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ConcurrentRpcLimiter, (PyObject *) __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter) < 0) __PYX_ERR(9, 860, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter) < 0) __PYX_ERR(9, 860, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_AioServer = &__pyx_vtable_7_cython_6cygrpc_AioServer;
+  __pyx_vtable_7_cython_6cygrpc_AioServer.thread_pool = (PyObject *(*)(struct __pyx_obj_7_cython_6cygrpc_AioServer *))__pyx_f_7_cython_6cygrpc_9AioServer_thread_pool;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_AioServer = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_AioServer_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_AioServer)) __PYX_ERR(9, 884, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_AioServer_spec, __pyx_ptype_7_cython_6cygrpc_AioServer) < 0) __PYX_ERR(9, 884, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_AioServer = &__pyx_type_7_cython_6cygrpc_AioServer;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_AioServer) < 0) __PYX_ERR(9, 884, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_AioServer->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_AioServer->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_AioServer->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_AioServer->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_vtabptr_7_cython_6cygrpc_AioServer) < 0) __PYX_ERR(9, 884, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_AioServer) < 0) __PYX_ERR(9, 884, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_AioServer, (PyObject *) __pyx_ptype_7_cython_6cygrpc_AioServer) < 0) __PYX_ERR(9, 884, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_AioServer) < 0) __PYX_ERR(9, 884, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc__GrpcArgWrapper_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper)) __PYX_ERR(3, 16, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc__GrpcArgWrapper_spec, __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper) < 0) __PYX_ERR(3, 16, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper = &__pyx_type_7_cython_6cygrpc__GrpcArgWrapper;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper) < 0) __PYX_ERR(3, 16, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_GrpcArgWrapper, (PyObject *) __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper) < 0) __PYX_ERR(3, 16, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc__GrpcArgWrapper) < 0) __PYX_ERR(3, 16, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_InsecureChannelCredentials = &__pyx_vtable_7_cython_6cygrpc_InsecureChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_InsecureChannelCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_InsecureChannelCredentials.__pyx_base.c = (grpc_channel_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *))__pyx_f_7_cython_6cygrpc_26InsecureChannelCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 373, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_InsecureChannelCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials)) __PYX_ERR(5, 373, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_InsecureChannelCredentials_spec, __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials) < 0) __PYX_ERR(5, 373, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials = &__pyx_type_7_cython_6cygrpc_InsecureChannelCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_ChannelCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials) < 0) __PYX_ERR(5, 373, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials, __pyx_vtabptr_7_cython_6cygrpc_InsecureChannelCredentials) < 0) __PYX_ERR(5, 373, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials) < 0) __PYX_ERR(5, 373, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_InsecureChannelCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials) < 0) __PYX_ERR(5, 373, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials) < 0) __PYX_ERR(5, 373, __pyx_L1_error)
+  #endif
+  __pyx_vtabptr_7_cython_6cygrpc_ComputeEngineChannelCredentials = &__pyx_vtable_7_cython_6cygrpc_ComputeEngineChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_ComputeEngineChannelCredentials.__pyx_base = *__pyx_vtabptr_7_cython_6cygrpc_ChannelCredentials;
+  __pyx_vtable_7_cython_6cygrpc_ComputeEngineChannelCredentials.__pyx_base.c = (grpc_channel_credentials *(*)(struct __pyx_obj_7_cython_6cygrpc_ChannelCredentials *))__pyx_f_7_cython_6cygrpc_31ComputeEngineChannelCredentials_c;
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 429, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials_spec, __pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (unlikely(!__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials)) __PYX_ERR(5, 429, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials_spec, __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials) < 0) __PYX_ERR(5, 429, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials = &__pyx_type_7_cython_6cygrpc_ComputeEngineChannelCredentials;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials->tp_base = __pyx_ptype_7_cython_6cygrpc_ChannelCredentials;
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials) < 0) __PYX_ERR(5, 429, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (__Pyx_SetVtable(__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials, __pyx_vtabptr_7_cython_6cygrpc_ComputeEngineChannelCredentials) < 0) __PYX_ERR(5, 429, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_MergeVtables(__pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials) < 0) __PYX_ERR(5, 429, __pyx_L1_error)
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_ComputeEngineChannelCredentials, (PyObject *) __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials) < 0) __PYX_ERR(5, 429, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_ComputeEngineChannelCredentials) < 0) __PYX_ERR(5, 429, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc_CensusContext = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc_CensusContext_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc_CensusContext)) __PYX_ERR(26, 31, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc_CensusContext_spec, __pyx_ptype_7_cython_6cygrpc_CensusContext) < 0) __PYX_ERR(26, 31, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc_CensusContext = &__pyx_type_7_cython_6cygrpc_CensusContext;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc_CensusContext) < 0) __PYX_ERR(26, 31, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc_CensusContext->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc_CensusContext->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc_CensusContext->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc_CensusContext->tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  }
+  #endif
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CensusContext, (PyObject *) __pyx_ptype_7_cython_6cygrpc_CensusContext) < 0) __PYX_ERR(26, 31, __pyx_L1_error)
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7_cython_6cygrpc_CensusContext) < 0) __PYX_ERR(26, 31, __pyx_L1_error)
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call)) __PYX_ERR(12, 336, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call) < 0) __PYX_ERR(12, 336, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call) < 0) __PYX_ERR(12, 336, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct____pyx_f_7_cython_6cygrpc__integrated_call->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event)) __PYX_ERR(12, 384, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event) < 0) __PYX_ERR(12, 384, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_1_next_event;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event) < 0) __PYX_ERR(12, 384, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_1_next_event->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call)) __PYX_ERR(12, 399, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call) < 0) __PYX_ERR(12, 399, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call) < 0) __PYX_ERR(12, 399, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_2___pyx_f_7_cython_6cygrpc__segregated_call->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event)) __PYX_ERR(12, 536, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event) < 0) __PYX_ERR(12, 536, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event) < 0) __PYX_ERR(12, 536, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_3_next_call_event->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata)) __PYX_ERR(5, 37, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata) < 0) __PYX_ERR(5, 37, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata) < 0) __PYX_ERR(5, 37, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_4___pyx_f_7_cython_6cygrpc__get_metadata->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata)) __PYX_ERR(18, 68, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata) < 0) __PYX_ERR(18, 68, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata) < 0) __PYX_ERR(18, 68, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_5___pyx_f_7_cython_6cygrpc__metadata->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr)) __PYX_ERR(18, 70, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr) < 0) __PYX_ERR(18, 70, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_6_genexpr;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr) < 0) __PYX_ERR(18, 70, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_6_genexpr->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context)) __PYX_ERR(29, 50, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context) < 0) __PYX_ERR(29, 50, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context) < 0) __PYX_ERR(29, 50, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_7__run_with_context->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context)) __PYX_ERR(29, 56, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context) < 0) __PYX_ERR(29, 56, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context) < 0) __PYX_ERR(29, 56, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_8__run_with_context->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__ = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init___spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__)) __PYX_ERR(1, 103, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init___spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__) < 0) __PYX_ERR(1, 103, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__ = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_9___init__;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__) < 0) __PYX_ERR(1, 103, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_9___init__->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator)) __PYX_ERR(6, 123, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator) < 0) __PYX_ERR(6, 123, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator) < 0) __PYX_ERR(6, 123, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_10_async_generator_to_generator->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator)) __PYX_ERR(6, 141, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator) < 0) __PYX_ERR(6, 141, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator) < 0) __PYX_ERR(6, 141, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_11_generator_to_async_generator->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch)) __PYX_ERR(32, 77, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch) < 0) __PYX_ERR(32, 77, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch) < 0) __PYX_ERR(32, 77, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_12_execute_batch->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message)) __PYX_ERR(32, 115, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message) < 0) __PYX_ERR(32, 115, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_13__receive_message;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message) < 0) __PYX_ERR(32, 115, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_13__receive_message->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message)) __PYX_ERR(32, 139, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message) < 0) __PYX_ERR(32, 139, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_14__send_message;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message) < 0) __PYX_ERR(32, 139, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_14__send_message->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata)) __PYX_ERR(32, 151, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata) < 0) __PYX_ERR(32, 151, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata) < 0) __PYX_ERR(32, 151, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_15__send_initial_metadata->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata)) __PYX_ERR(32, 162, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata) < 0) __PYX_ERR(32, 162, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata) < 0) __PYX_ERR(32, 162, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_16__receive_initial_metadata->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server)) __PYX_ERR(32, 169, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server) < 0) __PYX_ERR(32, 169, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server) < 0) __PYX_ERR(32, 169, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_17__send_error_status_from_server->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status)) __PYX_ERR(34, 235, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status) < 0) __PYX_ERR(34, 235, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_18_status;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status) < 0) __PYX_ERR(34, 235, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_18_status->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata)) __PYX_ERR(34, 258, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata) < 0) __PYX_ERR(34, 258, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata) < 0) __PYX_ERR(34, 258, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_19_initial_metadata->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary)) __PYX_ERR(34, 296, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary) < 0) __PYX_ERR(34, 296, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary) < 0) __PYX_ERR(34, 296, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_20_unary_unary->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received)) __PYX_ERR(34, 347, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received) < 0) __PYX_ERR(34, 347, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received) < 0) __PYX_ERR(34, 347, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_21__handle_status_once_received->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message)) __PYX_ERR(34, 364, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message) < 0) __PYX_ERR(34, 364, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message) < 0) __PYX_ERR(34, 364, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_22_receive_serialized_message->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message)) __PYX_ERR(34, 381, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message) < 0) __PYX_ERR(34, 381, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message) < 0) __PYX_ERR(34, 381, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_23_send_serialized_message->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close)) __PYX_ERR(34, 389, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close) < 0) __PYX_ERR(34, 389, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close) < 0) __PYX_ERR(34, 389, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_24_send_receive_close->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream)) __PYX_ERR(34, 395, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream) < 0) __PYX_ERR(34, 395, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream) < 0) __PYX_ERR(34, 395, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_25_initiate_unary_stream->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary)) __PYX_ERR(34, 437, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary) < 0) __PYX_ERR(34, 437, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary) < 0) __PYX_ERR(34, 437, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_26_stream_unary->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream)) __PYX_ERR(34, 496, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream) < 0) __PYX_ERR(34, 496, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream) < 0) __PYX_ERR(34, 496, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_27_initiate_stream_stream->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state)) __PYX_ERR(8, 71, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state) < 0) __PYX_ERR(8, 71, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state) < 0) __PYX_ERR(8, 71, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_28_watch_connectivity_state->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read)) __PYX_ERR(9, 127, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read) < 0) __PYX_ERR(9, 127, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_29_read;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read) < 0) __PYX_ERR(9, 127, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_29_read->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write)) __PYX_ERR(9, 140, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write) < 0) __PYX_ERR(9, 140, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_30_write;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write) < 0) __PYX_ERR(9, 140, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_30_write->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata)) __PYX_ERR(9, 150, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata) < 0) __PYX_ERR(9, 150, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata) < 0) __PYX_ERR(9, 150, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_31_send_initial_metadata->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort)) __PYX_ERR(9, 164, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort) < 0) __PYX_ERR(9, 164, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_32_abort;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort) < 0) __PYX_ERR(9, 164, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_32_abort->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status)) __PYX_ERR(9, 203, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status) < 0) __PYX_ERR(9, 203, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status) < 0) __PYX_ERR(9, 203, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_33_abort_with_status->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor)) __PYX_ERR(9, 354, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor) < 0) __PYX_ERR(9, 354, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor) < 0) __PYX_ERR(9, 354, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_34__run_interceptor->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler)) __PYX_ERR(9, 370, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler) < 0) __PYX_ERR(9, 370, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler) < 0) __PYX_ERR(9, 370, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_35__find_method_handler->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response)) __PYX_ERR(9, 389, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response) < 0) __PYX_ERR(9, 389, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response) < 0) __PYX_ERR(9, 389, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_36__finish_handler_with_unary_response->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses)) __PYX_ERR(9, 460, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses) < 0) __PYX_ERR(9, 460, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses) < 0) __PYX_ERR(9, 460, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_37__finish_handler_with_stream_responses->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc)) __PYX_ERR(9, 530, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc) < 0) __PYX_ERR(9, 530, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc) < 0) __PYX_ERR(9, 530, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_38__handle_unary_unary_rpc->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc)) __PYX_ERR(9, 564, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc) < 0) __PYX_ERR(9, 564, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc) < 0) __PYX_ERR(9, 564, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_39__handle_unary_stream_rpc->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver)) __PYX_ERR(9, 603, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver) < 0) __PYX_ERR(9, 603, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver) < 0) __PYX_ERR(9, 603, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_40__async_message_receiver->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__ = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext___spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__)) __PYX_ERR(9, 619, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext___spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__) < 0) __PYX_ERR(9, 619, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__ = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_41___anext__;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__) < 0) __PYX_ERR(9, 619, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_41___anext__->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc)) __PYX_ERR(9, 623, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc) < 0) __PYX_ERR(9, 623, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc) < 0) __PYX_ERR(9, 623, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_42__handle_stream_unary_rpc->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc)) __PYX_ERR(9, 655, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc) < 0) __PYX_ERR(9, 655, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc) < 0) __PYX_ERR(9, 655, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_43__handle_stream_stream_rpc->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions)) __PYX_ERR(9, 686, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions) < 0) __PYX_ERR(9, 686, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions) < 0) __PYX_ERR(9, 686, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_44__handle_exceptions->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler)) __PYX_ERR(9, 742, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler) < 0) __PYX_ERR(9, 742, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler) < 0) __PYX_ERR(9, 742, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_45___pyx_f_7_cython_6cygrpc__add_callback_handler->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core)) __PYX_ERR(9, 755, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core) < 0) __PYX_ERR(9, 755, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core) < 0) __PYX_ERR(9, 755, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_46__handle_cancellation_from_core->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro)) __PYX_ERR(9, 772, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro) < 0) __PYX_ERR(9, 772, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro) < 0) __PYX_ERR(9, 772, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_47__schedule_rpc_coro->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc)) __PYX_ERR(9, 785, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc) < 0) __PYX_ERR(9, 785, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc) < 0) __PYX_ERR(9, 785, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_48__handle_rpc->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call)) __PYX_ERR(9, 932, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call) < 0) __PYX_ERR(9, 932, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_49__request_call;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call) < 0) __PYX_ERR(9, 932, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_49__request_call->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop)) __PYX_ERR(9, 952, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop) < 0) __PYX_ERR(9, 952, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop) < 0) __PYX_ERR(9, 952, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_50__server_main_loop->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start)) __PYX_ERR(9, 1005, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start) < 0) __PYX_ERR(9, 1005, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_51_start;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start) < 0) __PYX_ERR(9, 1005, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_51_start->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down)) __PYX_ERR(9, 1019, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down) < 0) __PYX_ERR(9, 1019, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down) < 0) __PYX_ERR(9, 1019, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_52__start_shutting_down->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown)) __PYX_ERR(9, 1036, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown) < 0) __PYX_ERR(9, 1036, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_53_shutdown;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown) < 0) __PYX_ERR(9, 1036, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_53_shutdown->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination_spec, NULL); if (unlikely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination)) __PYX_ERR(9, 1076, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination_spec, __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination) < 0) __PYX_ERR(9, 1076, __pyx_L1_error)
+  #else
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination = &__pyx_type_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination) < 0) __PYX_ERR(9, 1076, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination->tp_dictoffset && __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype_7_cython_6cygrpc___pyx_scope_struct_54_wait_for_termination->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_spec, NULL); if (unlikely(!__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg)) __PYX_ERR(10, 66, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg_spec, __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg) < 0) __PYX_ERR(10, 66, __pyx_L1_error)
+  #else
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg = &__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg) < 0) __PYX_ERR(10, 66, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg->tp_dictoffset && __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen_LatentEventArg__rParen_to_py_16latent_event_arg->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__spec, NULL); if (unlikely(!__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_)) __PYX_ERR(10, 66, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py__spec, __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_) < 0) __PYX_ERR(10, 66, __pyx_L1_error)
+  #else
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_ = &__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_) < 0) __PYX_ERR(10, 66, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_->tp_dictoffset && __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParen__rParen_to_py_->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_spec, NULL); if (unlikely(!__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args)) __PYX_ERR(10, 66, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args_spec, __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args) < 0) __PYX_ERR(10, 66, __pyx_L1_error)
+  #else
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args = &__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args) < 0) __PYX_ERR(10, 66, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args->tp_dictoffset && __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_object__lParenobject__comma_tuple__rParen_to_py_2cb_4args->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  #if CYTHON_USE_TYPE_SPECS
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__spec, NULL); if (unlikely(!__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_)) __PYX_ERR(10, 66, __pyx_L1_error)
+  if (__Pyx_fix_up_extension_type_from_spec(&__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py__spec, __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_) < 0) __PYX_ERR(10, 66, __pyx_L1_error)
+  #else
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_ = &__pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  #endif
+  #if !CYTHON_USE_TYPE_SPECS
+  if (__Pyx_PyType_Ready(__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_) < 0) __PYX_ERR(10, 66, __pyx_L1_error)
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_->tp_print = 0;
+  #endif
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_->tp_dictoffset && __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_->tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_ptype___pyx_scope_struct____Pyx_CFunc_7_cython_6cygrpc_void__lParen__rParennoexcept__space_nogil_to_py_->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+  }
+  #endif
+  __Pyx_RefNannyFinishContext();
+  return 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+}
+
+static int __Pyx_modinit_type_import_code(void) {
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0);
+  /*--- Type import code ---*/
+  __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(37, 9, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_11(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", 
+  #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000
+  sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(PyTypeObject),
+  #elif CYTHON_COMPILING_IN_LIMITED_API
+  sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(PyTypeObject),
+  #else
+  sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(PyHeapTypeObject),
+  #endif
+  __Pyx_ImportType_CheckSize_Warn_3_0_11); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(37, 9, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(38, 8, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_11(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_11); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(38, 8, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(39, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_11(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_11(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_11); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(39, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_RefNannyFinishContext();
+  return 0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_RefNannyFinishContext();
+  return -1;
+}
+
+static int __Pyx_modinit_variable_import_code(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0);
+  /*--- Variable import code ---*/
+  __Pyx_RefNannyFinishContext();
+  return 0;
+}
+
+static int __Pyx_modinit_function_import_code(void) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0);
+  /*--- Function import code ---*/
+  __Pyx_RefNannyFinishContext();
+  return 0;
+}
+
+
+#if PY_MAJOR_VERSION >= 3
+#if CYTHON_PEP489_MULTI_PHASE_INIT
+static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/
+static int __pyx_pymod_exec_cygrpc(PyObject* module); /*proto*/
+static PyModuleDef_Slot __pyx_moduledef_slots[] = {
+  {Py_mod_create, (void*)__pyx_pymod_create},
+  {Py_mod_exec, (void*)__pyx_pymod_exec_cygrpc},
+  {0, NULL}
+};
+#endif
+
+#ifdef __cplusplus
+namespace {
+  struct PyModuleDef __pyx_moduledef =
+  #else
+  static struct PyModuleDef __pyx_moduledef =
+  #endif
+  {
+      PyModuleDef_HEAD_INIT,
+      "cygrpc",
+      0, /* m_doc */
+    #if CYTHON_PEP489_MULTI_PHASE_INIT
+      0, /* m_size */
+    #elif CYTHON_USE_MODULE_STATE
+      sizeof(__pyx_mstate), /* m_size */
+    #else
+      -1, /* m_size */
+    #endif
+      __pyx_methods /* m_methods */,
+    #if CYTHON_PEP489_MULTI_PHASE_INIT
+      __pyx_moduledef_slots, /* m_slots */
+    #else
+      NULL, /* m_reload */
+    #endif
+    #if CYTHON_USE_MODULE_STATE
+      __pyx_m_traverse, /* m_traverse */
+      __pyx_m_clear, /* m_clear */
+      NULL /* m_free */
+    #else
+      NULL, /* m_traverse */
+      NULL, /* m_clear */
+      NULL /* m_free */
+    #endif
+  };
+  #ifdef __cplusplus
+} /* anonymous namespace */
+#endif
+#endif
+
+#ifndef CYTHON_NO_PYINIT_EXPORT
+#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC
+#elif PY_MAJOR_VERSION < 3
+#ifdef __cplusplus
+#define __Pyx_PyMODINIT_FUNC extern "C" void
+#else
+#define __Pyx_PyMODINIT_FUNC void
+#endif
+#else
+#ifdef __cplusplus
+#define __Pyx_PyMODINIT_FUNC extern "C" PyObject *
+#else
+#define __Pyx_PyMODINIT_FUNC PyObject *
+#endif
+#endif
+
+
+#if PY_MAJOR_VERSION < 3
+__Pyx_PyMODINIT_FUNC initcygrpc(void) CYTHON_SMALL_CODE; /*proto*/
+__Pyx_PyMODINIT_FUNC initcygrpc(void)
+#else
+__Pyx_PyMODINIT_FUNC PyInit_cygrpc(void) CYTHON_SMALL_CODE; /*proto*/
+__Pyx_PyMODINIT_FUNC PyInit_cygrpc(void)
+#if CYTHON_PEP489_MULTI_PHASE_INIT
+{
+  return PyModuleDef_Init(&__pyx_moduledef);
+}
+static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
+    #if PY_VERSION_HEX >= 0x030700A1
+    static PY_INT64_T main_interpreter_id = -1;
+    PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp);
+    if (main_interpreter_id == -1) {
+        main_interpreter_id = current_id;
+        return (unlikely(current_id == -1)) ? -1 : 0;
+    } else if (unlikely(main_interpreter_id != current_id))
+    #else
+    static PyInterpreterState *main_interpreter = NULL;
+    PyInterpreterState *current_interpreter = PyThreadState_Get()->interp;
+    if (!main_interpreter) {
+        main_interpreter = current_interpreter;
+    } else if (unlikely(main_interpreter != current_interpreter))
+    #endif
+    {
+        PyErr_SetString(
+            PyExc_ImportError,
+            "Interpreter change detected - this module can only be loaded into one interpreter per process.");
+        return -1;
+    }
+    return 0;
+}
+#if CYTHON_COMPILING_IN_LIMITED_API
+static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none)
+#else
+static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none)
+#endif
+{
+    PyObject *value = PyObject_GetAttrString(spec, from_name);
+    int result = 0;
+    if (likely(value)) {
+        if (allow_none || value != Py_None) {
+#if CYTHON_COMPILING_IN_LIMITED_API
+            result = PyModule_AddObject(module, to_name, value);
+#else
+            result = PyDict_SetItemString(moddict, to_name, value);
+#endif
+        }
+        Py_DECREF(value);
+    } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+        PyErr_Clear();
+    } else {
+        result = -1;
+    }
+    return result;
+}
+static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) {
+    PyObject *module = NULL, *moddict, *modname;
+    CYTHON_UNUSED_VAR(def);
+    if (__Pyx_check_single_interpreter())
+        return NULL;
+    if (__pyx_m)
+        return __Pyx_NewRef(__pyx_m);
+    modname = PyObject_GetAttrString(spec, "name");
+    if (unlikely(!modname)) goto bad;
+    module = PyModule_NewObject(modname);
+    Py_DECREF(modname);
+    if (unlikely(!module)) goto bad;
+#if CYTHON_COMPILING_IN_LIMITED_API
+    moddict = module;
+#else
+    moddict = PyModule_GetDict(module);
+    if (unlikely(!moddict)) goto bad;
+#endif
+    if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad;
+    if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad;
+    if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad;
+    if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad;
+    return module;
+bad:
+    Py_XDECREF(module);
+    return NULL;
+}
+
+
+static CYTHON_SMALL_CODE int __pyx_pymod_exec_cygrpc(PyObject *__pyx_pyinit_module)
+#endif
+#endif
+{
+  int stringtab_initialized = 0;
+  #if CYTHON_USE_MODULE_STATE
+  int pystate_addmodule_run = 0;
+  #endif
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  int __pyx_t_10;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannyDeclarations
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+  if (__pyx_m) {
+    if (__pyx_m == __pyx_pyinit_module) return 0;
+    PyErr_SetString(PyExc_RuntimeError, "Module 'cygrpc' has already been imported. Re-initialisation is not supported.");
+    return -1;
+  }
+  #elif PY_MAJOR_VERSION >= 3
+  if (__pyx_m) return __Pyx_NewRef(__pyx_m);
+  #endif
+  /*--- Module creation code ---*/
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+  __pyx_m = __pyx_pyinit_module;
+  Py_INCREF(__pyx_m);
+  #else
+  #if PY_MAJOR_VERSION < 3
+  __pyx_m = Py_InitModule4("cygrpc", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+  if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error)
+  #elif CYTHON_USE_MODULE_STATE
+  __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)
+  {
+    int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef);
+    __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "cygrpc" pseudovariable */
+    if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error)
+    pystate_addmodule_run = 1;
+  }
+  #else
+  __pyx_m = PyModule_Create(&__pyx_moduledef);
+  if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #endif
+  CYTHON_UNUSED_VAR(__pyx_t_1);
+  __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error)
+  Py_INCREF(__pyx_d);
+  __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #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("__Pyx_PyMODINIT_FUNC PyInit_cygrpc(void)", 0);
+  if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #ifdef __Pxy_PyFrame_Initialize_Offsets
+  __Pxy_PyFrame_Initialize_Offsets();
+  #endif
+  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error)
+  #ifdef __Pyx_CyFunction_USED
+  if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_FusedFunction_USED
+  if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_Coroutine_USED
+  if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_Generator_USED
+  if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_AsyncGen_USED
+  if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  #ifdef __Pyx_StopAsyncIteration_USED
+  if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+  /*--- Library function declarations ---*/
+  /*--- Threads initialization code ---*/
+  #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
+  PyEval_InitThreads();
+  #endif
+  /*--- Initialize various global constants etc. ---*/
+  if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  stringtab_initialized = 1;
+  if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __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_ERR(0, 1, __pyx_L1_error)
+  #endif
+  if (__pyx_module_is_main__cython__cygrpc) {
+    if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name_2, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  }
+  #if PY_MAJOR_VERSION >= 3
+  {
+    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
+    if (!PyDict_GetItemString(modules, "_cython.cygrpc")) {
+      if (unlikely((PyDict_SetItemString(modules, "_cython.cygrpc", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error)
+    }
+  }
+  #endif
+  /*--- Builtin init code ---*/
+  if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  /*--- Constants init code ---*/
+  if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  /*--- Global type/function init code ---*/
+  (void)__Pyx_modinit_global_init_code();
+  if (unlikely((__Pyx_modinit_variable_export_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (unlikely((__Pyx_modinit_function_export_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error)
+  if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error)
+  (void)__Pyx_modinit_variable_import_code();
+  (void)__Pyx_modinit_function_import_code();
+  /*--- Execution code ---*/
+  #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+  if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  #endif
+
+  /* "_cython/cygrpc.pyx":18
+ * cimport cpython
+ * 
+ * import logging             # <<<<<<<<<<<<<<
+ * import os
+ * import sys
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_logging, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_logging, __pyx_t_2) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "_cython/cygrpc.pyx":19
+ * 
+ * import logging
+ * import os             # <<<<<<<<<<<<<<
+ * import sys
+ * import threading
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_os, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_os, __pyx_t_2) < 0) __PYX_ERR(0, 19, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "_cython/cygrpc.pyx":20
+ * import logging
+ * import os
+ * import sys             # <<<<<<<<<<<<<<
+ * import threading
+ * import time
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_sys, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "_cython/cygrpc.pyx":21
+ * import os
+ * import sys
+ * import threading             # <<<<<<<<<<<<<<
+ * import time
+ * 
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_threading, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_threading, __pyx_t_2) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "_cython/cygrpc.pyx":22
+ * import sys
+ * import threading
+ * import time             # <<<<<<<<<<<<<<
+ * 
+ * import grpc
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_time, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_time, __pyx_t_2) < 0) __PYX_ERR(0, 22, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "_cython/cygrpc.pyx":24
+ * import time
+ * 
+ * import grpc             # <<<<<<<<<<<<<<
+ * 
+ * try:
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_grpc, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_grpc, __pyx_t_2) < 0) __PYX_ERR(0, 24, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "_cython/cygrpc.pyx":26
+ * import grpc
+ * 
+ * try:             # <<<<<<<<<<<<<<
+ *     import asyncio
+ * except ImportError:
+ */
+  {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_3, &__pyx_t_4);
+    __Pyx_XGOTREF(__pyx_t_1);
+    __Pyx_XGOTREF(__pyx_t_3);
+    __Pyx_XGOTREF(__pyx_t_4);
+    /*try:*/ {
+
+      /* "_cython/cygrpc.pyx":27
+ * 
+ * try:
+ *     import asyncio             # <<<<<<<<<<<<<<
+ * except ImportError:
+ *     # TODO(https://github.com/grpc/grpc/issues/19728) Improve how Aio Cython is
+ */
+      __pyx_t_2 = __Pyx_patch_asyncio(__Pyx_ImportDottedModule(__pyx_n_s_asyncio, NULL)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 27, __pyx_L2_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      if (PyDict_SetItem(__pyx_d, __pyx_n_s_asyncio, __pyx_t_2) < 0) __PYX_ERR(0, 27, __pyx_L2_error)
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+      /* "_cython/cygrpc.pyx":26
+ * import grpc
+ * 
+ * try:             # <<<<<<<<<<<<<<
+ *     import asyncio
+ * except ImportError:
+ */
+    }
+    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+    goto __pyx_L7_try_end;
+    __pyx_L2_error:;
+    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "_cython/cygrpc.pyx":28
+ * try:
+ *     import asyncio
+ * except ImportError:             # <<<<<<<<<<<<<<
+ *     # TODO(https://github.com/grpc/grpc/issues/19728) Improve how Aio Cython is
+ *     # distributed without breaking none compatible Python versions. For now, if
+ */
+    __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_ImportError);
+    if (__pyx_t_5) {
+      __Pyx_ErrRestore(0,0,0);
+      goto __pyx_L3_exception_handled;
+    }
+    goto __pyx_L4_except_error;
+
+    /* "_cython/cygrpc.pyx":26
+ * import grpc
+ * 
+ * try:             # <<<<<<<<<<<<<<
+ *     import asyncio
+ * except ImportError:
+ */
+    __pyx_L4_except_error:;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __Pyx_XGIVEREF(__pyx_t_3);
+    __Pyx_XGIVEREF(__pyx_t_4);
+    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_3, __pyx_t_4);
+    goto __pyx_L1_error;
+    __pyx_L3_exception_handled:;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __Pyx_XGIVEREF(__pyx_t_3);
+    __Pyx_XGIVEREF(__pyx_t_4);
+    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_3, __pyx_t_4);
+    __pyx_L7_try_end:;
+  }
+
+  /* "_cython/cygrpc.pyx":35
+ * 
+ * # The only copy of Python logger for the Cython extension
+ * _LOGGER = logging.getLogger(__name__)             # <<<<<<<<<<<<<<
+ * 
+ * # TODO(atash): figure out why the coverage tool gets confused about the Cython
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_logging); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_getLogger); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 35, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_LOGGER, __pyx_t_7) < 0) __PYX_ERR(0, 35, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15_GrpcArgWrapper_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_GrpcArgWrapper___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__109)); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_7) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.arg cannot be converted to a Python object for pickling"
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15_GrpcArgWrapper_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_GrpcArgWrapper___setstate_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__111)); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_7) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_11_ChannelArg_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ChannelArg___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__112)); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_7) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_argument cannot be converted to a Python object for pickling"
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_11_ChannelArg_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ChannelArg___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__113)); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_7) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_12_ChannelArgs_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ChannelArgs___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__114)); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_7) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_12_ChannelArgs_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ChannelArgs___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__115)); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_7) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":24
+ *     self.references = []
+ * 
+ *   def _start_batch(self, operations, tag, retain_self):             # <<<<<<<<<<<<<<
+ *     if not self.is_valid:
+ *       raise ValueError("invalid call object cannot be used from Python")
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_3_start_batch, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call__start_batch, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__117)); if (unlikely(!__pyx_t_7)) __PYX_ERR(4, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call, __pyx_n_s_start_batch, __pyx_t_7) < 0) __PYX_ERR(4, 24, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":38
+ *     return error
+ * 
+ *   def start_client_batch(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     # We don't reference this call in the operations tag because
+ *     # it should be cancelled when it goes out of scope
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_5start_client_batch, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call_start_client_batch, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__119)); if (unlikely(!__pyx_t_7)) __PYX_ERR(4, 38, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call, __pyx_n_s_start_client_batch, __pyx_t_7) < 0) __PYX_ERR(4, 38, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":43
+ *     return self._start_batch(operations, tag, False)
+ * 
+ *   def start_server_batch(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return self._start_batch(operations, tag, True)
+ * 
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_7start_server_batch, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call_start_server_batch, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__120)); if (unlikely(!__pyx_t_7)) __PYX_ERR(4, 43, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call, __pyx_n_s_start_server_batch, __pyx_t_7) < 0) __PYX_ERR(4, 43, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":47
+ * 
+ *   def cancel(
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,             # <<<<<<<<<<<<<<
+ *       details=None):
+ *     details = str_to_bytes(details)
+ */
+  __pyx_k__9 = GRPC_STATUS__DO_NOT_USE;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":46
+ *     return self._start_batch(operations, tag, True)
+ * 
+ *   def cancel(             # <<<<<<<<<<<<<<
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS__DO_NOT_USE); if (unlikely(!__pyx_t_7)) __PYX_ERR(4, 47, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":48
+ *   def cancel(
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):             # <<<<<<<<<<<<<<
+ *     details = str_to_bytes(details)
+ *     if not self.is_valid:
+ */
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 46, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_7);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7)) __PYX_ERR(4, 46, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None)) __PYX_ERR(4, 46, __pyx_L1_error);
+  __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":46
+ *     return self._start_batch(operations, tag, True)
+ * 
+ *   def cancel(             # <<<<<<<<<<<<<<
+ *       self, grpc_status_code error_code=GRPC_STATUS__DO_NOT_USE,
+ *       details=None):
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_9cancel, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call_cancel, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__122)); if (unlikely(!__pyx_t_7)) __PYX_ERR(4, 46, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_7, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call, __pyx_n_s_cancel, __pyx_t_7) < 0) __PYX_ERR(4, 46, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":69
+ *       return result
+ * 
+ *   def set_credentials(self, CallCredentials call_credentials not None):             # <<<<<<<<<<<<<<
+ *     cdef grpc_call_credentials *c_call_credentials = call_credentials.c()
+ *     cdef grpc_call_error call_error = grpc_call_set_credentials(
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_11set_credentials, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call_set_credentials, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__124)); if (unlikely(!__pyx_t_7)) __PYX_ERR(4, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call, __pyx_n_s_set_credentials, __pyx_t_7) < 0) __PYX_ERR(4, 69, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":76
+ *     return call_error
+ * 
+ *   def peer(self):             # <<<<<<<<<<<<<<
+ *     cdef char *peer = NULL
+ *     with nogil:
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_13peer, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call_peer, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__126)); if (unlikely(!__pyx_t_7)) __PYX_ERR(4, 76, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call, __pyx_n_s_peer, __pyx_t_7) < 0) __PYX_ERR(4, 76, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Call);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/call.pyx.pxi":96
+ *     return self.c_call != NULL
+ * 
+ *   def _custom_op_on_c_call(self, int op):             # <<<<<<<<<<<<<<
+ *     return _custom_op_on_c_call(op, self.c_call)
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_17_custom_op_on_c_call, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call__custom_op_on_c_call, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__128)); if (unlikely(!__pyx_t_7)) __PYX_ERR(4, 96, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Call, __pyx_n_s_custom_op_on_c_call, __pyx_t_7) < 0) __PYX_ERR(4, 96, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Call);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_19__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__129)); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_7) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4Call_21__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Call___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__130)); if (unlikely(!__pyx_t_7)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_7) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * from grpc import _observability             # <<<<<<<<<<<<<<
+ * 
+ * _INTERNAL_CALL_ERROR_MESSAGE_FORMAT = (
+ */
+  __pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(12, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_INCREF(__pyx_n_s_observability);
+  __Pyx_GIVEREF(__pyx_n_s_observability);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_observability)) __PYX_ERR(12, 15, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_grpc, __pyx_t_7, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_observability); if (unlikely(!__pyx_t_7)) __PYX_ERR(12, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_observability, __pyx_t_7) < 0) __PYX_ERR(12, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":18
+ * 
+ * _INTERNAL_CALL_ERROR_MESSAGE_FORMAT = (
+ *     'Internal gRPC call error %d. ' +             # <<<<<<<<<<<<<<
+ *     'Please report to https://github.com/grpc/grpc/issues')
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyStr_Concat(__pyx_kp_s_Internal_gRPC_call_error_d, __pyx_kp_s_Please_report_to_https_github_co); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_INTERNAL_CALL_ERROR_MESSAGE_FOR, __pyx_t_2) < 0) __PYX_ERR(12, 17, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10_CallState_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallState___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__131)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10_CallState_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallState___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__132)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_13_ChannelState_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ChannelState___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__133)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_13_ChannelState_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ChannelState___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__134)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10CallHandle_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallHandle___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__135)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10CallHandle_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallHandle___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__136)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":328
+ *     self._call_state = call_state
+ * 
+ *   def operate(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return _operate_from_integrated_call(
+ *         self._channel_state, self._call_state, operations, tag)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14IntegratedCall_3operate, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_IntegratedCall_operate, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__137)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_IntegratedCall, __pyx_n_s_operate, __pyx_t_2) < 0) __PYX_ERR(12, 328, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_IntegratedCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":332
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ *   def cancel(self, code, details):             # <<<<<<<<<<<<<<
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14IntegratedCall_5cancel, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_IntegratedCall_cancel, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__139)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 332, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_IntegratedCall, __pyx_n_s_cancel, __pyx_t_2) < 0) __PYX_ERR(12, 332, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_IntegratedCall);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14IntegratedCall_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_IntegratedCall___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__140)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14IntegratedCall_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_IntegratedCall___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__141)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":377
+ *     self._call_state = call_state
+ * 
+ *   def operate(self, operations, tag):             # <<<<<<<<<<<<<<
+ *     return _operate_from_segregated_call(
+ *         self._channel_state, self._call_state, operations, tag)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14SegregatedCall_3operate, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SegregatedCall_operate, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__142)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 377, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_SegregatedCall, __pyx_n_s_operate, __pyx_t_2) < 0) __PYX_ERR(12, 377, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_SegregatedCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":381
+ *         self._channel_state, self._call_state, operations, tag)
+ * 
+ *   def cancel(self, code, details):             # <<<<<<<<<<<<<<
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14SegregatedCall_5cancel, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SegregatedCall_cancel, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__143)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 381, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_SegregatedCall, __pyx_n_s_cancel, __pyx_t_2) < 0) __PYX_ERR(12, 381, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_SegregatedCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":384
+ *     _cancel(self._channel_state, self._call_state, code, details)
+ * 
+ *   def next_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       _process_segregated_call_tag(
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14SegregatedCall_7next_event, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SegregatedCall_next_event, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__145)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 384, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_SegregatedCall, __pyx_n_s_next_event, __pyx_t_2) < 0) __PYX_ERR(12, 384, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_SegregatedCall);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14SegregatedCall_9__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SegregatedCall___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__146)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_14SegregatedCall_11__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SegregatedCall___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__147)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":520
+ *     grpc_channel_credentials_release(c_channel_credentials)
+ * 
+ *   def target(self):             # <<<<<<<<<<<<<<
+ *     cdef char *c_target
+ *     with self._state.condition:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_3target, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_target, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__149)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 520, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_target, __pyx_t_2) < 0) __PYX_ERR(12, 520, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":528
+ *       return target
+ * 
+ *   def integrated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_5integrated_call, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_integrated_call, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__151)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 528, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_tuple__152);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_integrated_call, __pyx_t_2) < 0) __PYX_ERR(12, 528, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":536
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def next_call_event(self):             # <<<<<<<<<<<<<<
+ *     def on_success(tag):
+ *       if tag is not None:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_7next_call_event, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_next_call_event, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__154)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 536, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_next_call_event, __pyx_t_2) < 0) __PYX_ERR(12, 536, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":550
+ *                             on_success, None, queue_deadline)
+ * 
+ *   def segregated_call(             # <<<<<<<<<<<<<<
+ *       self, int flags, method, host, object deadline, object metadata,
+ *       CallCredentials credentials, operationses_and_tags,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_9segregated_call, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_segregated_call, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__155)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 550, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_tuple__152);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_segregated_call, __pyx_t_2) < 0) __PYX_ERR(12, 550, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":558
+ *         operationses_and_tags, context, registered_call_handle)
+ * 
+ *   def check_connectivity_state(self, bint try_to_connect):             # <<<<<<<<<<<<<<
+ *     with self._state.condition:
+ *       if self._state.open:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_11check_connectivity_state, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_check_connectivity_state, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__157)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 558, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_check_connectivity_state, __pyx_t_2) < 0) __PYX_ERR(12, 558, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":566
+ *         raise ValueError('Cannot invoke RPC: %s' % self._state.closed_reason)
+ * 
+ *   def watch_connectivity_state(             # <<<<<<<<<<<<<<
+ *       self, grpc_connectivity_state last_observed_state, object deadline):
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_13watch_connectivity_state, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_watch_connectivity_state, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__159)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 566, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_watch_connectivity_state, __pyx_t_2) < 0) __PYX_ERR(12, 566, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":570
+ *     return _watch_connectivity_state(self._state, last_observed_state, deadline)
+ * 
+ *   def close(self, code, details):             # <<<<<<<<<<<<<<
+ *     _close(self, code, details, False)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_15close, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_close, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__160)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 570, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_close, __pyx_t_2) < 0) __PYX_ERR(12, 570, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":573
+ *     _close(self, code, details, False)
+ * 
+ *   def close_on_fork(self, code, details):             # <<<<<<<<<<<<<<
+ *     _close(self, code, details, True)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_17close_on_fork, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_close_on_fork, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__161)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 573, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_close_on_fork_2, __pyx_t_2) < 0) __PYX_ERR(12, 573, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi":576
+ *     _close(self, code, details, True)
+ * 
+ *   def get_registered_call_handle(self, method):             # <<<<<<<<<<<<<<
+ *     """
+ *     Get or registers a call handler for a method.
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_19get_registered_call_handle, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel_get_registered_call_hand, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__163)); if (unlikely(!__pyx_t_2)) __PYX_ERR(12, 576, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Channel, __pyx_n_s_get_registered_call_handle, __pyx_t_2) < 0) __PYX_ERR(12, 576, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Channel);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_21__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__164)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7Channel_23__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Channel___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__165)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":16
+ * 
+ * 
+ * def channelz_get_top_channels(start_channel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_top_channels(
+ *         start_channel_id,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_1channelz_get_top_channels, 0, __pyx_n_s_channelz_get_top_channels, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__167)); if (unlikely(!__pyx_t_2)) __PYX_ERR(13, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channelz_get_top_channels, __pyx_t_2) < 0) __PYX_ERR(13, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":25
+ *     return c_returned_str
+ * 
+ * def channelz_get_servers(start_server_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_servers(start_server_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_3channelz_get_servers, 0, __pyx_n_s_channelz_get_servers, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__169)); if (unlikely(!__pyx_t_2)) __PYX_ERR(13, 25, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channelz_get_servers, __pyx_t_2) < 0) __PYX_ERR(13, 25, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":32
+ *     return c_returned_str
+ * 
+ * def channelz_get_server(server_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_server(server_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_5channelz_get_server, 0, __pyx_n_s_channelz_get_server, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__171)); if (unlikely(!__pyx_t_2)) __PYX_ERR(13, 32, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channelz_get_server, __pyx_t_2) < 0) __PYX_ERR(13, 32, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":39
+ *     return c_returned_str
+ * 
+ * def channelz_get_server_sockets(server_id, start_socket_id, max_results):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_server_sockets(
+ *         server_id,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_7channelz_get_server_sockets, 0, __pyx_n_s_channelz_get_server_sockets, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__173)); if (unlikely(!__pyx_t_2)) __PYX_ERR(13, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channelz_get_server_sockets, __pyx_t_2) < 0) __PYX_ERR(13, 39, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":52
+ *     return c_returned_str
+ * 
+ * def channelz_get_channel(channel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_channel(channel_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9channelz_get_channel, 0, __pyx_n_s_channelz_get_channel, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__175)); if (unlikely(!__pyx_t_2)) __PYX_ERR(13, 52, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channelz_get_channel, __pyx_t_2) < 0) __PYX_ERR(13, 52, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":59
+ *     return c_returned_str
+ * 
+ * def channelz_get_subchannel(subchannel_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_subchannel(subchannel_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_11channelz_get_subchannel, 0, __pyx_n_s_channelz_get_subchannel, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__177)); if (unlikely(!__pyx_t_2)) __PYX_ERR(13, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channelz_get_subchannel, __pyx_t_2) < 0) __PYX_ERR(13, 59, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/channelz.pyx.pxi":66
+ *     return c_returned_str
+ * 
+ * def channelz_get_socket(socket_id):             # <<<<<<<<<<<<<<
+ *     cdef char *c_returned_str = grpc_channelz_get_socket(socket_id)
+ *     if c_returned_str == NULL:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_13channelz_get_socket, 0, __pyx_n_s_channelz_get_socket, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__179)); if (unlikely(!__pyx_t_2)) __PYX_ERR(13, 66, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channelz_get_socket, __pyx_t_2) < 0) __PYX_ERR(13, 66, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/csds.pyx.pxi":16
+ * 
+ * 
+ * def dump_xds_configs():             # <<<<<<<<<<<<<<
+ *     cdef grpc_slice client_config_in_slice
+ *     with nogil:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15dump_xds_configs, 0, __pyx_n_s_dump_xds_configs, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__181)); if (unlikely(!__pyx_t_2)) __PYX_ERR(14, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dump_xds_configs, __pyx_t_2) < 0) __PYX_ERR(14, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":16
+ * 
+ * 
+ * def _spawn_callback_in_thread(cb_func, args):             # <<<<<<<<<<<<<<
+ *   t = ForkManagedThread(target=cb_func, args=args)
+ *   t.setDaemon(True)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17_spawn_callback_in_thread, 0, __pyx_n_s_spawn_callback_in_thread, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__183)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_spawn_callback_in_thread, __pyx_t_2) < 0) __PYX_ERR(5, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":21
+ *   t.start()
+ * 
+ * async_callback_func = _spawn_callback_in_thread             # <<<<<<<<<<<<<<
+ * 
+ * def set_async_callback_func(callback_func):
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_spawn_callback_in_thread); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_async_callback_func, __pyx_t_2) < 0) __PYX_ERR(5, 21, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":23
+ * async_callback_func = _spawn_callback_in_thread
+ * 
+ * def set_async_callback_func(callback_func):             # <<<<<<<<<<<<<<
+ *   global async_callback_func
+ *   async_callback_func = callback_func
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19set_async_callback_func, 0, __pyx_n_s_set_async_callback_func, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__185)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 23, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_async_callback_func, __pyx_t_2) < 0) __PYX_ERR(5, 23, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":27
+ *   async_callback_func = callback_func
+ * 
+ * def _spawn_callback_async(callback, args):             # <<<<<<<<<<<<<<
+ *   async_callback_func(callback, args)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21_spawn_callback_async, 0, __pyx_n_s_spawn_callback_async, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__187)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 27, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_spawn_callback_async, __pyx_t_2) < 0) __PYX_ERR(5, 27, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CallCredentials_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallCredentials___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__188)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_credentials cannot be converted to a Python object for pickling"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CallCredentials_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallCredentials___setstate_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__189)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29MetadataPluginCallCredentials_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_MetadataPluginCallCredentials_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__190)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29MetadataPluginCallCredentials_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_MetadataPluginCallCredentials_3, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__191)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_24CompositeCallCredentials_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompositeCallCredentials___reduc, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__192)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_24CompositeCallCredentials_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompositeCallCredentials___setst, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__193)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18ChannelCredentials_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ChannelCredentials___reduce_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__195)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials);
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_ChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_ChannelCredentials__set_state(self, __pyx_state)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18ChannelCredentials_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ChannelCredentials___setstate_cy, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__196)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ChannelCredentials, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ChannelCredentials);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18SSLSessionCacheLRU_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SSLSessionCacheLRU___reduce_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__197)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18SSLSessionCacheLRU_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SSLSessionCacheLRU___setstate_cy, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__198)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21SSLChannelCredentials_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SSLChannelCredentials___reduce_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__199)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21SSLChannelCredentials_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SSLChannelCredentials___setstate, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__200)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_27CompositeChannelCredentials_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompositeChannelCredentials___re, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__201)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_27CompositeChannelCredentials_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompositeChannelCredentials___se, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__202)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21XDSChannelCredentials_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_XDSChannelCredentials___reduce_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__203)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21XDSChannelCredentials_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_XDSChannelCredentials___setstate, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__204)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23ServerCertificateConfig_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServerCertificateConfig___reduce, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__205)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23ServerCertificateConfig_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServerCertificateConfig___setsta, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__206)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ServerCredentials_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServerCredentials___reduce_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__207)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ServerCredentials_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServerCredentials___setstate_cyt, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__208)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":257
+ *   return c_ssl_pem_key_cert_pairs
+ * 
+ * def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs,             # <<<<<<<<<<<<<<
+ *                            bint force_client_auth):
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23server_credentials_ssl, 0, __pyx_n_s_server_credentials_ssl, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__210)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 257, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_server_credentials_ssl, __pyx_t_2) < 0) __PYX_ERR(5, 257, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":282
+ *   return credentials
+ * 
+ * def server_certificate_config_ssl(pem_root_certs, pem_key_cert_pairs):             # <<<<<<<<<<<<<<
+ *   pem_root_certs = str_to_bytes(pem_root_certs)
+ *   pem_key_cert_pairs = list(pem_key_cert_pairs)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_25server_certificate_config_ssl, 0, __pyx_n_s_server_certificate_config_ssl, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__212)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 282, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_server_certificate_config_ssl, __pyx_t_2) < 0) __PYX_ERR(5, 282, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":296
+ *   return cert_config
+ * 
+ * def server_credentials_ssl_dynamic_cert_config(initial_cert_config,             # <<<<<<<<<<<<<<
+ *                                                cert_config_fetcher,
+ *                                                bint force_client_auth):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_27server_credentials_ssl_dynamic_cert_config, 0, __pyx_n_s_server_credentials_ssl_dynamic_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__214)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 296, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_server_credentials_ssl_dynamic_c, __pyx_t_2) < 0) __PYX_ERR(5, 296, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":356
+ * 
+ * 
+ * class LocalConnectionType:             # <<<<<<<<<<<<<<
+ *   uds = UDS
+ *   local_tcp = LOCAL_TCP
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_LocalConnectionType, __pyx_n_s_LocalConnectionType, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":357
+ * 
+ * class LocalConnectionType:
+ *   uds = UDS             # <<<<<<<<<<<<<<
+ *   local_tcp = LOCAL_TCP
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_local_connect_type(UDS); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_uds, __pyx_t_7) < 0) __PYX_ERR(5, 357, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":358
+ * class LocalConnectionType:
+ *   uds = UDS
+ *   local_tcp = LOCAL_TCP             # <<<<<<<<<<<<<<
+ * 
+ * cdef class LocalChannelCredentials(ChannelCredentials):
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_local_connect_type(LOCAL_TCP); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_local_tcp, __pyx_t_7) < 0) __PYX_ERR(5, 358, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":356
+ * 
+ * 
+ * class LocalConnectionType:             # <<<<<<<<<<<<<<
+ *   uds = UDS
+ *   local_tcp = LOCAL_TCP
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_LocalConnectionType, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_LocalConnectionType, __pyx_t_7) < 0) __PYX_ERR(5, 356, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23LocalChannelCredentials_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_LocalChannelCredentials___reduce, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__215)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23LocalChannelCredentials_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_LocalChannelCredentials___setsta, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__216)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":370
+ *     return grpc_local_credentials_create(local_connect_type)
+ * 
+ * def channel_credentials_local(grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *   return LocalChannelCredentials(local_connect_type)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29channel_credentials_local, 0, __pyx_n_s_channel_credentials_local, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__218)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 370, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channel_credentials_local, __pyx_t_2) < 0) __PYX_ERR(5, 370, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_26InsecureChannelCredentials_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_InsecureChannelCredentials___red, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__219)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials);
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_InsecureChannelCredentials, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_InsecureChannelCredentials__set_state(self, __pyx_state)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_26InsecureChannelCredentials_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_InsecureChannelCredentials___set, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__220)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_InsecureChannelCredentials);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":378
+ *     return grpc_insecure_credentials_create()
+ * 
+ * def channel_credentials_insecure():             # <<<<<<<<<<<<<<
+ *   return InsecureChannelCredentials()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_31channel_credentials_insecure, 0, __pyx_n_s_channel_credentials_insecure, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__221)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 378, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channel_credentials_insecure, __pyx_t_2) < 0) __PYX_ERR(5, 378, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":381
+ *   return InsecureChannelCredentials()
+ * 
+ * def server_credentials_local(grpc_local_connect_type local_connect_type):             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_33server_credentials_local, 0, __pyx_n_s_server_credentials_local, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__223)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 381, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_server_credentials_local, __pyx_t_2) < 0) __PYX_ERR(5, 381, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":386
+ *   return credentials
+ * 
+ * def xds_server_credentials(ServerCredentials fallback_credentials):             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_xds_server_credentials_create(fallback_credentials.c_credentials)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_35xds_server_credentials, 0, __pyx_n_s_xds_server_credentials, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__225)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 386, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_xds_server_credentials, __pyx_t_2) < 0) __PYX_ERR(5, 386, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":394
+ *   return credentials
+ * 
+ * def insecure_server_credentials():             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   credentials.c_credentials = grpc_insecure_server_credentials_create()
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_37insecure_server_credentials, 0, __pyx_n_s_insecure_server_credentials, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__227)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 394, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_insecure_server_credentials, __pyx_t_2) < 0) __PYX_ERR(5, 394, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_22ALTSChannelCredentials_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ALTSChannelCredentials___reduce, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__228)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_22ALTSChannelCredentials_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ALTSChannelCredentials___setstat, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__229)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":416
+ * 
+ * 
+ * def channel_credentials_alts(list service_accounts):             # <<<<<<<<<<<<<<
+ *   return ALTSChannelCredentials(service_accounts)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_39channel_credentials_alts, 0, __pyx_n_s_channel_credentials_alts, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__231)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 416, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channel_credentials_alts, __pyx_t_2) < 0) __PYX_ERR(5, 416, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":420
+ * 
+ * 
+ * def server_credentials_alts():             # <<<<<<<<<<<<<<
+ *   cdef ServerCredentials credentials = ServerCredentials()
+ *   cdef grpc_alts_credentials_options* c_options = grpc_alts_credentials_server_options_create()
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_41server_credentials_alts, 0, __pyx_n_s_server_credentials_alts, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__233)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 420, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_server_credentials_alts, __pyx_t_2) < 0) __PYX_ERR(5, 420, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_31ComputeEngineChannelCredentials_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ComputeEngineChannelCredentials_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__234)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_31ComputeEngineChannelCredentials_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ComputeEngineChannelCredentials_3, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__235)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi":445
+ * 
+ * 
+ * def channel_credentials_compute_engine(call_creds):             # <<<<<<<<<<<<<<
+ *   return ComputeEngineChannelCredentials(call_creds)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_43channel_credentials_compute_engine, 0, __pyx_n_s_channel_credentials_compute_engi, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__237)); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 445, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_channel_credentials_compute_engi, __pyx_t_2) < 0) __PYX_ERR(5, 445, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":16
+ * 
+ * 
+ * g_interrupt_check_period_ms = 200             # <<<<<<<<<<<<<<
+ * 
+ * cdef grpc_event _next(grpc_completion_queue *c_completion_queue, deadline) except *:
+ */
+  __pyx_v_7_cython_6cygrpc_g_interrupt_check_period_ms = 0xC8;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":103
+ *     return event
+ * 
+ *   def _internal_poll(self, deadline):             # <<<<<<<<<<<<<<
+ *     return self._interpret_event(_next(self.c_completion_queue, deadline))
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CompletionQueue_3_internal_poll, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompletionQueue__internal_poll, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__239)); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompletionQueue, __pyx_n_s_internal_poll, __pyx_t_2) < 0) __PYX_ERR(15, 103, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CompletionQueue);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":108
+ *   # We name this 'poll' to avoid problems with CPython's expectations for
+ *   # 'special' methods (like next and __next__).
+ *   def poll(self, deadline=None):             # <<<<<<<<<<<<<<
+ *     global g_gevent_activated
+ *     if g_gevent_activated:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CompletionQueue_5poll, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompletionQueue_poll, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__240)); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 108, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_tuple__241);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompletionQueue, __pyx_n_s_poll, __pyx_t_2) < 0) __PYX_ERR(15, 108, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CompletionQueue);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":115
+ *       return self._internal_poll(deadline)
+ * 
+ *   def shutdown(self):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_completion_queue_shutdown(self.c_completion_queue)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CompletionQueue_7shutdown, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompletionQueue_shutdown, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__242)); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 115, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompletionQueue, __pyx_n_s_shutdown, __pyx_t_2) < 0) __PYX_ERR(15, 115, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CompletionQueue);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi":120
+ *     self.is_shutting_down = True
+ * 
+ *   def clear(self):             # <<<<<<<<<<<<<<
+ *     if not self.is_shutting_down:
+ *       raise ValueError('queue must be shutting down to be cleared')
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CompletionQueue_9clear, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompletionQueue_clear, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__243)); if (unlikely(!__pyx_t_2)) __PYX_ERR(15, 120, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompletionQueue, __pyx_n_s_clear, __pyx_t_2) < 0) __PYX_ERR(15, 120, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CompletionQueue);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CompletionQueue_13__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompletionQueue___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__244)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CompletionQueue_15__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompletionQueue___setstate_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__245)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ConnectivityEvent_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConnectivityEvent___reduce_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__246)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ConnectivityEvent_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConnectivityEvent___setstate_cyt, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__247)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16RequestCallEvent_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RequestCallEvent___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__248)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16RequestCallEvent_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RequestCallEvent___setstate_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__249)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19BatchOperationEvent_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BatchOperationEvent___reduce_cyt, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__250)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19BatchOperationEvent_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BatchOperationEvent___setstate_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__251)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19ServerShutdownEvent_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServerShutdownEvent___reduce_cyt, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__252)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19ServerShutdownEvent_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServerShutdownEvent___setstate_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__253)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * import collections             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_collections, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(18, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_collections, __pyx_t_2) < 0) __PYX_ERR(18, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":18
+ * 
+ * 
+ * class InitialMetadataFlags:             # <<<<<<<<<<<<<<
+ *   used_mask = GRPC_INITIAL_METADATA_USED_MASK
+ *   wait_for_ready = GRPC_INITIAL_METADATA_WAIT_FOR_READY
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_InitialMetadataFlags, __pyx_n_s_InitialMetadataFlags, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(18, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":19
+ * 
+ * class InitialMetadataFlags:
+ *   used_mask = GRPC_INITIAL_METADATA_USED_MASK             # <<<<<<<<<<<<<<
+ *   wait_for_ready = GRPC_INITIAL_METADATA_WAIT_FOR_READY
+ *   wait_for_ready_explicitly_set = GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_INITIAL_METADATA_USED_MASK); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_used_mask, __pyx_t_7) < 0) __PYX_ERR(18, 19, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":20
+ * class InitialMetadataFlags:
+ *   used_mask = GRPC_INITIAL_METADATA_USED_MASK
+ *   wait_for_ready = GRPC_INITIAL_METADATA_WAIT_FOR_READY             # <<<<<<<<<<<<<<
+ *   wait_for_ready_explicitly_set = GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_INITIAL_METADATA_WAIT_FOR_READY); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_wait_for_ready, __pyx_t_7) < 0) __PYX_ERR(18, 20, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":21
+ *   used_mask = GRPC_INITIAL_METADATA_USED_MASK
+ *   wait_for_ready = GRPC_INITIAL_METADATA_WAIT_FOR_READY
+ *   wait_for_ready_explicitly_set = GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_wait_for_ready_explicitly_set, __pyx_t_7) < 0) __PYX_ERR(18, 21, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":18
+ * 
+ * 
+ * class InitialMetadataFlags:             # <<<<<<<<<<<<<<
+ *   used_mask = GRPC_INITIAL_METADATA_USED_MASK
+ *   wait_for_ready = GRPC_INITIAL_METADATA_WAIT_FOR_READY
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_InitialMetadataFlags, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_InitialMetadataFlags, __pyx_t_7) < 0) __PYX_ERR(18, 18, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/metadata.pyx.pxi":24
+ * 
+ * 
+ * _Metadatum = collections.namedtuple('_Metadatum', ('key', 'value',))             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_collections); if (unlikely(!__pyx_t_2)) __PYX_ERR(18, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_namedtuple); if (unlikely(!__pyx_t_7)) __PYX_ERR(18, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple__255, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(18, 24, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Metadatum, __pyx_t_2) < 0) __PYX_ERR(18, 24, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9Operation_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Operation___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__256)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self.c_op cannot be converted to a Python object for pickling"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9Operation_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Operation___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__257)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":31
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_INITIAL_METADATA
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_28SendInitialMetadataOperation_3type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendInitialMetadataOperation_typ, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__258)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 31, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation, __pyx_n_s_type, __pyx_t_2) < 0) __PYX_ERR(19, 31, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_SendInitialMetadataOperation);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_28SendInitialMetadataOperation_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendInitialMetadataOperation___r, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__259)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_28SendInitialMetadataOperation_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendInitialMetadataOperation___s, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__260)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":58
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_MESSAGE
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20SendMessageOperation_3type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendMessageOperation_type, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__261)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 58, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendMessageOperation, __pyx_n_s_type, __pyx_t_2) < 0) __PYX_ERR(19, 58, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_SendMessageOperation);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20SendMessageOperation_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendMessageOperation___reduce_cy, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__262)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20SendMessageOperation_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendMessageOperation___setstate, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__263)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":80
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_28SendCloseFromClientOperation_3type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendCloseFromClientOperation_typ, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__264)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation, __pyx_n_s_type, __pyx_t_2) < 0) __PYX_ERR(19, 80, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_SendCloseFromClientOperation);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_28SendCloseFromClientOperation_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendCloseFromClientOperation___r, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__265)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_28SendCloseFromClientOperation_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendCloseFromClientOperation___s, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__266)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":99
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_SEND_STATUS_FROM_SERVER
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29SendStatusFromServerOperation_3type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendStatusFromServerOperation_ty, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__267)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 99, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation, __pyx_n_s_type, __pyx_t_2) < 0) __PYX_ERR(19, 99, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_SendStatusFromServerOperation);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29SendStatusFromServerOperation_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendStatusFromServerOperation_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__268)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29SendStatusFromServerOperation_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SendStatusFromServerOperation_3, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__269)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":127
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_INITIAL_METADATA
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_3type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveInitialMetadataOperation_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__270)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 127, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation, __pyx_n_s_type, __pyx_t_2) < 0) __PYX_ERR(19, 127, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":141
+ *     grpc_metadata_array_destroy(&self._c_initial_metadata)
+ * 
+ *   def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *     return self._initial_metadata
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_5initial_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveInitialMetadataOperation_3, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__271)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 141, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation, __pyx_n_s_initial_metadata, __pyx_t_2) < 0) __PYX_ERR(19, 141, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveInitialMetadataOperation);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveInitialMetadataOperation_4, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__272)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_31ReceiveInitialMetadataOperation_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveInitialMetadataOperation_5, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__273)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":150
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_MESSAGE
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23ReceiveMessageOperation_3type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveMessageOperation_type, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__274)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 150, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation, __pyx_n_s_type, __pyx_t_2) < 0) __PYX_ERR(19, 150, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":183
+ *       self._message = None
+ * 
+ *   def message(self):             # <<<<<<<<<<<<<<
+ *     return self._message
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23ReceiveMessageOperation_5message, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveMessageOperation_message, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__275)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 183, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation, __pyx_n_s_message, __pyx_t_2) < 0) __PYX_ERR(19, 183, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveMessageOperation);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23ReceiveMessageOperation_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveMessageOperation___reduce, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__276)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_23ReceiveMessageOperation_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveMessageOperation___setsta, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__277)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":192
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_STATUS_ON_CLIENT
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_3type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveStatusOnClientOperation_t, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__278)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 192, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation, __pyx_n_s_type, __pyx_t_2) < 0) __PYX_ERR(19, 192, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":220
+ *       self._error_string = ""
+ * 
+ *   def trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *     return self._trailing_metadata
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_5trailing_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveStatusOnClientOperation_t_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__279)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 220, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation, __pyx_n_s_trailing_metadata, __pyx_t_2) < 0) __PYX_ERR(19, 220, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":223
+ *     return self._trailing_metadata
+ * 
+ *   def code(self):             # <<<<<<<<<<<<<<
+ *     return self._code
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_7code, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveStatusOnClientOperation_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__280)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 223, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation, __pyx_n_s_code, __pyx_t_2) < 0) __PYX_ERR(19, 223, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":226
+ *     return self._code
+ * 
+ *   def details(self):             # <<<<<<<<<<<<<<
+ *     return self._details
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_9details, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveStatusOnClientOperation_d, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__281)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 226, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation, __pyx_n_s_details, __pyx_t_2) < 0) __PYX_ERR(19, 226, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":229
+ *     return self._details
+ * 
+ *   def error_string(self):             # <<<<<<<<<<<<<<
+ *     return self._error_string
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_11error_string, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveStatusOnClientOperation_e, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__282)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 229, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation, __pyx_n_s_error_string, __pyx_t_2) < 0) __PYX_ERR(19, 229, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveStatusOnClientOperation);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_13__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveStatusOnClientOperation_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__283)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_30ReceiveStatusOnClientOperation_15__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveStatusOnClientOperation_3, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__284)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":238
+ *     self._flags = flags
+ * 
+ *   def type(self):             # <<<<<<<<<<<<<<
+ *     return GRPC_OP_RECV_CLOSE_ON_SERVER
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_3type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveCloseOnServerOperation_ty, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__285)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 238, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation, __pyx_n_s_type, __pyx_t_2) < 0) __PYX_ERR(19, 238, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi":249
+ *     self._cancelled = bool(self._c_cancelled)
+ * 
+ *   def cancelled(self):             # <<<<<<<<<<<<<<
+ *     return self._cancelled
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_5cancelled, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveCloseOnServerOperation_ca, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__286)); if (unlikely(!__pyx_t_2)) __PYX_ERR(19, 249, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation, __pyx_n_s_cancelled, __pyx_t_2) < 0) __PYX_ERR(19, 249, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_ReceiveCloseOnServerOperation);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveCloseOnServerOperation_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__287)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_29ReceiveCloseOnServerOperation_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ReceiveCloseOnServerOperation_3, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__288)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * class PropagationConstants:             # <<<<<<<<<<<<<<
+ *     GRPC_PROPAGATE_DEADLINE = _GRPC_PROPAGATE_DEADLINE
+ *     GRPC_PROPAGATE_CENSUS_STATS_CONTEXT = _GRPC_PROPAGATE_CENSUS_STATS_CONTEXT
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_PropagationConstants, __pyx_n_s_PropagationConstants, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(40, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi":16
+ * 
+ * class PropagationConstants:
+ *     GRPC_PROPAGATE_DEADLINE = _GRPC_PROPAGATE_DEADLINE             # <<<<<<<<<<<<<<
+ *     GRPC_PROPAGATE_CENSUS_STATS_CONTEXT = _GRPC_PROPAGATE_CENSUS_STATS_CONTEXT
+ *     GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT = _GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_PROPAGATE_DEADLINE); if (unlikely(!__pyx_t_7)) __PYX_ERR(40, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_GRPC_PROPAGATE_DEADLINE, __pyx_t_7) < 0) __PYX_ERR(40, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi":17
+ * class PropagationConstants:
+ *     GRPC_PROPAGATE_DEADLINE = _GRPC_PROPAGATE_DEADLINE
+ *     GRPC_PROPAGATE_CENSUS_STATS_CONTEXT = _GRPC_PROPAGATE_CENSUS_STATS_CONTEXT             # <<<<<<<<<<<<<<
+ *     GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT = _GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT
+ *     GRPC_PROPAGATE_CANCELLATION = _GRPC_PROPAGATE_CANCELLATION
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_PROPAGATE_CENSUS_STATS_CONTEXT); if (unlikely(!__pyx_t_7)) __PYX_ERR(40, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_GRPC_PROPAGATE_CENSUS_STATS_CONT, __pyx_t_7) < 0) __PYX_ERR(40, 17, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi":18
+ *     GRPC_PROPAGATE_DEADLINE = _GRPC_PROPAGATE_DEADLINE
+ *     GRPC_PROPAGATE_CENSUS_STATS_CONTEXT = _GRPC_PROPAGATE_CENSUS_STATS_CONTEXT
+ *     GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT = _GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT             # <<<<<<<<<<<<<<
+ *     GRPC_PROPAGATE_CANCELLATION = _GRPC_PROPAGATE_CANCELLATION
+ *     GRPC_PROPAGATE_DEFAULTS = _GRPC_PROPAGATE_DEFAULTS
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT); if (unlikely(!__pyx_t_7)) __PYX_ERR(40, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_GRPC_PROPAGATE_CENSUS_TRACING_CO, __pyx_t_7) < 0) __PYX_ERR(40, 18, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi":19
+ *     GRPC_PROPAGATE_CENSUS_STATS_CONTEXT = _GRPC_PROPAGATE_CENSUS_STATS_CONTEXT
+ *     GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT = _GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT
+ *     GRPC_PROPAGATE_CANCELLATION = _GRPC_PROPAGATE_CANCELLATION             # <<<<<<<<<<<<<<
+ *     GRPC_PROPAGATE_DEFAULTS = _GRPC_PROPAGATE_DEFAULTS
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_PROPAGATE_CANCELLATION); if (unlikely(!__pyx_t_7)) __PYX_ERR(40, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_GRPC_PROPAGATE_CANCELLATION, __pyx_t_7) < 0) __PYX_ERR(40, 19, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi":20
+ *     GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT = _GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT
+ *     GRPC_PROPAGATE_CANCELLATION = _GRPC_PROPAGATE_CANCELLATION
+ *     GRPC_PROPAGATE_DEFAULTS = _GRPC_PROPAGATE_DEFAULTS             # <<<<<<<<<<<<<<
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_PROPAGATE_DEFAULTS); if (unlikely(!__pyx_t_7)) __PYX_ERR(40, 20, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_GRPC_PROPAGATE_DEFAULTS, __pyx_t_7) < 0) __PYX_ERR(40, 20, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/propagation_bits.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * class PropagationConstants:             # <<<<<<<<<<<<<<
+ *     GRPC_PROPAGATE_DEADLINE = _GRPC_PROPAGATE_DEADLINE
+ *     GRPC_PROPAGATE_CENSUS_STATS_CONTEXT = _GRPC_PROPAGATE_CENSUS_STATS_CONTEXT
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_PropagationConstants, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(40, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_PropagationConstants, __pyx_t_7) < 0) __PYX_ERR(40, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":35
+ * 
+ * 
+ * class ConnectivityState:             # <<<<<<<<<<<<<<
+ *   idle = GRPC_CHANNEL_IDLE
+ *   connecting = GRPC_CHANNEL_CONNECTING
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_ConnectivityState, __pyx_n_s_ConnectivityState, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 35, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":36
+ * 
+ * class ConnectivityState:
+ *   idle = GRPC_CHANNEL_IDLE             # <<<<<<<<<<<<<<
+ *   connecting = GRPC_CHANNEL_CONNECTING
+ *   ready = GRPC_CHANNEL_READY
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_connectivity_state(GRPC_CHANNEL_IDLE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_idle, __pyx_t_7) < 0) __PYX_ERR(21, 36, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":37
+ * class ConnectivityState:
+ *   idle = GRPC_CHANNEL_IDLE
+ *   connecting = GRPC_CHANNEL_CONNECTING             # <<<<<<<<<<<<<<
+ *   ready = GRPC_CHANNEL_READY
+ *   transient_failure = GRPC_CHANNEL_TRANSIENT_FAILURE
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_connectivity_state(GRPC_CHANNEL_CONNECTING); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 37, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_connecting, __pyx_t_7) < 0) __PYX_ERR(21, 37, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":38
+ *   idle = GRPC_CHANNEL_IDLE
+ *   connecting = GRPC_CHANNEL_CONNECTING
+ *   ready = GRPC_CHANNEL_READY             # <<<<<<<<<<<<<<
+ *   transient_failure = GRPC_CHANNEL_TRANSIENT_FAILURE
+ *   shutdown = GRPC_CHANNEL_SHUTDOWN
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_connectivity_state(GRPC_CHANNEL_READY); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 38, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_ready, __pyx_t_7) < 0) __PYX_ERR(21, 38, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":39
+ *   connecting = GRPC_CHANNEL_CONNECTING
+ *   ready = GRPC_CHANNEL_READY
+ *   transient_failure = GRPC_CHANNEL_TRANSIENT_FAILURE             # <<<<<<<<<<<<<<
+ *   shutdown = GRPC_CHANNEL_SHUTDOWN
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_connectivity_state(GRPC_CHANNEL_TRANSIENT_FAILURE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 39, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_transient_failure, __pyx_t_7) < 0) __PYX_ERR(21, 39, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":40
+ *   ready = GRPC_CHANNEL_READY
+ *   transient_failure = GRPC_CHANNEL_TRANSIENT_FAILURE
+ *   shutdown = GRPC_CHANNEL_SHUTDOWN             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_connectivity_state(GRPC_CHANNEL_SHUTDOWN); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 40, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_shutdown, __pyx_t_7) < 0) __PYX_ERR(21, 40, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":35
+ * 
+ * 
+ * class ConnectivityState:             # <<<<<<<<<<<<<<
+ *   idle = GRPC_CHANNEL_IDLE
+ *   connecting = GRPC_CHANNEL_CONNECTING
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_ConnectivityState, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 35, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ConnectivityState, __pyx_t_7) < 0) __PYX_ERR(21, 35, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":43
+ * 
+ * 
+ * class ChannelArgKey:             # <<<<<<<<<<<<<<
+ *   enable_census = GRPC_ARG_ENABLE_CENSUS
+ *   max_concurrent_streams = GRPC_ARG_MAX_CONCURRENT_STREAMS
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_ChannelArgKey, __pyx_n_s_ChannelArgKey, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 43, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":44
+ * 
+ * class ChannelArgKey:
+ *   enable_census = GRPC_ARG_ENABLE_CENSUS             # <<<<<<<<<<<<<<
+ *   max_concurrent_streams = GRPC_ARG_MAX_CONCURRENT_STREAMS
+ *   max_receive_message_length = GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_ARG_ENABLE_CENSUS); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 44, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_enable_census, __pyx_t_7) < 0) __PYX_ERR(21, 44, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":45
+ * class ChannelArgKey:
+ *   enable_census = GRPC_ARG_ENABLE_CENSUS
+ *   max_concurrent_streams = GRPC_ARG_MAX_CONCURRENT_STREAMS             # <<<<<<<<<<<<<<
+ *   max_receive_message_length = GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH
+ *   max_send_message_length = GRPC_ARG_MAX_SEND_MESSAGE_LENGTH
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_ARG_MAX_CONCURRENT_STREAMS); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 45, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_max_concurrent_streams, __pyx_t_7) < 0) __PYX_ERR(21, 45, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":46
+ *   enable_census = GRPC_ARG_ENABLE_CENSUS
+ *   max_concurrent_streams = GRPC_ARG_MAX_CONCURRENT_STREAMS
+ *   max_receive_message_length = GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH             # <<<<<<<<<<<<<<
+ *   max_send_message_length = GRPC_ARG_MAX_SEND_MESSAGE_LENGTH
+ *   http2_initial_sequence_number = GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 46, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_max_receive_message_length, __pyx_t_7) < 0) __PYX_ERR(21, 46, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":47
+ *   max_concurrent_streams = GRPC_ARG_MAX_CONCURRENT_STREAMS
+ *   max_receive_message_length = GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH
+ *   max_send_message_length = GRPC_ARG_MAX_SEND_MESSAGE_LENGTH             # <<<<<<<<<<<<<<
+ *   http2_initial_sequence_number = GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER
+ *   default_authority = GRPC_ARG_DEFAULT_AUTHORITY
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_ARG_MAX_SEND_MESSAGE_LENGTH); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 47, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_max_send_message_length, __pyx_t_7) < 0) __PYX_ERR(21, 47, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":48
+ *   max_receive_message_length = GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH
+ *   max_send_message_length = GRPC_ARG_MAX_SEND_MESSAGE_LENGTH
+ *   http2_initial_sequence_number = GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER             # <<<<<<<<<<<<<<
+ *   default_authority = GRPC_ARG_DEFAULT_AUTHORITY
+ *   primary_user_agent_string = GRPC_ARG_PRIMARY_USER_AGENT_STRING
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 48, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_http2_initial_sequence_number, __pyx_t_7) < 0) __PYX_ERR(21, 48, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":49
+ *   max_send_message_length = GRPC_ARG_MAX_SEND_MESSAGE_LENGTH
+ *   http2_initial_sequence_number = GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER
+ *   default_authority = GRPC_ARG_DEFAULT_AUTHORITY             # <<<<<<<<<<<<<<
+ *   primary_user_agent_string = GRPC_ARG_PRIMARY_USER_AGENT_STRING
+ *   secondary_user_agent_string = GRPC_ARG_SECONDARY_USER_AGENT_STRING
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_ARG_DEFAULT_AUTHORITY); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 49, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_default_authority, __pyx_t_7) < 0) __PYX_ERR(21, 49, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":50
+ *   http2_initial_sequence_number = GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER
+ *   default_authority = GRPC_ARG_DEFAULT_AUTHORITY
+ *   primary_user_agent_string = GRPC_ARG_PRIMARY_USER_AGENT_STRING             # <<<<<<<<<<<<<<
+ *   secondary_user_agent_string = GRPC_ARG_SECONDARY_USER_AGENT_STRING
+ *   ssl_session_cache = GRPC_SSL_SESSION_CACHE_ARG
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_ARG_PRIMARY_USER_AGENT_STRING); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 50, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_primary_user_agent_string, __pyx_t_7) < 0) __PYX_ERR(21, 50, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":51
+ *   default_authority = GRPC_ARG_DEFAULT_AUTHORITY
+ *   primary_user_agent_string = GRPC_ARG_PRIMARY_USER_AGENT_STRING
+ *   secondary_user_agent_string = GRPC_ARG_SECONDARY_USER_AGENT_STRING             # <<<<<<<<<<<<<<
+ *   ssl_session_cache = GRPC_SSL_SESSION_CACHE_ARG
+ *   ssl_target_name_override = GRPC_SSL_TARGET_NAME_OVERRIDE_ARG
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_ARG_SECONDARY_USER_AGENT_STRING); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 51, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_secondary_user_agent_string, __pyx_t_7) < 0) __PYX_ERR(21, 51, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":52
+ *   primary_user_agent_string = GRPC_ARG_PRIMARY_USER_AGENT_STRING
+ *   secondary_user_agent_string = GRPC_ARG_SECONDARY_USER_AGENT_STRING
+ *   ssl_session_cache = GRPC_SSL_SESSION_CACHE_ARG             # <<<<<<<<<<<<<<
+ *   ssl_target_name_override = GRPC_SSL_TARGET_NAME_OVERRIDE_ARG
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_SSL_SESSION_CACHE_ARG); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 52, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_ssl_session_cache, __pyx_t_7) < 0) __PYX_ERR(21, 52, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":53
+ *   secondary_user_agent_string = GRPC_ARG_SECONDARY_USER_AGENT_STRING
+ *   ssl_session_cache = GRPC_SSL_SESSION_CACHE_ARG
+ *   ssl_target_name_override = GRPC_SSL_TARGET_NAME_OVERRIDE_ARG             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyBytes_FromString(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_ssl_target_name_override, __pyx_t_7) < 0) __PYX_ERR(21, 53, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":43
+ * 
+ * 
+ * class ChannelArgKey:             # <<<<<<<<<<<<<<
+ *   enable_census = GRPC_ARG_ENABLE_CENSUS
+ *   max_concurrent_streams = GRPC_ARG_MAX_CONCURRENT_STREAMS
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_ChannelArgKey, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 43, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ChannelArgKey, __pyx_t_7) < 0) __PYX_ERR(21, 43, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":56
+ * 
+ * 
+ * class WriteFlag:             # <<<<<<<<<<<<<<
+ *   buffer_hint = GRPC_WRITE_BUFFER_HINT
+ *   no_compress = GRPC_WRITE_NO_COMPRESS
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_WriteFlag, __pyx_n_s_WriteFlag, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 56, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":57
+ * 
+ * class WriteFlag:
+ *   buffer_hint = GRPC_WRITE_BUFFER_HINT             # <<<<<<<<<<<<<<
+ *   no_compress = GRPC_WRITE_NO_COMPRESS
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_WRITE_BUFFER_HINT); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 57, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_buffer_hint, __pyx_t_7) < 0) __PYX_ERR(21, 57, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":58
+ * class WriteFlag:
+ *   buffer_hint = GRPC_WRITE_BUFFER_HINT
+ *   no_compress = GRPC_WRITE_NO_COMPRESS             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_int(GRPC_WRITE_NO_COMPRESS); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 58, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_no_compress, __pyx_t_7) < 0) __PYX_ERR(21, 58, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":56
+ * 
+ * 
+ * class WriteFlag:             # <<<<<<<<<<<<<<
+ *   buffer_hint = GRPC_WRITE_BUFFER_HINT
+ *   no_compress = GRPC_WRITE_NO_COMPRESS
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_WriteFlag, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 56, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_WriteFlag, __pyx_t_7) < 0) __PYX_ERR(21, 56, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":61
+ * 
+ * 
+ * class StatusCode:             # <<<<<<<<<<<<<<
+ *   ok = GRPC_STATUS_OK
+ *   cancelled = GRPC_STATUS_CANCELLED
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_StatusCode, __pyx_n_s_StatusCode, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 61, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":62
+ * 
+ * class StatusCode:
+ *   ok = GRPC_STATUS_OK             # <<<<<<<<<<<<<<
+ *   cancelled = GRPC_STATUS_CANCELLED
+ *   unknown = GRPC_STATUS_UNKNOWN
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_OK); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_ok, __pyx_t_7) < 0) __PYX_ERR(21, 62, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":63
+ * class StatusCode:
+ *   ok = GRPC_STATUS_OK
+ *   cancelled = GRPC_STATUS_CANCELLED             # <<<<<<<<<<<<<<
+ *   unknown = GRPC_STATUS_UNKNOWN
+ *   invalid_argument = GRPC_STATUS_INVALID_ARGUMENT
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_CANCELLED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 63, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_cancelled, __pyx_t_7) < 0) __PYX_ERR(21, 63, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":64
+ *   ok = GRPC_STATUS_OK
+ *   cancelled = GRPC_STATUS_CANCELLED
+ *   unknown = GRPC_STATUS_UNKNOWN             # <<<<<<<<<<<<<<
+ *   invalid_argument = GRPC_STATUS_INVALID_ARGUMENT
+ *   deadline_exceeded = GRPC_STATUS_DEADLINE_EXCEEDED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_UNKNOWN); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 64, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_unknown, __pyx_t_7) < 0) __PYX_ERR(21, 64, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":65
+ *   cancelled = GRPC_STATUS_CANCELLED
+ *   unknown = GRPC_STATUS_UNKNOWN
+ *   invalid_argument = GRPC_STATUS_INVALID_ARGUMENT             # <<<<<<<<<<<<<<
+ *   deadline_exceeded = GRPC_STATUS_DEADLINE_EXCEEDED
+ *   not_found = GRPC_STATUS_NOT_FOUND
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_INVALID_ARGUMENT); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 65, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_invalid_argument, __pyx_t_7) < 0) __PYX_ERR(21, 65, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":66
+ *   unknown = GRPC_STATUS_UNKNOWN
+ *   invalid_argument = GRPC_STATUS_INVALID_ARGUMENT
+ *   deadline_exceeded = GRPC_STATUS_DEADLINE_EXCEEDED             # <<<<<<<<<<<<<<
+ *   not_found = GRPC_STATUS_NOT_FOUND
+ *   already_exists = GRPC_STATUS_ALREADY_EXISTS
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_DEADLINE_EXCEEDED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 66, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_deadline_exceeded, __pyx_t_7) < 0) __PYX_ERR(21, 66, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":67
+ *   invalid_argument = GRPC_STATUS_INVALID_ARGUMENT
+ *   deadline_exceeded = GRPC_STATUS_DEADLINE_EXCEEDED
+ *   not_found = GRPC_STATUS_NOT_FOUND             # <<<<<<<<<<<<<<
+ *   already_exists = GRPC_STATUS_ALREADY_EXISTS
+ *   permission_denied = GRPC_STATUS_PERMISSION_DENIED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_NOT_FOUND); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_not_found, __pyx_t_7) < 0) __PYX_ERR(21, 67, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":68
+ *   deadline_exceeded = GRPC_STATUS_DEADLINE_EXCEEDED
+ *   not_found = GRPC_STATUS_NOT_FOUND
+ *   already_exists = GRPC_STATUS_ALREADY_EXISTS             # <<<<<<<<<<<<<<
+ *   permission_denied = GRPC_STATUS_PERMISSION_DENIED
+ *   unauthenticated = GRPC_STATUS_UNAUTHENTICATED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_ALREADY_EXISTS); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 68, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_already_exists, __pyx_t_7) < 0) __PYX_ERR(21, 68, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":69
+ *   not_found = GRPC_STATUS_NOT_FOUND
+ *   already_exists = GRPC_STATUS_ALREADY_EXISTS
+ *   permission_denied = GRPC_STATUS_PERMISSION_DENIED             # <<<<<<<<<<<<<<
+ *   unauthenticated = GRPC_STATUS_UNAUTHENTICATED
+ *   resource_exhausted = GRPC_STATUS_RESOURCE_EXHAUSTED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_PERMISSION_DENIED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_permission_denied, __pyx_t_7) < 0) __PYX_ERR(21, 69, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":70
+ *   already_exists = GRPC_STATUS_ALREADY_EXISTS
+ *   permission_denied = GRPC_STATUS_PERMISSION_DENIED
+ *   unauthenticated = GRPC_STATUS_UNAUTHENTICATED             # <<<<<<<<<<<<<<
+ *   resource_exhausted = GRPC_STATUS_RESOURCE_EXHAUSTED
+ *   failed_precondition = GRPC_STATUS_FAILED_PRECONDITION
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_UNAUTHENTICATED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 70, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_unauthenticated, __pyx_t_7) < 0) __PYX_ERR(21, 70, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":71
+ *   permission_denied = GRPC_STATUS_PERMISSION_DENIED
+ *   unauthenticated = GRPC_STATUS_UNAUTHENTICATED
+ *   resource_exhausted = GRPC_STATUS_RESOURCE_EXHAUSTED             # <<<<<<<<<<<<<<
+ *   failed_precondition = GRPC_STATUS_FAILED_PRECONDITION
+ *   aborted = GRPC_STATUS_ABORTED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_RESOURCE_EXHAUSTED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 71, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_resource_exhausted, __pyx_t_7) < 0) __PYX_ERR(21, 71, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":72
+ *   unauthenticated = GRPC_STATUS_UNAUTHENTICATED
+ *   resource_exhausted = GRPC_STATUS_RESOURCE_EXHAUSTED
+ *   failed_precondition = GRPC_STATUS_FAILED_PRECONDITION             # <<<<<<<<<<<<<<
+ *   aborted = GRPC_STATUS_ABORTED
+ *   out_of_range = GRPC_STATUS_OUT_OF_RANGE
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_FAILED_PRECONDITION); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 72, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_failed_precondition, __pyx_t_7) < 0) __PYX_ERR(21, 72, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":73
+ *   resource_exhausted = GRPC_STATUS_RESOURCE_EXHAUSTED
+ *   failed_precondition = GRPC_STATUS_FAILED_PRECONDITION
+ *   aborted = GRPC_STATUS_ABORTED             # <<<<<<<<<<<<<<
+ *   out_of_range = GRPC_STATUS_OUT_OF_RANGE
+ *   unimplemented = GRPC_STATUS_UNIMPLEMENTED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_ABORTED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_aborted, __pyx_t_7) < 0) __PYX_ERR(21, 73, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":74
+ *   failed_precondition = GRPC_STATUS_FAILED_PRECONDITION
+ *   aborted = GRPC_STATUS_ABORTED
+ *   out_of_range = GRPC_STATUS_OUT_OF_RANGE             # <<<<<<<<<<<<<<
+ *   unimplemented = GRPC_STATUS_UNIMPLEMENTED
+ *   internal = GRPC_STATUS_INTERNAL
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_OUT_OF_RANGE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 74, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_out_of_range, __pyx_t_7) < 0) __PYX_ERR(21, 74, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":75
+ *   aborted = GRPC_STATUS_ABORTED
+ *   out_of_range = GRPC_STATUS_OUT_OF_RANGE
+ *   unimplemented = GRPC_STATUS_UNIMPLEMENTED             # <<<<<<<<<<<<<<
+ *   internal = GRPC_STATUS_INTERNAL
+ *   unavailable = GRPC_STATUS_UNAVAILABLE
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_UNIMPLEMENTED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 75, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_unimplemented, __pyx_t_7) < 0) __PYX_ERR(21, 75, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":76
+ *   out_of_range = GRPC_STATUS_OUT_OF_RANGE
+ *   unimplemented = GRPC_STATUS_UNIMPLEMENTED
+ *   internal = GRPC_STATUS_INTERNAL             # <<<<<<<<<<<<<<
+ *   unavailable = GRPC_STATUS_UNAVAILABLE
+ *   data_loss = GRPC_STATUS_DATA_LOSS
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_INTERNAL); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 76, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_internal, __pyx_t_7) < 0) __PYX_ERR(21, 76, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":77
+ *   unimplemented = GRPC_STATUS_UNIMPLEMENTED
+ *   internal = GRPC_STATUS_INTERNAL
+ *   unavailable = GRPC_STATUS_UNAVAILABLE             # <<<<<<<<<<<<<<
+ *   data_loss = GRPC_STATUS_DATA_LOSS
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_UNAVAILABLE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_unavailable, __pyx_t_7) < 0) __PYX_ERR(21, 77, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":78
+ *   internal = GRPC_STATUS_INTERNAL
+ *   unavailable = GRPC_STATUS_UNAVAILABLE
+ *   data_loss = GRPC_STATUS_DATA_LOSS             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_status_code(GRPC_STATUS_DATA_LOSS); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 78, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_data_loss, __pyx_t_7) < 0) __PYX_ERR(21, 78, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":61
+ * 
+ * 
+ * class StatusCode:             # <<<<<<<<<<<<<<
+ *   ok = GRPC_STATUS_OK
+ *   cancelled = GRPC_STATUS_CANCELLED
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_StatusCode, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 61, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_StatusCode, __pyx_t_7) < 0) __PYX_ERR(21, 61, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":81
+ * 
+ * 
+ * class CallError:             # <<<<<<<<<<<<<<
+ *   ok = GRPC_CALL_OK
+ *   error = GRPC_CALL_ERROR
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_CallError, __pyx_n_s_CallError, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 81, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":82
+ * 
+ * class CallError:
+ *   ok = GRPC_CALL_OK             # <<<<<<<<<<<<<<
+ *   error = GRPC_CALL_ERROR
+ *   not_on_server = GRPC_CALL_ERROR_NOT_ON_SERVER
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_OK); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 82, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_ok, __pyx_t_7) < 0) __PYX_ERR(21, 82, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":83
+ * class CallError:
+ *   ok = GRPC_CALL_OK
+ *   error = GRPC_CALL_ERROR             # <<<<<<<<<<<<<<
+ *   not_on_server = GRPC_CALL_ERROR_NOT_ON_SERVER
+ *   not_on_client = GRPC_CALL_ERROR_NOT_ON_CLIENT
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 83, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_error, __pyx_t_7) < 0) __PYX_ERR(21, 83, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":84
+ *   ok = GRPC_CALL_OK
+ *   error = GRPC_CALL_ERROR
+ *   not_on_server = GRPC_CALL_ERROR_NOT_ON_SERVER             # <<<<<<<<<<<<<<
+ *   not_on_client = GRPC_CALL_ERROR_NOT_ON_CLIENT
+ *   already_accepted = GRPC_CALL_ERROR_ALREADY_ACCEPTED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_NOT_ON_SERVER); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 84, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_not_on_server, __pyx_t_7) < 0) __PYX_ERR(21, 84, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":85
+ *   error = GRPC_CALL_ERROR
+ *   not_on_server = GRPC_CALL_ERROR_NOT_ON_SERVER
+ *   not_on_client = GRPC_CALL_ERROR_NOT_ON_CLIENT             # <<<<<<<<<<<<<<
+ *   already_accepted = GRPC_CALL_ERROR_ALREADY_ACCEPTED
+ *   already_invoked = GRPC_CALL_ERROR_ALREADY_INVOKED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_NOT_ON_CLIENT); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_not_on_client, __pyx_t_7) < 0) __PYX_ERR(21, 85, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":86
+ *   not_on_server = GRPC_CALL_ERROR_NOT_ON_SERVER
+ *   not_on_client = GRPC_CALL_ERROR_NOT_ON_CLIENT
+ *   already_accepted = GRPC_CALL_ERROR_ALREADY_ACCEPTED             # <<<<<<<<<<<<<<
+ *   already_invoked = GRPC_CALL_ERROR_ALREADY_INVOKED
+ *   not_invoked = GRPC_CALL_ERROR_NOT_INVOKED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_ALREADY_ACCEPTED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 86, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_already_accepted, __pyx_t_7) < 0) __PYX_ERR(21, 86, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":87
+ *   not_on_client = GRPC_CALL_ERROR_NOT_ON_CLIENT
+ *   already_accepted = GRPC_CALL_ERROR_ALREADY_ACCEPTED
+ *   already_invoked = GRPC_CALL_ERROR_ALREADY_INVOKED             # <<<<<<<<<<<<<<
+ *   not_invoked = GRPC_CALL_ERROR_NOT_INVOKED
+ *   already_finished = GRPC_CALL_ERROR_ALREADY_FINISHED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_ALREADY_INVOKED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 87, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_already_invoked, __pyx_t_7) < 0) __PYX_ERR(21, 87, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":88
+ *   already_accepted = GRPC_CALL_ERROR_ALREADY_ACCEPTED
+ *   already_invoked = GRPC_CALL_ERROR_ALREADY_INVOKED
+ *   not_invoked = GRPC_CALL_ERROR_NOT_INVOKED             # <<<<<<<<<<<<<<
+ *   already_finished = GRPC_CALL_ERROR_ALREADY_FINISHED
+ *   too_many_operations = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_NOT_INVOKED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_not_invoked, __pyx_t_7) < 0) __PYX_ERR(21, 88, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":89
+ *   already_invoked = GRPC_CALL_ERROR_ALREADY_INVOKED
+ *   not_invoked = GRPC_CALL_ERROR_NOT_INVOKED
+ *   already_finished = GRPC_CALL_ERROR_ALREADY_FINISHED             # <<<<<<<<<<<<<<
+ *   too_many_operations = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS
+ *   invalid_flags = GRPC_CALL_ERROR_INVALID_FLAGS
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_ALREADY_FINISHED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 89, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_already_finished, __pyx_t_7) < 0) __PYX_ERR(21, 89, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":90
+ *   not_invoked = GRPC_CALL_ERROR_NOT_INVOKED
+ *   already_finished = GRPC_CALL_ERROR_ALREADY_FINISHED
+ *   too_many_operations = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS             # <<<<<<<<<<<<<<
+ *   invalid_flags = GRPC_CALL_ERROR_INVALID_FLAGS
+ *   invalid_metadata = GRPC_CALL_ERROR_INVALID_METADATA
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 90, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_too_many_operations, __pyx_t_7) < 0) __PYX_ERR(21, 90, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":91
+ *   already_finished = GRPC_CALL_ERROR_ALREADY_FINISHED
+ *   too_many_operations = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS
+ *   invalid_flags = GRPC_CALL_ERROR_INVALID_FLAGS             # <<<<<<<<<<<<<<
+ *   invalid_metadata = GRPC_CALL_ERROR_INVALID_METADATA
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_INVALID_FLAGS); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 91, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_invalid_flags, __pyx_t_7) < 0) __PYX_ERR(21, 91, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":92
+ *   too_many_operations = GRPC_CALL_ERROR_TOO_MANY_OPERATIONS
+ *   invalid_flags = GRPC_CALL_ERROR_INVALID_FLAGS
+ *   invalid_metadata = GRPC_CALL_ERROR_INVALID_METADATA             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_call_error(GRPC_CALL_ERROR_INVALID_METADATA); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 92, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_invalid_metadata, __pyx_t_7) < 0) __PYX_ERR(21, 92, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":81
+ * 
+ * 
+ * class CallError:             # <<<<<<<<<<<<<<
+ *   ok = GRPC_CALL_OK
+ *   error = GRPC_CALL_ERROR
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_CallError, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 81, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CallError, __pyx_t_7) < 0) __PYX_ERR(21, 81, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":95
+ * 
+ * 
+ * class CompletionType:             # <<<<<<<<<<<<<<
+ *   queue_shutdown = GRPC_QUEUE_SHUTDOWN
+ *   queue_timeout = GRPC_QUEUE_TIMEOUT
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_CompletionType, __pyx_n_s_CompletionType, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 95, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":96
+ * 
+ * class CompletionType:
+ *   queue_shutdown = GRPC_QUEUE_SHUTDOWN             # <<<<<<<<<<<<<<
+ *   queue_timeout = GRPC_QUEUE_TIMEOUT
+ *   operation_complete = GRPC_OP_COMPLETE
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_completion_type(GRPC_QUEUE_SHUTDOWN); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 96, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_queue_shutdown, __pyx_t_7) < 0) __PYX_ERR(21, 96, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":97
+ * class CompletionType:
+ *   queue_shutdown = GRPC_QUEUE_SHUTDOWN
+ *   queue_timeout = GRPC_QUEUE_TIMEOUT             # <<<<<<<<<<<<<<
+ *   operation_complete = GRPC_OP_COMPLETE
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_completion_type(GRPC_QUEUE_TIMEOUT); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 97, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_queue_timeout, __pyx_t_7) < 0) __PYX_ERR(21, 97, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":98
+ *   queue_shutdown = GRPC_QUEUE_SHUTDOWN
+ *   queue_timeout = GRPC_QUEUE_TIMEOUT
+ *   operation_complete = GRPC_OP_COMPLETE             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_completion_type(GRPC_OP_COMPLETE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 98, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_operation_complete, __pyx_t_7) < 0) __PYX_ERR(21, 98, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":95
+ * 
+ * 
+ * class CompletionType:             # <<<<<<<<<<<<<<
+ *   queue_shutdown = GRPC_QUEUE_SHUTDOWN
+ *   queue_timeout = GRPC_QUEUE_TIMEOUT
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_CompletionType, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 95, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CompletionType, __pyx_t_7) < 0) __PYX_ERR(21, 95, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":101
+ * 
+ * 
+ * class OperationType:             # <<<<<<<<<<<<<<
+ *   send_initial_metadata = GRPC_OP_SEND_INITIAL_METADATA
+ *   send_message = GRPC_OP_SEND_MESSAGE
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_OperationType, __pyx_n_s_OperationType, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 101, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":102
+ * 
+ * class OperationType:
+ *   send_initial_metadata = GRPC_OP_SEND_INITIAL_METADATA             # <<<<<<<<<<<<<<
+ *   send_message = GRPC_OP_SEND_MESSAGE
+ *   send_close_from_client = GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_SEND_INITIAL_METADATA); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 102, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_send_initial_metadata_2, __pyx_t_7) < 0) __PYX_ERR(21, 102, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":103
+ * class OperationType:
+ *   send_initial_metadata = GRPC_OP_SEND_INITIAL_METADATA
+ *   send_message = GRPC_OP_SEND_MESSAGE             # <<<<<<<<<<<<<<
+ *   send_close_from_client = GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ *   send_status_from_server = GRPC_OP_SEND_STATUS_FROM_SERVER
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_SEND_MESSAGE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_send_message_2, __pyx_t_7) < 0) __PYX_ERR(21, 103, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":104
+ *   send_initial_metadata = GRPC_OP_SEND_INITIAL_METADATA
+ *   send_message = GRPC_OP_SEND_MESSAGE
+ *   send_close_from_client = GRPC_OP_SEND_CLOSE_FROM_CLIENT             # <<<<<<<<<<<<<<
+ *   send_status_from_server = GRPC_OP_SEND_STATUS_FROM_SERVER
+ *   receive_initial_metadata = GRPC_OP_RECV_INITIAL_METADATA
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_SEND_CLOSE_FROM_CLIENT); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 104, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_send_close_from_client, __pyx_t_7) < 0) __PYX_ERR(21, 104, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":105
+ *   send_message = GRPC_OP_SEND_MESSAGE
+ *   send_close_from_client = GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ *   send_status_from_server = GRPC_OP_SEND_STATUS_FROM_SERVER             # <<<<<<<<<<<<<<
+ *   receive_initial_metadata = GRPC_OP_RECV_INITIAL_METADATA
+ *   receive_message = GRPC_OP_RECV_MESSAGE
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_SEND_STATUS_FROM_SERVER); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 105, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_send_status_from_server, __pyx_t_7) < 0) __PYX_ERR(21, 105, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":106
+ *   send_close_from_client = GRPC_OP_SEND_CLOSE_FROM_CLIENT
+ *   send_status_from_server = GRPC_OP_SEND_STATUS_FROM_SERVER
+ *   receive_initial_metadata = GRPC_OP_RECV_INITIAL_METADATA             # <<<<<<<<<<<<<<
+ *   receive_message = GRPC_OP_RECV_MESSAGE
+ *   receive_status_on_client = GRPC_OP_RECV_STATUS_ON_CLIENT
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_RECV_INITIAL_METADATA); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_receive_initial_metadata_2, __pyx_t_7) < 0) __PYX_ERR(21, 106, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":107
+ *   send_status_from_server = GRPC_OP_SEND_STATUS_FROM_SERVER
+ *   receive_initial_metadata = GRPC_OP_RECV_INITIAL_METADATA
+ *   receive_message = GRPC_OP_RECV_MESSAGE             # <<<<<<<<<<<<<<
+ *   receive_status_on_client = GRPC_OP_RECV_STATUS_ON_CLIENT
+ *   receive_close_on_server = GRPC_OP_RECV_CLOSE_ON_SERVER
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_RECV_MESSAGE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 107, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_receive_message_2, __pyx_t_7) < 0) __PYX_ERR(21, 107, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":108
+ *   receive_initial_metadata = GRPC_OP_RECV_INITIAL_METADATA
+ *   receive_message = GRPC_OP_RECV_MESSAGE
+ *   receive_status_on_client = GRPC_OP_RECV_STATUS_ON_CLIENT             # <<<<<<<<<<<<<<
+ *   receive_close_on_server = GRPC_OP_RECV_CLOSE_ON_SERVER
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_RECV_STATUS_ON_CLIENT); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 108, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_receive_status_on_client, __pyx_t_7) < 0) __PYX_ERR(21, 108, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":109
+ *   receive_message = GRPC_OP_RECV_MESSAGE
+ *   receive_status_on_client = GRPC_OP_RECV_STATUS_ON_CLIENT
+ *   receive_close_on_server = GRPC_OP_RECV_CLOSE_ON_SERVER             # <<<<<<<<<<<<<<
+ * 
+ * GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM= (
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_op_type(GRPC_OP_RECV_CLOSE_ON_SERVER); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 109, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_receive_close_on_server, __pyx_t_7) < 0) __PYX_ERR(21, 109, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":101
+ * 
+ * 
+ * class OperationType:             # <<<<<<<<<<<<<<
+ *   send_initial_metadata = GRPC_OP_SEND_INITIAL_METADATA
+ *   send_message = GRPC_OP_SEND_MESSAGE
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_OperationType, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 101, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_OperationType, __pyx_t_7) < 0) __PYX_ERR(21, 101, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":112
+ * 
+ * GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM= (
+ *   _GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM)             # <<<<<<<<<<<<<<
+ * 
+ * GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY = (
+ */
+  __pyx_t_2 = __Pyx_PyBytes_FromString(GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 112, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_GRPC_COMPRESSION_CHANNEL_DEFAULT, __pyx_t_2) < 0) __PYX_ERR(21, 111, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":115
+ * 
+ * GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY = (
+ *   _GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY)             # <<<<<<<<<<<<<<
+ * 
+ * class CompressionAlgorithm:
+ */
+  __pyx_t_2 = __Pyx_PyBytes_FromString(GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 115, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_GRPC_COMPRESSION_REQUEST_ALGORIT, __pyx_t_2) < 0) __PYX_ERR(21, 114, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":117
+ *   _GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY)
+ * 
+ * class CompressionAlgorithm:             # <<<<<<<<<<<<<<
+ *   none = GRPC_COMPRESS_NONE
+ *   deflate = GRPC_COMPRESS_DEFLATE
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_CompressionAlgorithm, __pyx_n_s_CompressionAlgorithm, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 117, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":118
+ * 
+ * class CompressionAlgorithm:
+ *   none = GRPC_COMPRESS_NONE             # <<<<<<<<<<<<<<
+ *   deflate = GRPC_COMPRESS_DEFLATE
+ *   gzip = GRPC_COMPRESS_GZIP
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_compression_algorithm(GRPC_COMPRESS_NONE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 118, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_none, __pyx_t_7) < 0) __PYX_ERR(21, 118, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":119
+ * class CompressionAlgorithm:
+ *   none = GRPC_COMPRESS_NONE
+ *   deflate = GRPC_COMPRESS_DEFLATE             # <<<<<<<<<<<<<<
+ *   gzip = GRPC_COMPRESS_GZIP
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_compression_algorithm(GRPC_COMPRESS_DEFLATE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 119, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_deflate, __pyx_t_7) < 0) __PYX_ERR(21, 119, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":120
+ *   none = GRPC_COMPRESS_NONE
+ *   deflate = GRPC_COMPRESS_DEFLATE
+ *   gzip = GRPC_COMPRESS_GZIP             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_compression_algorithm(GRPC_COMPRESS_GZIP); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 120, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_gzip, __pyx_t_7) < 0) __PYX_ERR(21, 120, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":117
+ *   _GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY)
+ * 
+ * class CompressionAlgorithm:             # <<<<<<<<<<<<<<
+ *   none = GRPC_COMPRESS_NONE
+ *   deflate = GRPC_COMPRESS_DEFLATE
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_CompressionAlgorithm, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 117, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CompressionAlgorithm, __pyx_t_7) < 0) __PYX_ERR(21, 117, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":123
+ * 
+ * 
+ * class CompressionLevel:             # <<<<<<<<<<<<<<
+ *   none = GRPC_COMPRESS_LEVEL_NONE
+ *   low = GRPC_COMPRESS_LEVEL_LOW
+ */
+  __pyx_t_2 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_CompressionLevel, __pyx_n_s_CompressionLevel, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":124
+ * 
+ * class CompressionLevel:
+ *   none = GRPC_COMPRESS_LEVEL_NONE             # <<<<<<<<<<<<<<
+ *   low = GRPC_COMPRESS_LEVEL_LOW
+ *   medium = GRPC_COMPRESS_LEVEL_MED
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_compression_level(GRPC_COMPRESS_LEVEL_NONE); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 124, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_none, __pyx_t_7) < 0) __PYX_ERR(21, 124, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":125
+ * class CompressionLevel:
+ *   none = GRPC_COMPRESS_LEVEL_NONE
+ *   low = GRPC_COMPRESS_LEVEL_LOW             # <<<<<<<<<<<<<<
+ *   medium = GRPC_COMPRESS_LEVEL_MED
+ *   high = GRPC_COMPRESS_LEVEL_HIGH
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_compression_level(GRPC_COMPRESS_LEVEL_LOW); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 125, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_low, __pyx_t_7) < 0) __PYX_ERR(21, 125, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":126
+ *   none = GRPC_COMPRESS_LEVEL_NONE
+ *   low = GRPC_COMPRESS_LEVEL_LOW
+ *   medium = GRPC_COMPRESS_LEVEL_MED             # <<<<<<<<<<<<<<
+ *   high = GRPC_COMPRESS_LEVEL_HIGH
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_compression_level(GRPC_COMPRESS_LEVEL_MED); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 126, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_medium, __pyx_t_7) < 0) __PYX_ERR(21, 126, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":127
+ *   low = GRPC_COMPRESS_LEVEL_LOW
+ *   medium = GRPC_COMPRESS_LEVEL_MED
+ *   high = GRPC_COMPRESS_LEVEL_HIGH             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyInt_From_grpc_compression_level(GRPC_COMPRESS_LEVEL_HIGH); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 127, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_high, __pyx_t_7) < 0) __PYX_ERR(21, 127, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":123
+ * 
+ * 
+ * class CompressionLevel:             # <<<<<<<<<<<<<<
+ *   none = GRPC_COMPRESS_LEVEL_NONE
+ *   low = GRPC_COMPRESS_LEVEL_LOW
+ */
+  __pyx_t_7 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_CompressionLevel, __pyx_empty_tuple, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(21, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CompressionLevel, __pyx_t_7) < 0) __PYX_ERR(21, 123, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_11CallDetails_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallDetails___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__289)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_11CallDetails_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallDetails___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__290)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17SslPemKeyCertPair_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SslPemKeyCertPair___reduce_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__291)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17SslPemKeyCertPair_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SslPemKeyCertPair___setstate_cyt, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__292)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":170
+ *       grpc_compression_options_init(&self.c_options)
+ * 
+ *   def enable_algorithm(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18CompressionOptions_3enable_algorithm, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressionOptions_enable_algori, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__294)); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 170, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompressionOptions, __pyx_n_s_enable_algorithm, __pyx_t_2) < 0) __PYX_ERR(21, 170, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CompressionOptions);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":174
+ *       grpc_compression_options_enable_algorithm(&self.c_options, algorithm)
+ * 
+ *   def disable_algorithm(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     with nogil:
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18CompressionOptions_5disable_algorithm, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressionOptions_disable_algor, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__295)); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 174, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompressionOptions, __pyx_n_s_disable_algorithm, __pyx_t_2) < 0) __PYX_ERR(21, 174, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CompressionOptions);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":178
+ *       grpc_compression_options_disable_algorithm(&self.c_options, algorithm)
+ * 
+ *   def is_algorithm_enabled(self, grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *     cdef int result
+ *     with nogil:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18CompressionOptions_7is_algorithm_enabled, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressionOptions_is_algorithm, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__297)); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 178, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompressionOptions, __pyx_n_s_is_algorithm_enabled, __pyx_t_2) < 0) __PYX_ERR(21, 178, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CompressionOptions);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":185
+ *     return result
+ * 
+ *   def to_channel_arg(self):             # <<<<<<<<<<<<<<
+ *     return (
+ *         GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18CompressionOptions_9to_channel_arg, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressionOptions_to_channel_ar, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__298)); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 185, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CompressionOptions, __pyx_n_s_to_channel_arg, __pyx_t_2) < 0) __PYX_ERR(21, 185, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CompressionOptions);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18CompressionOptions_11__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressionOptions___reduce_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__299)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18CompressionOptions_13__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressionOptions___setstate_cy, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__300)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":192
+ * 
+ * 
+ * def compression_algorithm_name(grpc_compression_algorithm algorithm):             # <<<<<<<<<<<<<<
+ *   cdef const char* name
+ *   with nogil:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_45compression_algorithm_name, 0, __pyx_n_s_compression_algorithm_name, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__302)); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 192, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_compression_algorithm_name, __pyx_t_2) < 0) __PYX_ERR(21, 192, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi":200
+ * 
+ * 
+ * def reset_grpc_config_vars():             # <<<<<<<<<<<<<<
+ *   ConfigVars.Reset()
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_47reset_grpc_config_vars, 0, __pyx_n_s_reset_grpc_config_vars, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__303)); if (unlikely(!__pyx_t_2)) __PYX_ERR(21, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reset_grpc_config_vars, __pyx_t_2) < 0) __PYX_ERR(21, 200, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":17
+ * from libc.string cimport memcpy
+ * 
+ * import pkgutil             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_pkgutil, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pkgutil, __pyx_t_2) < 0) __PYX_ERR(22, 17, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":36
+ * 
+ * 
+ * def peer_identities(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef grpc_auth_property_iterator properties
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_49peer_identities, 0, __pyx_n_s_peer_identities, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__305)); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_peer_identities, __pyx_t_2) < 0) __PYX_ERR(22, 36, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":55
+ *   return identities if identities else None
+ * 
+ * def peer_identity_key(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef const char* c_key
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_51peer_identity_key, 0, __pyx_n_s_peer_identity_key, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__307)); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 55, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_peer_identity_key, __pyx_t_2) < 0) __PYX_ERR(22, 55, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi":69
+ *   return key
+ * 
+ * def auth_context(Call call):             # <<<<<<<<<<<<<<
+ *   cdef grpc_auth_context* auth_context
+ *   cdef grpc_auth_property_iterator properties
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_53auth_context, 0, __pyx_n_s_auth_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__309)); if (unlikely(!__pyx_t_2)) __PYX_ERR(22, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_auth_context, __pyx_t_2) < 0) __PYX_ERR(22, 69, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":36
+ *     self.references.append(arguments)
+ * 
+ *   def request_call(             # <<<<<<<<<<<<<<
+ *       self, CompletionQueue call_queue not None,
+ *       CompletionQueue server_queue not None, tag):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_3request_call, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server_request_call, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__311)); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Server, __pyx_n_s_request_call_2, __pyx_t_2) < 0) __PYX_ERR(23, 36, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Server);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":53
+ *         <cpython.PyObject *>request_call_tag)
+ * 
+ *   def register_completion_queue(             # <<<<<<<<<<<<<<
+ *       self, CompletionQueue queue not None):
+ *     if self.is_started:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_5register_completion_queue, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server_register_completion_queue, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__313)); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Server, __pyx_n_s_register_completion_queue, __pyx_t_2) < 0) __PYX_ERR(23, 53, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Server);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":62
+ *     self.registered_completion_queues.append(queue)
+ * 
+ *   def start(self, backup_queue=True):             # <<<<<<<<<<<<<<
+ *     """Start the Cython gRPC Server.
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_7start, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server_start, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__315)); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 62, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_tuple__316);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Server, __pyx_n_s_start, __pyx_t_2) < 0) __PYX_ERR(23, 62, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Server);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":82
+ *       self.backup_shutdown_queue.poll(deadline=time.time())
+ * 
+ *   def add_http2_port(self, bytes address,             # <<<<<<<<<<<<<<
+ *                      ServerCredentials server_credentials=None):
+ *     address = str_to_bytes(address)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_9add_http2_port, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server_add_http2_port, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__318)); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 82, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_tuple__241);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Server, __pyx_n_s_add_http2_port, __pyx_t_2) < 0) __PYX_ERR(23, 82, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Server);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":110
+ *           <cpython.PyObject *>server_shutdown_tag)
+ * 
+ *   def shutdown(self, CompletionQueue queue not None, tag):             # <<<<<<<<<<<<<<
+ *     if queue.is_shutting_down:
+ *       raise ValueError("queue must be live")
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_11shutdown, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server_shutdown, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__320)); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 110, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Server, __pyx_n_s_shutdown, __pyx_t_2) < 0) __PYX_ERR(23, 110, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Server);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":127
+ *     self.is_shutdown = True
+ * 
+ *   def cancel_all_calls(self):             # <<<<<<<<<<<<<<
+ *     if not self.is_shutting_down:
+ *       raise UsageError("the server must be shutting down to cancel all calls")
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_13cancel_all_calls, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server_cancel_all_calls, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__321)); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 127, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Server, __pyx_n_s_cancel_all_calls, __pyx_t_2) < 0) __PYX_ERR(23, 127, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Server);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/server.pyx.pxi":139
+ *   # portion of this is safe to call from __dealloc__, and potentially remove
+ *   # backup_shutdown_queue.
+ *   def destroy(self):             # <<<<<<<<<<<<<<
+ *     if self.c_server != NULL:
+ *       if not self.is_started:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_15destroy, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server_destroy, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__322)); if (unlikely(!__pyx_t_2)) __PYX_ERR(23, 139, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_Server, __pyx_n_s_destroy, __pyx_t_2) < 0) __PYX_ERR(23, 139, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_Server);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_19__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__323)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_6Server_21__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Server___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__324)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4_Tag_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Tag___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__325)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__Tag, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__Tag);
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle__Tag, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle__Tag__set_state(self, __pyx_state)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4_Tag_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Tag___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__326)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__Tag, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__Tag);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ConnectivityTag_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConnectivityTag___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__327)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ConnectivityTag_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConnectivityTag___setstate_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__328)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15_RequestCallTag_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RequestCallTag___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__329)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15_RequestCallTag_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RequestCallTag___setstate_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__330)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18_BatchOperationTag_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BatchOperationTag___reduce_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__331)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18_BatchOperationTag_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BatchOperationTag___setstate_cy, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__332)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18_ServerShutdownTag_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServerShutdownTag___reduce_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__333)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18_ServerShutdownTag_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServerShutdownTag___setstate_cy, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__334)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":34
+ * 
+ * cdef grpc_arg_pointer_vtable default_vtable
+ * default_vtable.copy = &_copy_pointer             # <<<<<<<<<<<<<<
+ * default_vtable.destroy = &_destroy_pointer
+ * default_vtable.cmp = &_compare_pointer
+ */
+  __pyx_v_7_cython_6cygrpc_default_vtable.copy = (&__pyx_f_7_cython_6cygrpc__copy_pointer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":35
+ * cdef grpc_arg_pointer_vtable default_vtable
+ * default_vtable.copy = &_copy_pointer
+ * default_vtable.destroy = &_destroy_pointer             # <<<<<<<<<<<<<<
+ * default_vtable.cmp = &_compare_pointer
+ */
+  __pyx_v_7_cython_6cygrpc_default_vtable.destroy = (&__pyx_f_7_cython_6cygrpc__destroy_pointer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/vtable.pyx.pxi":36
+ * default_vtable.copy = &_copy_pointer
+ * default_vtable.destroy = &_destroy_pointer
+ * default_vtable.cmp = &_compare_pointer             # <<<<<<<<<<<<<<
+ */
+  __pyx_v_7_cython_6cygrpc_default_vtable.cmp = (&__pyx_f_7_cython_6cygrpc__compare_pointer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":19
+ *   raise NotImplementedError("No custom hooks are implemented")
+ * 
+ * def install_context_from_request_call_event(RequestCallEvent event):             # <<<<<<<<<<<<<<
+ *   maybe_save_server_trace_context(event)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_55install_context_from_request_call_event, 0, __pyx_n_s_install_context_from_request_cal_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__336)); if (unlikely(!__pyx_t_2)) __PYX_ERR(26, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_install_context_from_request_cal_2, __pyx_t_2) < 0) __PYX_ERR(26, 19, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":22
+ *   maybe_save_server_trace_context(event)
+ * 
+ * def install_context_from_request_call_event_aio(GrpcCallWrapper event):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_57install_context_from_request_call_event_aio, 0, __pyx_n_s_install_context_from_request_cal, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__337)); if (unlikely(!__pyx_t_2)) __PYX_ERR(26, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_install_context_from_request_cal, __pyx_t_2) < 0) __PYX_ERR(26, 22, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":25
+ *   pass
+ * 
+ * def uninstall_context():             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_59uninstall_context, 0, __pyx_n_s_uninstall_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__338)); if (unlikely(!__pyx_t_2)) __PYX_ERR(26, 25, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_uninstall_context, __pyx_t_2) < 0) __PYX_ERR(26, 25, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":28
+ *   pass
+ * 
+ * def build_census_context():             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_61build_census_context, 0, __pyx_n_s_build_census_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__339)); if (unlikely(!__pyx_t_2)) __PYX_ERR(26, 28, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_build_census_context, __pyx_t_2) < 0) __PYX_ERR(26, 28, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_13CensusContext_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CensusContext___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__340)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CensusContext, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CensusContext);
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_CensusContext, (type(self), 0xe3b0c44, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_CensusContext__set_state(self, __pyx_state)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_13CensusContext_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CensusContext___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__341)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_CensusContext, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_CensusContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":34
+ *   pass
+ * 
+ * def set_census_context_on_call(_CallState call_state, CensusContext census_ctx):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_63set_census_context_on_call, 0, __pyx_n_s_set_census_context_on_call, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__343)); if (unlikely(!__pyx_t_2)) __PYX_ERR(26, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_census_context_on_call, __pyx_t_2) < 0) __PYX_ERR(26, 34, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":37
+ *   pass
+ * 
+ * def set_instrumentation_context_on_call_aio(GrpcCallWrapper call_state, CensusContext census_ctx):             # <<<<<<<<<<<<<<
+ *   pass
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_65set_instrumentation_context_on_call_aio, 0, __pyx_n_s_set_instrumentation_context_on_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__344)); if (unlikely(!__pyx_t_2)) __PYX_ERR(26, 37, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_instrumentation_context_on_c, __pyx_t_2) < 0) __PYX_ERR(26, 37, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/_hooks.pyx.pxi":40
+ *   pass
+ * 
+ * def get_deadline_from_context():             # <<<<<<<<<<<<<<
+ *   return None
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_67get_deadline_from_context, 0, __pyx_n_s_get_deadline_from_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__345)); if (unlikely(!__pyx_t_2)) __PYX_ERR(26, 40, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_deadline_from_context, __pyx_t_2) < 0) __PYX_ERR(26, 40, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":14
+ * # See the License for the specific language governing permissions and
+ * # limitations under the License.
+ * import codecs             # <<<<<<<<<<<<<<
+ * from typing import Optional
+ * 
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_codecs, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 14, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_codecs, __pyx_t_2) < 0) __PYX_ERR(27, 14, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":15
+ * # limitations under the License.
+ * import codecs
+ * from typing import Optional             # <<<<<<<<<<<<<<
+ * 
+ * from libcpp.cast cimport static_cast
+ */
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_n_s_Optional);
+  __Pyx_GIVEREF(__pyx_n_s_Optional);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_Optional)) __PYX_ERR(27, 15, __pyx_L1_error);
+  __pyx_t_7 = __Pyx_Import(__pyx_n_s_typing, __pyx_t_2, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(27, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_7, __pyx_n_s_Optional); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Optional, __pyx_t_2) < 0) __PYX_ERR(27, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":19
+ * from libcpp.cast cimport static_cast
+ * 
+ * from grpc import _observability             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(27, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_INCREF(__pyx_n_s_observability);
+  __Pyx_GIVEREF(__pyx_n_s_observability);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_observability)) __PYX_ERR(27, 19, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_grpc, __pyx_t_7, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_observability); if (unlikely(!__pyx_t_7)) __PYX_ERR(27, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_observability, __pyx_t_7) < 0) __PYX_ERR(27, 19, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":22
+ * 
+ * 
+ * cdef const char* CLIENT_CALL_TRACER = "client_call_tracer"             # <<<<<<<<<<<<<<
+ * cdef const char* SERVER_CALL_TRACER_FACTORY = "server_call_tracer_factory"
+ * 
+ */
+  __pyx_v_7_cython_6cygrpc_CLIENT_CALL_TRACER = ((char const *)"client_call_tracer");
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":23
+ * 
+ * cdef const char* CLIENT_CALL_TRACER = "client_call_tracer"
+ * cdef const char* SERVER_CALL_TRACER_FACTORY = "server_call_tracer_factory"             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_v_7_cython_6cygrpc_SERVER_CALL_TRACER_FACTORY = ((char const *)"server_call_tracer_factory");
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":26
+ * 
+ * 
+ * def set_server_call_tracer_factory(object observability_plugin) -> None:             # <<<<<<<<<<<<<<
+ *   capsule = observability_plugin.create_server_call_tracer_factory()
+ *   capsule_ptr = cpython.PyCapsule_GetPointer(capsule, SERVER_CALL_TRACER_FACTORY)
+ */
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 26, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_s_None) < 0) __PYX_ERR(27, 26, __pyx_L1_error)
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_69set_server_call_tracer_factory, 0, __pyx_n_s_set_server_call_tracer_factory, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__347)); if (unlikely(!__pyx_t_7)) __PYX_ERR(27, 26, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_7, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_server_call_tracer_factory, __pyx_t_7) < 0) __PYX_ERR(27, 26, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":32
+ * 
+ * 
+ * def clear_server_call_tracer_factory() -> None:             # <<<<<<<<<<<<<<
+ *   _register_server_call_tracer_factory(NULL)
+ * 
+ */
+  __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(27, 32, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_return, __pyx_n_s_None) < 0) __PYX_ERR(27, 32, __pyx_L1_error)
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_71clear_server_call_tracer_factory, 0, __pyx_n_s_clear_server_call_tracer_factory, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__348)); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 32, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_7);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_clear_server_call_tracer_factory, __pyx_t_2) < 0) __PYX_ERR(27, 32, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/observability.pyx.pxi":36
+ * 
+ * 
+ * def maybe_save_server_trace_context(RequestCallEvent event) -> None:             # <<<<<<<<<<<<<<
+ *   cdef ServerCallTracer* server_call_tracer
+ *   with _observability.get_plugin() as plugin:
+ */
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(27, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_s_None) < 0) __PYX_ERR(27, 36, __pyx_L1_error)
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_73maybe_save_server_trace_context, 0, __pyx_n_s_maybe_save_server_trace_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__350)); if (unlikely(!__pyx_t_7)) __PYX_ERR(27, 36, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_7, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_maybe_save_server_trace_context, __pyx_t_7) < 0) __PYX_ERR(27, 36, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":21
+ * from cpython cimport Py_INCREF, Py_DECREF
+ * 
+ * import atexit             # <<<<<<<<<<<<<<
+ * import errno
+ * import sys
+ */
+  __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_atexit, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_atexit, __pyx_t_7) < 0) __PYX_ERR(28, 21, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":22
+ * 
+ * import atexit
+ * import errno             # <<<<<<<<<<<<<<
+ * import sys
+ * 
+ */
+  __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_errno, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_errno, __pyx_t_7) < 0) __PYX_ERR(28, 22, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":23
+ * import atexit
+ * import errno
+ * import sys             # <<<<<<<<<<<<<<
+ * 
+ * gevent_hub = None
+ */
+  __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_sys, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 23, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_7) < 0) __PYX_ERR(28, 23, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":25
+ * import sys
+ * 
+ * gevent_hub = None             # <<<<<<<<<<<<<<
+ * g_gevent_pool = None
+ * g_gevent_threadpool = None
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_gevent_hub, Py_None) < 0) __PYX_ERR(28, 25, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":26
+ * 
+ * gevent_hub = None
+ * g_gevent_pool = None             # <<<<<<<<<<<<<<
+ * g_gevent_threadpool = None
+ * g_gevent_activated = False
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_g_gevent_pool, Py_None) < 0) __PYX_ERR(28, 26, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":27
+ * gevent_hub = None
+ * g_gevent_pool = None
+ * g_gevent_threadpool = None             # <<<<<<<<<<<<<<
+ * g_gevent_activated = False
+ * 
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_g_gevent_threadpool, Py_None) < 0) __PYX_ERR(28, 27, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":28
+ * g_gevent_pool = None
+ * g_gevent_threadpool = None
+ * g_gevent_activated = False             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_g_gevent_activated, Py_False) < 0) __PYX_ERR(28, 28, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":34
+ * cdef condition_variable g_greenlets_cv
+ * cdef mutex g_greenlets_mu
+ * cdef bint g_shutdown_greenlets_to_run_queue = False             # <<<<<<<<<<<<<<
+ * cdef int g_channel_count = 0
+ * 
+ */
+  __pyx_v_7_cython_6cygrpc_g_shutdown_greenlets_to_run_queue = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":35
+ * cdef mutex g_greenlets_mu
+ * cdef bint g_shutdown_greenlets_to_run_queue = False
+ * cdef int g_channel_count = 0             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_v_7_cython_6cygrpc_g_channel_count = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":49
+ * 
+ * 
+ * cpdef void gevent_increment_channel_count():             # <<<<<<<<<<<<<<
+ *   global g_channel_count
+ *   cdef int old_channel_count
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_75gevent_increment_channel_count, 0, __pyx_n_s_gevent_increment_channel_count, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__351)); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 49, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_gevent_increment_channel_count, __pyx_t_7) < 0) __PYX_ERR(28, 49, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":61
+ * 
+ * 
+ * cpdef void gevent_decrement_channel_count():             # <<<<<<<<<<<<<<
+ *   global g_channel_count
+ *   with nogil:
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_77gevent_decrement_channel_count, 0, __pyx_n_s_gevent_decrement_channel_count, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__352)); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 61, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_gevent_decrement_channel_count, __pyx_t_7) < 0) __PYX_ERR(28, 61, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":93
+ *   return to_call
+ * 
+ * def spawn_greenlets():             # <<<<<<<<<<<<<<
+ *   while True:
+ *     to_call = g_gevent_threadpool.apply(await_next_greenlet, ())
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_79spawn_greenlets, 0, __pyx_n_s_spawn_greenlets, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__354)); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 93, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_spawn_greenlets, __pyx_t_7) < 0) __PYX_ERR(28, 93, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":102
+ *     fn(*args)
+ * 
+ * def run_spawn_greenlets():             # <<<<<<<<<<<<<<
+ *   g_gevent_pool.spawn(spawn_greenlets)
+ * 
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_81run_spawn_greenlets, 0, __pyx_n_s_run_spawn_greenlets, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__355)); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 102, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_run_spawn_greenlets, __pyx_t_7) < 0) __PYX_ERR(28, 102, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":105
+ *   g_gevent_pool.spawn(spawn_greenlets)
+ * 
+ * def shutdown_await_next_greenlet():             # <<<<<<<<<<<<<<
+ *   global g_shutdown_greenlets_to_run_queue
+ *   cdef unique_lock[mutex]* lk
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_83shutdown_await_next_greenlet, 0, __pyx_n_s_shutdown_await_next_greenlet, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__357)); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 105, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_shutdown_await_next_greenlet, __pyx_t_7) < 0) __PYX_ERR(28, 105, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi":114
+ *   g_greenlets_cv.notify_all()
+ * 
+ * def init_grpc_gevent():             # <<<<<<<<<<<<<<
+ *   # Lazily import gevent
+ *   global gevent_hub
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_85init_grpc_gevent, 0, __pyx_n_s_init_grpc_gevent, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__359)); if (unlikely(!__pyx_t_7)) __PYX_ERR(28, 114, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_init_grpc_gevent, __pyx_t_7) < 0) __PYX_ERR(28, 114, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * def _contextvars_supported():             # <<<<<<<<<<<<<<
+ *     """Determines if the contextvars module is supported.
+ * 
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_87_contextvars_supported, 0, __pyx_n_s_contextvars_supported, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__361)); if (unlikely(!__pyx_t_7)) __PYX_ERR(29, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_contextvars_supported, __pyx_t_7) < 0) __PYX_ERR(29, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":33
+ * 
+ * 
+ * def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *     """Runs a callable with contextvars propagated.
+ * 
+ */
+  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_89_run_with_context, 0, __pyx_n_s_run_with_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__363)); if (unlikely(!__pyx_t_7)) __PYX_ERR(29, 33, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_run_with_context, __pyx_t_7) < 0) __PYX_ERR(29, 33, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":48
+ * 
+ * 
+ * if _contextvars_supported():             # <<<<<<<<<<<<<<
+ *     import contextvars
+ *     def _run_with_context(target):
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_contextvars_supported); if (unlikely(!__pyx_t_7)) __PYX_ERR(29, 48, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(29, 48, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(29, 48, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__pyx_t_8) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":49
+ * 
+ * if _contextvars_supported():
+ *     import contextvars             # <<<<<<<<<<<<<<
+ *     def _run_with_context(target):
+ *         ctx = contextvars.copy_context()
+ */
+    __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_contextvars, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(29, 49, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyDict_SetItem(__pyx_d, __pyx_n_s_contextvars, __pyx_t_2) < 0) __PYX_ERR(29, 49, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":50
+ * if _contextvars_supported():
+ *     import contextvars
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         ctx = contextvars.copy_context()
+ *         def _run(*args):
+ */
+    __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_91_run_with_context, 0, __pyx_n_s_run_with_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__365)); if (unlikely(!__pyx_t_2)) __PYX_ERR(29, 50, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyDict_SetItem(__pyx_d, __pyx_n_s_run_with_context, __pyx_t_2) < 0) __PYX_ERR(29, 50, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":48
+ * 
+ * 
+ * if _contextvars_supported():             # <<<<<<<<<<<<<<
+ *     import contextvars
+ *     def _run_with_context(target):
+ */
+    goto __pyx_L8;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/thread.pyx.pxi":56
+ *         return _run
+ * else:
+ *     def _run_with_context(target):             # <<<<<<<<<<<<<<
+ *         def _run(*args):
+ *             target(*args)
+ */
+  /*else*/ {
+    __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_93_run_with_context, 0, __pyx_n_s_run_with_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__367)); if (unlikely(!__pyx_t_2)) __PYX_ERR(29, 56, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyDict_SetItem(__pyx_d, __pyx_n_s_run_with_context, __pyx_t_2) < 0) __PYX_ERR(29, 56, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_L8:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * import os             # <<<<<<<<<<<<<<
+ * 
+ * _AWAIT_THREADS_TIMEOUT_SECONDS = 5
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_os, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_os, __pyx_t_2) < 0) __PYX_ERR(1, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":17
+ * import os
+ * 
+ * _AWAIT_THREADS_TIMEOUT_SECONDS = 5             # <<<<<<<<<<<<<<
+ * 
+ * _TRUE_VALUES = ['yes',  'Yes',  'YES', 'true', 'True', 'TRUE', '1']
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_AWAIT_THREADS_TIMEOUT_SECONDS, __pyx_int_5) < 0) __PYX_ERR(1, 17, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":19
+ * _AWAIT_THREADS_TIMEOUT_SECONDS = 5
+ * 
+ * _TRUE_VALUES = ['yes',  'Yes',  'YES', 'true', 'True', 'TRUE', '1']             # <<<<<<<<<<<<<<
+ * 
+ * # This flag enables experimental support within gRPC Python for applications
+ */
+  __pyx_t_2 = PyList_New(7); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_n_s_yes);
+  __Pyx_GIVEREF(__pyx_n_s_yes);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_yes)) __PYX_ERR(1, 19, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_n_s_Yes);
+  __Pyx_GIVEREF(__pyx_n_s_Yes);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_Yes)) __PYX_ERR(1, 19, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_n_s_YES);
+  __Pyx_GIVEREF(__pyx_n_s_YES);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_YES)) __PYX_ERR(1, 19, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_n_s_true);
+  __Pyx_GIVEREF(__pyx_n_s_true);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_true)) __PYX_ERR(1, 19, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_n_s_True);
+  __Pyx_GIVEREF(__pyx_n_s_True);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_True)) __PYX_ERR(1, 19, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_n_s_TRUE);
+  __Pyx_GIVEREF(__pyx_n_s_TRUE);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_TRUE)) __PYX_ERR(1, 19, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_kp_s_1);
+  __Pyx_GIVEREF(__pyx_kp_s_1);
+  if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 6, __pyx_kp_s_1)) __PYX_ERR(1, 19, __pyx_L1_error);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_TRUE_VALUES, __pyx_t_2) < 0) __PYX_ERR(1, 19, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":33
+ * # This flag is also not supported for non-native IO manager.
+ * _GRPC_ENABLE_FORK_SUPPORT = (
+ *     os.environ.get('GRPC_ENABLE_FORK_SUPPORT', '0')             # <<<<<<<<<<<<<<
+ *         .lower() in _TRUE_VALUES)
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_os); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 33, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_environ); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 33, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 33, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__368, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 33, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":34
+ * _GRPC_ENABLE_FORK_SUPPORT = (
+ *     os.environ.get('GRPC_ENABLE_FORK_SUPPORT', '0')
+ *         .lower() in _TRUE_VALUES)             # <<<<<<<<<<<<<<
+ * 
+ * _fork_handler_failed = False
+ */
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_lower); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_TRUE_VALUES); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_8 = (__Pyx_PySequence_ContainsTF(__pyx_t_7, __pyx_t_2, Py_EQ)); if (unlikely((__pyx_t_8 < 0))) __PYX_ERR(1, 34, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_GRPC_ENABLE_FORK_SUPPORT, __pyx_t_2) < 0) __PYX_ERR(1, 32, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":36
+ *         .lower() in _TRUE_VALUES)
+ * 
+ * _fork_handler_failed = False             # <<<<<<<<<<<<<<
+ * 
+ * cdef void __prefork() noexcept nogil:
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fork_handler_failed, Py_False) < 0) __PYX_ERR(1, 36, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":89
+ * 
+ * 
+ * def fork_handlers_and_grpc_init():             # <<<<<<<<<<<<<<
+ *     grpc_init()
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_95fork_handlers_and_grpc_init, 0, __pyx_n_s_fork_handlers_and_grpc_init, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__369)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 89, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fork_handlers_and_grpc_init, __pyx_t_2) < 0) __PYX_ERR(1, 89, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":102
+ * 
+ * 
+ * class ForkManagedThread(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ */
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_tuple__371); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 102, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 102, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_6 = __Pyx_Py3MetaclassPrepare(__pyx_t_7, __pyx_t_2, __pyx_n_s_ForkManagedThread, __pyx_n_s_ForkManagedThread, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 102, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__pyx_t_2 != __pyx_tuple__371) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_6, "__orig_bases__", __pyx_tuple__371) < 0))) __PYX_ERR(1, 102, __pyx_L1_error)
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":103
+ * 
+ * class ForkManagedThread(object):
+ *     def __init__(self, target, args=()):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             def managed_target(*args):
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_1__init__, 0, __pyx_n_s_ForkManagedThread___init, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__373)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_9, __pyx_tuple__374);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_init, __pyx_t_9) < 0) __PYX_ERR(1, 103, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":114
+ *             self._thread = threading.Thread(target=_run_with_context(target), args=args)
+ * 
+ *     def setDaemon(self, daemonic):             # <<<<<<<<<<<<<<
+ *         self._thread.daemon = daemonic
+ * 
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_3setDaemon, 0, __pyx_n_s_ForkManagedThread_setDaemon, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__376)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 114, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_setDaemon, __pyx_t_9) < 0) __PYX_ERR(1, 114, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":117
+ *         self._thread.daemon = daemonic
+ * 
+ *     def start(self):             # <<<<<<<<<<<<<<
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ *             _fork_state.active_thread_count.increment()
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_5start, 0, __pyx_n_s_ForkManagedThread_start, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__377)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 117, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_start, __pyx_t_9) < 0) __PYX_ERR(1, 117, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":122
+ *         self._thread.start()
+ * 
+ *     def join(self):             # <<<<<<<<<<<<<<
+ *         self._thread.join()
+ * 
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_17ForkManagedThread_7join, 0, __pyx_n_s_ForkManagedThread_join, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__378)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 122, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_join, __pyx_t_9) < 0) __PYX_ERR(1, 122, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":102
+ * 
+ * 
+ * class ForkManagedThread(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self, target, args=()):
+ *         if _GRPC_ENABLE_FORK_SUPPORT:
+ */
+  __pyx_t_9 = __Pyx_Py3ClassCreate(__pyx_t_7, __pyx_n_s_ForkManagedThread, __pyx_t_2, __pyx_t_6, NULL, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 102, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ForkManagedThread, __pyx_t_9) < 0) __PYX_ERR(1, 102, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":126
+ * 
+ * 
+ * def block_if_fork_in_progress(postfork_state_to_reset=None):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         with _fork_state.fork_in_progress_condition:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_97block_if_fork_in_progress, 0, __pyx_n_s_block_if_fork_in_progress, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__380)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 126, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_tuple__241);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_block_if_fork_in_progress, __pyx_t_2) < 0) __PYX_ERR(1, 126, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":138
+ * 
+ * 
+ * def enter_user_request_generator():             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.decrement()
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_99enter_user_request_generator, 0, __pyx_n_s_enter_user_request_generator, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__381)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 138, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_enter_user_request_generator, __pyx_t_2) < 0) __PYX_ERR(1, 138, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":143
+ * 
+ * 
+ * def return_from_user_request_generator():             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.active_thread_count.increment()
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_101return_from_user_request_generator, 0, __pyx_n_s_return_from_user_request_generat, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__382)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 143, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_return_from_user_request_generat, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":149
+ * 
+ * 
+ * def get_fork_epoch():             # <<<<<<<<<<<<<<
+ *     return _fork_state.fork_epoch
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_103get_fork_epoch, 0, __pyx_n_s_get_fork_epoch, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__383)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 149, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_fork_epoch, __pyx_t_2) < 0) __PYX_ERR(1, 149, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":153
+ * 
+ * 
+ * def is_fork_support_enabled():             # <<<<<<<<<<<<<<
+ *     return _GRPC_ENABLE_FORK_SUPPORT
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_105is_fork_support_enabled, 0, __pyx_n_s_is_fork_support_enabled, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__384)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 153, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_fork_support_enabled, __pyx_t_2) < 0) __PYX_ERR(1, 153, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":157
+ * 
+ * 
+ * def fork_register_channel(channel):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.add(channel)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_107fork_register_channel, 0, __pyx_n_s_fork_register_channel, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__386)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 157, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fork_register_channel, __pyx_t_2) < 0) __PYX_ERR(1, 157, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":162
+ * 
+ * 
+ * def fork_unregister_channel(channel):             # <<<<<<<<<<<<<<
+ *     if _GRPC_ENABLE_FORK_SUPPORT:
+ *         _fork_state.channels.discard(channel)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_109fork_unregister_channel, 0, __pyx_n_s_fork_unregister_channel, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__387)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 162, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fork_unregister_channel, __pyx_t_2) < 0) __PYX_ERR(1, 162, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":167
+ * 
+ * 
+ * class _ActiveThreadCount(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self):
+ *         self._num_active_threads = 0
+ */
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_tuple__389); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_6 = __Pyx_Py3MetaclassPrepare(__pyx_t_7, __pyx_t_2, __pyx_n_s_ActiveThreadCount, __pyx_n_s_ActiveThreadCount, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__pyx_t_2 != __pyx_tuple__389) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_6, "__orig_bases__", __pyx_tuple__389) < 0))) __PYX_ERR(1, 167, __pyx_L1_error)
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":168
+ * 
+ * class _ActiveThreadCount(object):
+ *     def __init__(self):             # <<<<<<<<<<<<<<
+ *         self._num_active_threads = 0
+ *         self._condition = threading.Condition()
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18_ActiveThreadCount_1__init__, 0, __pyx_n_s_ActiveThreadCount___init, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__390)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 168, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_init, __pyx_t_9) < 0) __PYX_ERR(1, 168, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":172
+ *         self._condition = threading.Condition()
+ * 
+ *     def increment(self):             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             self._num_active_threads += 1
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18_ActiveThreadCount_3increment, 0, __pyx_n_s_ActiveThreadCount_increment, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__391)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 172, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_increment, __pyx_t_9) < 0) __PYX_ERR(1, 172, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":176
+ *             self._num_active_threads += 1
+ * 
+ *     def decrement(self):             # <<<<<<<<<<<<<<
+ *         with self._condition:
+ *             self._num_active_threads -= 1
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18_ActiveThreadCount_5decrement, 0, __pyx_n_s_ActiveThreadCount_decrement, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__392)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 176, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_decrement, __pyx_t_9) < 0) __PYX_ERR(1, 176, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":182
+ *                 self._condition.notify_all()
+ * 
+ *     def await_zero_threads(self, timeout_secs):             # <<<<<<<<<<<<<<
+ *         end_time = time.time() + timeout_secs
+ *         wait_time = timeout_secs
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_18_ActiveThreadCount_7await_zero_threads, 0, __pyx_n_s_ActiveThreadCount_await_zero_th, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__394)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 182, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_await_zero_threads, __pyx_t_9) < 0) __PYX_ERR(1, 182, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":167
+ * 
+ * 
+ * class _ActiveThreadCount(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self):
+ *         self._num_active_threads = 0
+ */
+  __pyx_t_9 = __Pyx_Py3ClassCreate(__pyx_t_7, __pyx_n_s_ActiveThreadCount, __pyx_t_2, __pyx_t_6, NULL, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ActiveThreadCount, __pyx_t_9) < 0) __PYX_ERR(1, 167, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":199
+ * 
+ * 
+ * class _ForkState(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self):
+ *         self.fork_in_progress_condition = threading.Condition()
+ */
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_tuple__396); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_6 = __Pyx_Py3MetaclassPrepare(__pyx_t_7, __pyx_t_2, __pyx_n_s_ForkState, __pyx_n_s_ForkState, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__pyx_t_2 != __pyx_tuple__396) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_6, "__orig_bases__", __pyx_tuple__396) < 0))) __PYX_ERR(1, 199, __pyx_L1_error)
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":200
+ * 
+ * class _ForkState(object):
+ *     def __init__(self):             # <<<<<<<<<<<<<<
+ *         self.fork_in_progress_condition = threading.Condition()
+ *         self.fork_in_progress = False
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10_ForkState_1__init__, 0, __pyx_n_s_ForkState___init, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__397)); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetNameInClass(__pyx_t_6, __pyx_n_s_init, __pyx_t_9) < 0) __PYX_ERR(1, 200, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":199
+ * 
+ * 
+ * class _ForkState(object):             # <<<<<<<<<<<<<<
+ *     def __init__(self):
+ *         self.fork_in_progress_condition = threading.Condition()
+ */
+  __pyx_t_9 = __Pyx_Py3ClassCreate(__pyx_t_7, __pyx_n_s_ForkState, __pyx_t_2, __pyx_t_6, NULL, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ForkState, __pyx_t_9) < 0) __PYX_ERR(1, 199, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/fork_posix.pyx.pxi":211
+ * 
+ * 
+ * _fork_state = _ForkState()             # <<<<<<<<<<<<<<
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ForkState); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 211, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 211, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fork_state, __pyx_t_7) < 0) __PYX_ERR(1, 211, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * import warnings             # <<<<<<<<<<<<<<
+ * 
+ * from cpython.version cimport PY_MAJOR_VERSION, PY_MINOR_VERSION
+ */
+  __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_warnings, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_warnings, __pyx_t_7) < 0) __PYX_ERR(6, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":19
+ * from cpython.version cimport PY_MAJOR_VERSION, PY_MINOR_VERSION
+ * 
+ * TYPE_METADATA_STRING = "Tuple[Tuple[str, Union[str, bytes]]...]"             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_TYPE_METADATA_STRING, __pyx_kp_s_Tuple_Tuple_str_Union_str_bytes) < 0) __PYX_ERR(6, 19, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":59
+ * 
+ * 
+ * class _EOF:             # <<<<<<<<<<<<<<
+ * 
+ *     def __bool__(self):
+ */
+  __pyx_t_7 = __Pyx_Py3MetaclassPrepare((PyObject *) NULL, __pyx_empty_tuple, __pyx_n_s_EOF_2, __pyx_n_s_EOF_2, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":61
+ * class _EOF:
+ * 
+ *     def __bool__(self):             # <<<<<<<<<<<<<<
+ *         return False
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4_EOF_1__bool__, 0, __pyx_n_s_EOF___bool, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__398)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 61, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetNameInClass(__pyx_t_7, __pyx_n_s_bool, __pyx_t_2) < 0) __PYX_ERR(6, 61, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":64
+ *         return False
+ * 
+ *     def __len__(self):             # <<<<<<<<<<<<<<
+ *         return 0
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4_EOF_3__len__, 0, __pyx_n_s_EOF___len, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__399)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 64, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetNameInClass(__pyx_t_7, __pyx_n_s_len, __pyx_t_2) < 0) __PYX_ERR(6, 64, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":67
+ *         return 0
+ * 
+ *     def _repr(self) -> str:             # <<<<<<<<<<<<<<
+ *         return '<grpc.aio.EOF>'
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_s_str) < 0) __PYX_ERR(6, 67, __pyx_L1_error)
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4_EOF_5_repr, 0, __pyx_n_s_EOF__repr, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__400)); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_6, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__Pyx_SetNameInClass(__pyx_t_7, __pyx_n_s_repr, __pyx_t_6) < 0) __PYX_ERR(6, 67, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":70
+ *         return '<grpc.aio.EOF>'
+ * 
+ *     def __repr__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+  __pyx_t_6 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 70, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_return, __pyx_n_s_str) < 0) __PYX_ERR(6, 70, __pyx_L1_error)
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4_EOF_7__repr__, 0, __pyx_n_s_EOF___repr, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__401)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 70, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_2, __pyx_t_6);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  if (__Pyx_SetNameInClass(__pyx_t_7, __pyx_n_s_repr_2, __pyx_t_2) < 0) __PYX_ERR(6, 70, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":73
+ *         return self._repr()
+ * 
+ *     def __str__(self) -> str:             # <<<<<<<<<<<<<<
+ *         return self._repr()
+ * 
+ */
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_s_str) < 0) __PYX_ERR(6, 73, __pyx_L1_error)
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_4_EOF_9__str__, 0, __pyx_n_s_EOF___str, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__402)); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_6, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__Pyx_SetNameInClass(__pyx_t_7, __pyx_n_s_str_2, __pyx_t_6) < 0) __PYX_ERR(6, 73, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":59
+ * 
+ * 
+ * class _EOF:             # <<<<<<<<<<<<<<
+ * 
+ *     def __bool__(self):
+ */
+  __pyx_t_6 = __Pyx_Py3ClassCreate(((PyObject*)&PyType_Type), __pyx_n_s_EOF_2, __pyx_empty_tuple, __pyx_t_7, NULL, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 59, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_EOF_2, __pyx_t_6) < 0) __PYX_ERR(6, 59, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":77
+ * 
+ * 
+ * EOF = _EOF()             # <<<<<<<<<<<<<<
+ * 
+ * _COMPRESSION_METADATA_STRING_MAPPING = {
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_EOF_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_EOF, __pyx_t_6) < 0) __PYX_ERR(6, 77, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":80
+ * 
+ * _COMPRESSION_METADATA_STRING_MAPPING = {
+ *     CompressionAlgorithm.none: 'identity',             # <<<<<<<<<<<<<<
+ *     CompressionAlgorithm.deflate: 'deflate',
+ *     CompressionAlgorithm.gzip: 'gzip',
+ */
+  __pyx_t_6 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_CompressionAlgorithm); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_none); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 80, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  if (PyDict_SetItem(__pyx_t_6, __pyx_t_2, __pyx_n_s_identity) < 0) __PYX_ERR(6, 80, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":81
+ * _COMPRESSION_METADATA_STRING_MAPPING = {
+ *     CompressionAlgorithm.none: 'identity',
+ *     CompressionAlgorithm.deflate: 'deflate',             # <<<<<<<<<<<<<<
+ *     CompressionAlgorithm.gzip: 'gzip',
+ * }
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_CompressionAlgorithm); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 81, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_deflate); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 81, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_6, __pyx_t_7, __pyx_n_s_deflate) < 0) __PYX_ERR(6, 80, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":82
+ *     CompressionAlgorithm.none: 'identity',
+ *     CompressionAlgorithm.deflate: 'deflate',
+ *     CompressionAlgorithm.gzip: 'gzip',             # <<<<<<<<<<<<<<
+ * }
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_CompressionAlgorithm); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 82, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_gzip); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 82, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  if (PyDict_SetItem(__pyx_t_6, __pyx_t_2, __pyx_n_s_gzip) < 0) __PYX_ERR(6, 80, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_COMPRESSION_METADATA_STRING_MAP, __pyx_t_6) < 0) __PYX_ERR(6, 79, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":85
+ * }
+ * 
+ * class BaseError(Exception):             # <<<<<<<<<<<<<<
+ *     """The base class for exceptions generated by gRPC AsyncIO stack."""
+ * 
+ */
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]));
+  __Pyx_GIVEREF((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]));
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])))) __PYX_ERR(6, 85, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_9 = __Pyx_Py3MetaclassPrepare(__pyx_t_7, __pyx_t_2, __pyx_n_s_BaseError, __pyx_n_s_BaseError, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, __pyx_kp_s_The_base_class_for_exceptions_ge); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__pyx_t_2 != __pyx_t_6) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_9, "__orig_bases__", __pyx_t_6) < 0))) __PYX_ERR(6, 85, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_Py3ClassCreate(__pyx_t_7, __pyx_n_s_BaseError, __pyx_t_2, __pyx_t_9, NULL, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 85, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BaseError, __pyx_t_6) < 0) __PYX_ERR(6, 85, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":89
+ * 
+ * 
+ * class UsageError(BaseError):             # <<<<<<<<<<<<<<
+ *     """Raised when the usage of API by applications is inappropriate.
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_BaseError); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 89, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 89, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2)) __PYX_ERR(6, 89, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 89, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 89, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_6 = __Pyx_Py3MetaclassPrepare(__pyx_t_9, __pyx_t_2, __pyx_n_s_UsageError, __pyx_n_s_UsageError, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, __pyx_kp_s_Raised_when_the_usage_of_API_by); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 89, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__pyx_t_2 != __pyx_t_7) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_6, "__orig_bases__", __pyx_t_7) < 0))) __PYX_ERR(6, 89, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_Py3ClassCreate(__pyx_t_9, __pyx_n_s_UsageError, __pyx_t_2, __pyx_t_6, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 89, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_UsageError, __pyx_t_7) < 0) __PYX_ERR(6, 89, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":98
+ * 
+ * 
+ * class AbortError(BaseError):             # <<<<<<<<<<<<<<
+ *     """Raised when calling abort in servicer methods.
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_BaseError); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 98, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 98, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2)) __PYX_ERR(6, 98, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_t_9); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 98, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_6 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 98, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = __Pyx_Py3MetaclassPrepare(__pyx_t_6, __pyx_t_2, __pyx_n_s_AbortError, __pyx_n_s_AbortError, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, __pyx_kp_s_Raised_when_calling_abort_in_ser); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 98, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__pyx_t_2 != __pyx_t_9) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_7, "__orig_bases__", __pyx_t_9) < 0))) __PYX_ERR(6, 98, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_Py3ClassCreate(__pyx_t_6, __pyx_n_s_AbortError, __pyx_t_2, __pyx_t_7, NULL, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 98, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_AbortError, __pyx_t_9) < 0) __PYX_ERR(6, 98, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":106
+ * 
+ * 
+ * class InternalError(BaseError):             # <<<<<<<<<<<<<<
+ *     """Raised upon unexpected errors in native code."""
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_BaseError); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(6, 106, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_9 = __Pyx_Py3MetaclassPrepare(__pyx_t_7, __pyx_t_2, __pyx_n_s_InternalError, __pyx_n_s_InternalError, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, __pyx_kp_s_Raised_upon_unexpected_errors_in); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__pyx_t_2 != __pyx_t_6) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_9, "__orig_bases__", __pyx_t_6) < 0))) __PYX_ERR(6, 106, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_Py3ClassCreate(__pyx_t_7, __pyx_n_s_InternalError, __pyx_t_2, __pyx_t_9, NULL, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_InternalError, __pyx_t_6) < 0) __PYX_ERR(6, 106, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":110
+ * 
+ * 
+ * def schedule_coro_threadsafe(object coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         return loop.create_task(coro)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_111schedule_coro_threadsafe, 0, __pyx_n_s_schedule_coro_threadsafe, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__404)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 110, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_schedule_coro_threadsafe, __pyx_t_2) < 0) __PYX_ERR(6, 110, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":123
+ * 
+ * 
+ * def async_generator_to_generator(object agen, object loop):             # <<<<<<<<<<<<<<
+ *     """Converts an async generator into generator."""
+ *     try:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_113async_generator_to_generator, 0, __pyx_n_s_async_generator_to_generator, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 123, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_async_generator_to_generator, __pyx_t_2) < 0) __PYX_ERR(6, 123, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":141
+ * 
+ * 
+ * async def generator_to_async_generator(object gen, object loop, object thread_pool):             # <<<<<<<<<<<<<<
+ *     """Converts a generator into async generator.
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_116generator_to_async_generator, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_generator_to_async_generator, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__45)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 141, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_generator_to_async_generator, __pyx_t_2) < 0) __PYX_ERR(6, 141, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":176
+ * 
+ * 
+ * if PY_MAJOR_VERSION >= 3 and PY_MINOR_VERSION >= 7:             # <<<<<<<<<<<<<<
+ *     def get_working_loop():
+ *         """Returns a running event loop.
+ */
+  __pyx_t_10 = (PY_MAJOR_VERSION >= 3);
+  if (__pyx_t_10) {
+  } else {
+    __pyx_t_8 = __pyx_t_10;
+    goto __pyx_L10_bool_binop_done;
+  }
+  __pyx_t_10 = (PY_MINOR_VERSION >= 7);
+  __pyx_t_8 = __pyx_t_10;
+  __pyx_L10_bool_binop_done:;
+  if (__pyx_t_8) {
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":177
+ * 
+ * if PY_MAJOR_VERSION >= 3 and PY_MINOR_VERSION >= 7:
+ *     def get_working_loop():             # <<<<<<<<<<<<<<
+ *         """Returns a running event loop.
+ * 
+ */
+    __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_119get_working_loop, 0, __pyx_n_s_get_working_loop, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__407)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 177, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_working_loop, __pyx_t_2) < 0) __PYX_ERR(6, 177, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+    /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":176
+ * 
+ * 
+ * if PY_MAJOR_VERSION >= 3 and PY_MINOR_VERSION >= 7:             # <<<<<<<<<<<<<<
+ *     def get_working_loop():
+ *         """Returns a running event loop.
+ */
+    goto __pyx_L9;
+  }
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":196
+ *                     return asyncio.get_event_loop_policy().new_event_loop()
+ * else:
+ *     def get_working_loop():             # <<<<<<<<<<<<<<
+ *         """Returns a running event loop."""
+ *         return asyncio.get_event_loop()
+ */
+  /*else*/ {
+    __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_121get_working_loop, 0, __pyx_n_s_get_working_loop, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__408)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 196, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_working_loop, __pyx_t_2) < 0) __PYX_ERR(6, 196, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __pyx_L9:;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi":201
+ * 
+ * 
+ * def raise_if_not_valid_trailing_metadata(object metadata):             # <<<<<<<<<<<<<<
+ *     if not hasattr(metadata, '__iter__') or isinstance(metadata, dict):
+ *         raise TypeError(f'Invalid trailing metadata type, expected {TYPE_METADATA_STRING}: {metadata}')
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_123raise_if_not_valid_trailing_metadata, 0, __pyx_n_s_raise_if_not_valid_trailing_meta, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__410)); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_raise_if_not_valid_trailing_meta, __pyx_t_2) < 0) __PYX_ERR(6, 201, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":31
+ *         self._debug_error_string = debug_error_string
+ * 
+ *     cpdef grpc_status_code code(self):             # <<<<<<<<<<<<<<
+ *         return self._code
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_3code, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioRpcStatus_code, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__411)); if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 31, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus, __pyx_n_s_code, __pyx_t_2) < 0) __PYX_ERR(30, 31, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioRpcStatus);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":34
+ *         return self._code
+ * 
+ *     cpdef str details(self):             # <<<<<<<<<<<<<<
+ *         return self._details
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_5details, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioRpcStatus_details, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__412)); if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus, __pyx_n_s_details, __pyx_t_2) < 0) __PYX_ERR(30, 34, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioRpcStatus);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":37
+ *         return self._details
+ * 
+ *     cpdef tuple trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._trailing_metadata
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_7trailing_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioRpcStatus_trailing_metadata, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__413)); if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 37, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus, __pyx_n_s_trailing_metadata, __pyx_t_2) < 0) __PYX_ERR(30, 37, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioRpcStatus);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/rpc_status.pyx.pxi":40
+ *         return self._trailing_metadata
+ * 
+ *     cpdef str debug_error_string(self):             # <<<<<<<<<<<<<<
+ *         return self._debug_error_string
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_9debug_error_string, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioRpcStatus_debug_error_string, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__414)); if (unlikely(!__pyx_t_2)) __PYX_ERR(30, 40, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioRpcStatus, __pyx_n_s_debug_error_string, __pyx_t_2) < 0) __PYX_ERR(30, 40, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioRpcStatus);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_11__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioRpcStatus___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__415)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_12AioRpcStatus_13__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioRpcStatus___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__416)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * import socket             # <<<<<<<<<<<<<<
+ * 
+ * cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME)
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_socket, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_socket, __pyx_t_2) < 0) __PYX_ERR(7, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":17
+ * import socket
+ * 
+ * cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME)             # <<<<<<<<<<<<<<
+ * cdef float _POLL_AWAKE_INTERVAL_S = 0.2
+ * 
+ */
+  __pyx_v_7_cython_6cygrpc__GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":18
+ * 
+ * cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME)
+ * cdef float _POLL_AWAKE_INTERVAL_S = 0.2             # <<<<<<<<<<<<<<
+ * 
+ * # This bool indicates if the event loop impl can monitor a given fd, or has
+ */
+  __pyx_v_7_cython_6cygrpc__POLL_AWAKE_INTERVAL_S = 0.2;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":22
+ * # This bool indicates if the event loop impl can monitor a given fd, or has
+ * # loop.add_reader method.
+ * cdef bint _has_fd_monitoring = True             # <<<<<<<<<<<<<<
+ * 
+ * IF UNAME_SYSNAME == "Windows":
+ */
+  __pyx_v_7_cython_6cygrpc__has_fd_monitoring = 1;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":34
+ * 
+ * 
+ * def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success):             # <<<<<<<<<<<<<<
+ *     CallbackWrapper.functor_run(callback_wrapper.c_functor(), success)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_125_handle_callback_wrapper, 0, __pyx_n_s_handle_callback_wrapper, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__418)); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 34, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_callback_wrapper, __pyx_t_2) < 0) __PYX_ERR(7, 34, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19BaseCompletionQueue_1__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BaseCompletionQueue___reduce_cyt, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__419)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "self._cq cannot be converted to a Python object for pickling"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19BaseCompletionQueue_3__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BaseCompletionQueue___setstate_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__420)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":66
+ *                 self._has_reader = False
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         if self.loop:
+ *             if self._has_reader:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15_BoundEventLoop_3close, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BoundEventLoop_close, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__421)); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 66, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__BoundEventLoop, __pyx_n_s_close, __pyx_t_2) < 0) __PYX_ERR(7, 66, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__BoundEventLoop);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15_BoundEventLoop_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BoundEventLoop___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__422)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15_BoundEventLoop_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BoundEventLoop___setstate_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__423)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":91
+ *         self._queue = cpp_event_queue()
+ * 
+ *     def bind_loop(self, object loop):             # <<<<<<<<<<<<<<
+ *         if loop in self._loops:
+ *             return
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_3bind_loop, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PollerCompletionQueue_bind_loop, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__425)); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 91, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue, __pyx_n_s_bind_loop, __pyx_t_2) < 0) __PYX_ERR(7, 91, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":124
+ *                         self._handle_events(None)
+ * 
+ *     def _poll_wrapper(self):             # <<<<<<<<<<<<<<
+ *         with nogil:
+ *             self._poll()
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_5_poll_wrapper, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PollerCompletionQueue__poll_wrap, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__426)); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 124, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue, __pyx_n_s_poll_wrapper, __pyx_t_2) < 0) __PYX_ERR(7, 124, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi":143
+ *         self._write_socket.close()
+ * 
+ *     def _handle_events(self, object context_loop):             # <<<<<<<<<<<<<<
+ *         cdef bytes data
+ *         if _has_fd_monitoring:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_7_handle_events, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PollerCompletionQueue__handle_ev, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__428)); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 143, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue, __pyx_n_s_handle_events, __pyx_t_2) < 0) __PYX_ERR(7, 143, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_PollerCompletionQueue);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_9__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PollerCompletionQueue___reduce_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__429)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21PollerCompletionQueue_11__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_PollerCompletionQueue___setstate, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__430)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_22CallbackFailureHandler_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallbackFailureHandler___reduce, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__431)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_22CallbackFailureHandler_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallbackFailureHandler___setstat, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__432)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CallbackWrapper_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallbackWrapper___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__433)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_15CallbackWrapper_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CallbackWrapper___setstate_cytho, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__434)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":70
+ *     'grpc_completion_queue_shutdown',
+ *     'Unknown',
+ *     InternalError)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_InternalError); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 70, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":67
+ * 
+ * 
+ * cdef CallbackFailureHandler CQ_SHUTDOWN_FAILURE_HANDLER = CallbackFailureHandler(             # <<<<<<<<<<<<<<
+ *     'grpc_completion_queue_shutdown',
+ *     'Unknown',
+ */
+  __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(32, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_INCREF(__pyx_n_s_grpc_completion_queue_shutdown);
+  __Pyx_GIVEREF(__pyx_n_s_grpc_completion_queue_shutdown);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_grpc_completion_queue_shutdown)) __PYX_ERR(32, 67, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_n_s_Unknown);
+  __Pyx_GIVEREF(__pyx_n_s_Unknown);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_n_s_Unknown)) __PYX_ERR(32, 67, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_2)) __PYX_ERR(32, 67, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler), __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 67, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_XGOTREF((PyObject *)__pyx_v_7_cython_6cygrpc_CQ_SHUTDOWN_FAILURE_HANDLER);
+  __Pyx_DECREF_SET(__pyx_v_7_cython_6cygrpc_CQ_SHUTDOWN_FAILURE_HANDLER, ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_t_2));
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":73
+ * 
+ * 
+ * class ExecuteBatchError(InternalError):             # <<<<<<<<<<<<<<
+ *     """Raised when execute batch returns a failure from Core."""
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_InternalError); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(32, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2)) __PYX_ERR(32, 73, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(32, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_6 = __Pyx_Py3MetaclassPrepare(__pyx_t_9, __pyx_t_2, __pyx_n_s_ExecuteBatchError, __pyx_n_s_ExecuteBatchError, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, __pyx_kp_s_Raised_when_execute_batch_return); if (unlikely(!__pyx_t_6)) __PYX_ERR(32, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__pyx_t_2 != __pyx_t_7) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_6, "__orig_bases__", __pyx_t_7) < 0))) __PYX_ERR(32, 73, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_Py3ClassCreate(__pyx_t_9, __pyx_n_s_ExecuteBatchError, __pyx_t_2, __pyx_t_6, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(32, 73, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ExecuteBatchError, __pyx_t_7) < 0) __PYX_ERR(32, 73, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":77
+ * 
+ * 
+ * async def execute_batch(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                tuple operations,
+ *                                object loop):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_127execute_batch, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_execute_batch, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__51)); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 77, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_execute_batch, __pyx_t_2) < 0) __PYX_ERR(32, 77, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":115
+ * 
+ * 
+ * async def _receive_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                            object loop):
+ *     """Retrives parsed messages from Core.
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_130_receive_message, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_receive_message, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 115, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_receive_message, __pyx_t_2) < 0) __PYX_ERR(32, 115, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":139
+ * 
+ * 
+ * async def _send_message(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                         bytes message,
+ *                         Operation send_initial_metadata_op,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_133_send_message, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_send_message, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__53)); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 139, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_send_message, __pyx_t_2) < 0) __PYX_ERR(32, 139, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":151
+ * 
+ * 
+ * async def _send_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                  tuple metadata,
+ *                                  int flags,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_136_send_initial_metadata, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_send_initial_metadata, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__54)); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 151, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_send_initial_metadata, __pyx_t_2) < 0) __PYX_ERR(32, 151, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":162
+ * 
+ * 
+ * async def _receive_initial_metadata(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                     object loop):
+ *     cdef ReceiveInitialMetadataOperation op = ReceiveInitialMetadataOperation(_EMPTY_FLAGS)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_139_receive_initial_metadata, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_receive_initial_metadata, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__55)); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 162, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_receive_initial_metadata, __pyx_t_2) < 0) __PYX_ERR(32, 162, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi":169
+ *     return op.initial_metadata()
+ * 
+ * async def _send_error_status_from_server(GrpcCallWrapper grpc_call_wrapper,             # <<<<<<<<<<<<<<
+ *                                          grpc_status_code code,
+ *                                          str details,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_142_send_error_status_from_server, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_send_error_status_from_server, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__56)); if (unlikely(!__pyx_t_2)) __PYX_ERR(32, 169, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_send_error_status_from_server, __pyx_t_2) < 0) __PYX_ERR(32, 169, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":15
+ * # limitations under the License.
+ * 
+ * import enum             # <<<<<<<<<<<<<<
+ * 
+ * cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'poller').upper()
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_enum, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 15, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_enum, __pyx_t_2) < 0) __PYX_ERR(33, 15, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":17
+ * import enum
+ * 
+ * cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'poller').upper()             # <<<<<<<<<<<<<<
+ * cdef _AioState _global_aio_state = _AioState()
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_os); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_environ); if (unlikely(!__pyx_t_9)) __PYX_ERR(33, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__441, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(33, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_upper); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(33, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (!(likely(PyString_CheckExact(__pyx_t_9))||((__pyx_t_9) == Py_None) || __Pyx_RaiseUnexpectedTypeError("str", __pyx_t_9))) __PYX_ERR(33, 17, __pyx_L1_error)
+  __Pyx_XGOTREF(__pyx_v_7_cython_6cygrpc__GRPC_ASYNCIO_ENGINE);
+  __Pyx_DECREF_SET(__pyx_v_7_cython_6cygrpc__GRPC_ASYNCIO_ENGINE, ((PyObject*)__pyx_t_9));
+  __Pyx_GIVEREF(__pyx_t_9);
+  __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":18
+ * 
+ * cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'poller').upper()
+ * cdef _AioState _global_aio_state = _AioState()             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_9 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioState)); if (unlikely(!__pyx_t_9)) __PYX_ERR(33, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_XGOTREF((PyObject *)__pyx_v_7_cython_6cygrpc__global_aio_state);
+  __Pyx_DECREF_SET(__pyx_v_7_cython_6cygrpc__global_aio_state, ((struct __pyx_obj_7_cython_6cygrpc__AioState *)__pyx_t_9));
+  __Pyx_GIVEREF(__pyx_t_9);
+  __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":21
+ * 
+ * 
+ * class AsyncIOEngine(enum.Enum):             # <<<<<<<<<<<<<<
+ *     # NOTE(lidiz) the support for custom_io_manager is removed in favor of the
+ *     # EventEngine project, which will be the only IO platform in Core.
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_enum); if (unlikely(!__pyx_t_9)) __PYX_ERR(33, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_Enum); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(33, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2)) __PYX_ERR(33, 21, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_t_9); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_6 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(33, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = __Pyx_Py3MetaclassPrepare(__pyx_t_6, __pyx_t_2, __pyx_n_s_AsyncIOEngine, __pyx_n_s_AsyncIOEngine, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(33, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__pyx_t_2 != __pyx_t_9) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_7, "__orig_bases__", __pyx_t_9) < 0))) __PYX_ERR(33, 21, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":24
+ *     # NOTE(lidiz) the support for custom_io_manager is removed in favor of the
+ *     # EventEngine project, which will be the only IO platform in Core.
+ *     CUSTOM_IO_MANAGER = 'custom_io_manager'             # <<<<<<<<<<<<<<
+ *     POLLER = 'poller'
+ * 
+ */
+  if (__Pyx_SetNameInClass(__pyx_t_7, __pyx_n_s_CUSTOM_IO_MANAGER, __pyx_n_s_custom_io_manager) < 0) __PYX_ERR(33, 24, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":25
+ *     # EventEngine project, which will be the only IO platform in Core.
+ *     CUSTOM_IO_MANAGER = 'custom_io_manager'
+ *     POLLER = 'poller'             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  if (__Pyx_SetNameInClass(__pyx_t_7, __pyx_n_s_POLLER, __pyx_n_s_poller) < 0) __PYX_ERR(33, 25, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":21
+ * 
+ * 
+ * class AsyncIOEngine(enum.Enum):             # <<<<<<<<<<<<<<
+ *     # NOTE(lidiz) the support for custom_io_manager is removed in favor of the
+ *     # EventEngine project, which will be the only IO platform in Core.
+ */
+  __pyx_t_9 = __Pyx_Py3ClassCreate(__pyx_t_6, __pyx_n_s_AsyncIOEngine, __pyx_t_2, __pyx_t_7, NULL, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(33, 21, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_AsyncIOEngine, __pyx_t_9) < 0) __PYX_ERR(33, 21, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9_AioState_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioState___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__442)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9_AioState_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioState___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__443)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":68
+ * 
+ * 
+ * def _grpc_shutdown_wrapper(_):             # <<<<<<<<<<<<<<
+ *     """A thin Python wrapper of Core's shutdown function.
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_145_grpc_shutdown_wrapper, 0, __pyx_n_s_grpc_shutdown_wrapper, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__445)); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 68, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_grpc_shutdown_wrapper, __pyx_t_2) < 0) __PYX_ERR(33, 68, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":91
+ * 
+ * 
+ * cpdef init_grpc_aio():             # <<<<<<<<<<<<<<
+ *     """Initializes the gRPC AsyncIO module.
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_147init_grpc_aio, 0, __pyx_n_s_init_grpc_aio, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__446)); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 91, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_init_grpc_aio, __pyx_t_2) < 0) __PYX_ERR(33, 91, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi":104
+ * 
+ * 
+ * cpdef shutdown_grpc_aio():             # <<<<<<<<<<<<<<
+ *     """Shuts down the gRPC AsyncIO module.
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_149shutdown_grpc_aio, 0, __pyx_n_s_shutdown_grpc_aio, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__447)); if (unlikely(!__pyx_t_2)) __PYX_ERR(33, 104, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_shutdown_grpc_aio, __pyx_t_2) < 0) __PYX_ERR(33, 104, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":16
+ * 
+ * 
+ * _EMPTY_FLAGS = 0             # <<<<<<<<<<<<<<
+ * _EMPTY_MASK = 0
+ * _IMMUTABLE_EMPTY_METADATA = tuple()
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_EMPTY_FLAGS, __pyx_int_0) < 0) __PYX_ERR(34, 16, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":17
+ * 
+ * _EMPTY_FLAGS = 0
+ * _EMPTY_MASK = 0             # <<<<<<<<<<<<<<
+ * _IMMUTABLE_EMPTY_METADATA = tuple()
+ * 
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_EMPTY_MASK, __pyx_int_0) < 0) __PYX_ERR(34, 17, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":18
+ * _EMPTY_FLAGS = 0
+ * _EMPTY_MASK = 0
+ * _IMMUTABLE_EMPTY_METADATA = tuple()             # <<<<<<<<<<<<<<
+ * 
+ * _UNKNOWN_CANCELLATION_DETAILS = 'RPC cancelled for unknown reason.'
+ */
+  __pyx_t_2 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyTuple_Type))); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_IMMUTABLE_EMPTY_METADATA, __pyx_t_2) < 0) __PYX_ERR(34, 18, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":20
+ * _IMMUTABLE_EMPTY_METADATA = tuple()
+ * 
+ * _UNKNOWN_CANCELLATION_DETAILS = 'RPC cancelled for unknown reason.'             # <<<<<<<<<<<<<<
+ * _OK_CALL_REPRESENTATION = ('<{} of RPC that terminated with:\n'
+ *                            '\tstatus = {}\n'
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_UNKNOWN_CANCELLATION_DETAILS, __pyx_kp_s_RPC_cancelled_for_unknown_reason) < 0) __PYX_ERR(34, 20, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":21
+ * 
+ * _UNKNOWN_CANCELLATION_DETAILS = 'RPC cancelled for unknown reason.'
+ * _OK_CALL_REPRESENTATION = ('<{} of RPC that terminated with:\n'             # <<<<<<<<<<<<<<
+ *                            '\tstatus = {}\n'
+ *                            '\tdetails = "{}"\n'
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_OK_CALL_REPRESENTATION, __pyx_kp_s_of_RPC_that_terminated_with_sta) < 0) __PYX_ERR(34, 21, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":26
+ *                            '>')
+ * 
+ * _NON_OK_CALL_REPRESENTATION = ('<{} of RPC that terminated with:\n'             # <<<<<<<<<<<<<<
+ *                                '\tstatus = {}\n'
+ *                                '\tdetails = "{}"\n'
+ */
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_NON_OK_CALL_REPRESENTATION, __pyx_kp_s_of_RPC_that_terminated_with_sta_2) < 0) __PYX_ERR(34, 26, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":69
+ *         shutdown_grpc_aio()
+ * 
+ *     def _repr(self) -> str:             # <<<<<<<<<<<<<<
+ *         """Assembles the RPC representation string."""
+ *         # This needs to be loaded at run time once everything
+ */
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(34, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_return, __pyx_n_s_str) < 0) __PYX_ERR(34, 69, __pyx_L1_error)
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_5_repr, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall__repr, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__449)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 69, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_6, __pyx_t_2);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_repr, __pyx_t_6) < 0) __PYX_ERR(34, 69, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":170
+ *         self._waiters_initial_metadata = []
+ * 
+ *     def add_done_callback(self, callback):             # <<<<<<<<<<<<<<
+ *         if self.done():
+ *             callback()
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_11add_done_callback, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall_add_done_callback, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__451)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 170, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_add_done_callback, __pyx_t_6) < 0) __PYX_ERR(34, 170, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":176
+ *             self._done_callbacks.append(callback)
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         if self._deadline is None:
+ *             return None
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_13time_remaining, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall_time_remaining, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__452)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 176, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_time_remaining, __pyx_t_6) < 0) __PYX_ERR(34, 176, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":182
+ *             return max(0, self._deadline - time.time())
+ * 
+ *     def cancel(self, str details):             # <<<<<<<<<<<<<<
+ *         """Cancels the RPC in Core with given RPC status.
+ * 
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_15cancel, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall_cancel, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__454)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 182, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_cancel, __pyx_t_6) < 0) __PYX_ERR(34, 182, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":213
+ *         assert error == GRPC_CALL_OK
+ * 
+ *     def done(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC call has finished.
+ * 
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_17done, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall_done, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__455)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 213, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_done, __pyx_t_6) < 0) __PYX_ERR(34, 213, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":224
+ *         return self._status is not None
+ * 
+ *     def cancelled(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC was cancelled.
+ * 
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_19cancelled, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall_cancelled, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__456)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 224, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_cancelled, __pyx_t_6) < 0) __PYX_ERR(34, 224, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":235
+ *         return self._status.code() == StatusCode.cancelled
+ * 
+ *     async def status(self):             # <<<<<<<<<<<<<<
+ *         """Returns the status of the RPC call.
+ * 
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_21status, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_status, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__59)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 235, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_status, __pyx_t_6) < 0) __PYX_ERR(34, 235, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":254
+ *         return self._status
+ * 
+ *     def is_ok(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC is ended with ok."""
+ *         return self.done() and self._status.code() == StatusCode.ok
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_24is_ok, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall_is_ok, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__458)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 254, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_is_ok, __pyx_t_6) < 0) __PYX_ERR(34, 254, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":258
+ *         return self.done() and self._status.code() == StatusCode.ok
+ * 
+ *     async def initial_metadata(self):             # <<<<<<<<<<<<<<
+ *         """Returns the initial metadata of the RPC call.
+ * 
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_26initial_metadata, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_initial_metadata, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__60)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 258, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_initial_metadata, __pyx_t_6) < 0) __PYX_ERR(34, 258, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":276
+ *         return self._initial_metadata
+ * 
+ *     def is_locally_cancelled(self):             # <<<<<<<<<<<<<<
+ *         """Returns if the RPC was cancelled locally.
+ * 
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_29is_locally_cancelled, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall_is_locally_cancelled, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__459)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 276, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_is_locally_cancelled, __pyx_t_6) < 0) __PYX_ERR(34, 276, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":288
+ *         return False
+ * 
+ *     def set_internal_error(self, str error_str):             # <<<<<<<<<<<<<<
+ *         self._set_status(AioRpcStatus(
+ *             StatusCode.internal,
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_31set_internal_error, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall_set_internal_error, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__461)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 288, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_set_internal_error, __pyx_t_6) < 0) __PYX_ERR(34, 288, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":296
+ *         ))
+ * 
+ *     async def unary_unary(self,             # <<<<<<<<<<<<<<
+ *                           bytes request,
+ *                           tuple outbound_initial_metadata,
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_33unary_unary, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_unary_unary, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__61)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 296, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_6, __pyx_tuple__241);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_unary_unary, __pyx_t_6) < 0) __PYX_ERR(34, 296, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":347
+ *             return None
+ * 
+ *     async def _handle_status_once_received(self):             # <<<<<<<<<<<<<<
+ *         """Handles the status sent by peer once received."""
+ *         cdef ReceiveStatusOnClientOperation op = ReceiveStatusOnClientOperation(_EMPTY_FLAGS)
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_36_handle_status_once_received, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall__handle_status_once_rec, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__62)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 347, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_handle_status_once_received, __pyx_t_6) < 0) __PYX_ERR(34, 347, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":364
+ *         ))
+ * 
+ *     async def receive_serialized_message(self):             # <<<<<<<<<<<<<<
+ *         """Receives one single raw message in bytes."""
+ *         cdef bytes received_message
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_39receive_serialized_message, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_receive_serialized_mess, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__63)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 364, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_receive_serialized_message, __pyx_t_6) < 0) __PYX_ERR(34, 364, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":381
+ *             return EOF
+ * 
+ *     async def send_serialized_message(self, bytes message):             # <<<<<<<<<<<<<<
+ *         """Sends one single raw message in bytes."""
+ *         await _send_message(self,
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_42send_serialized_message, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_send_serialized_message, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__64)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 381, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_send_serialized_message, __pyx_t_6) < 0) __PYX_ERR(34, 381, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":389
+ *                             self._loop)
+ * 
+ *     async def send_receive_close(self):             # <<<<<<<<<<<<<<
+ *         """Half close the RPC on the client-side."""
+ *         cdef SendCloseFromClientOperation op = SendCloseFromClientOperation(_EMPTY_FLAGS)
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_45send_receive_close, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_send_receive_close, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__65)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 389, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_send_receive_close, __pyx_t_6) < 0) __PYX_ERR(34, 389, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":395
+ *         await execute_batch(self, ops, self._loop)
+ * 
+ *     async def initiate_unary_stream(self,             # <<<<<<<<<<<<<<
+ *                            bytes request,
+ *                            tuple outbound_initial_metadata,
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_48initiate_unary_stream, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_initiate_unary_stream, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__66)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 395, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_6, __pyx_tuple__241);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_initiate_unary_stream, __pyx_t_6) < 0) __PYX_ERR(34, 395, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":437
+ *             await status_task
+ * 
+ *     async def stream_unary(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_51stream_unary, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_stream_unary, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__67)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 437, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_6, __pyx_tuple__241);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_stream_unary, __pyx_t_6) < 0) __PYX_ERR(34, 437, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi":496
+ *             return None
+ * 
+ *     async def initiate_stream_stream(self,             # <<<<<<<<<<<<<<
+ *                            tuple outbound_initial_metadata,
+ *                            object metadata_sent_observer,
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_54initiate_stream_stream, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioCall_initiate_stream_stream, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__68)); if (unlikely(!__pyx_t_6)) __PYX_ERR(34, 496, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_6, __pyx_tuple__241);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__AioCall, __pyx_n_s_initiate_stream_stream, __pyx_t_6) < 0) __PYX_ERR(34, 496, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__AioCall);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_57__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__469)); if (unlikely(!__pyx_t_6)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_6) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8_AioCall_59__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioCall___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__470)); if (unlikely(!__pyx_t_6)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_6) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":17
+ * 
+ * 
+ * class _WatchConnectivityFailed(Exception):             # <<<<<<<<<<<<<<
+ *     """Dedicated exception class for watch connectivity failed.
+ * 
+ */
+  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(8, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]));
+  __Pyx_GIVEREF((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]));
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])))) __PYX_ERR(8, 17, __pyx_L1_error);
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(8, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __pyx_t_9 = __Pyx_Py3MetaclassPrepare(__pyx_t_7, __pyx_t_2, __pyx_n_s_WatchConnectivityFailed, __pyx_n_s_WatchConnectivityFailed, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, __pyx_kp_s_Dedicated_exception_class_for_wa); if (unlikely(!__pyx_t_9)) __PYX_ERR(8, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__pyx_t_2 != __pyx_t_6) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_9, "__orig_bases__", __pyx_t_6) < 0))) __PYX_ERR(8, 17, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = __Pyx_Py3ClassCreate(__pyx_t_7, __pyx_n_s_WatchConnectivityFailed, __pyx_t_2, __pyx_t_9, NULL, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(8, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_WatchConnectivityFailed, __pyx_t_6) < 0) __PYX_ERR(8, 17, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":25
+ *     'watch_connectivity_state',
+ *     'Timed out',
+ *     _WatchConnectivityFailed)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_WatchConnectivityFailed); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 25, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":22
+ *     It might be failed due to deadline exceeded.
+ *     """
+ * cdef CallbackFailureHandler _WATCH_CONNECTIVITY_FAILURE_HANDLER = CallbackFailureHandler(             # <<<<<<<<<<<<<<
+ *     'watch_connectivity_state',
+ *     'Timed out',
+ */
+  __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(8, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_INCREF(__pyx_n_s_watch_connectivity_state);
+  __Pyx_GIVEREF(__pyx_n_s_watch_connectivity_state);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_watch_connectivity_state)) __PYX_ERR(8, 22, __pyx_L1_error);
+  __Pyx_INCREF(__pyx_kp_s_Timed_out);
+  __Pyx_GIVEREF(__pyx_kp_s_Timed_out);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_kp_s_Timed_out)) __PYX_ERR(8, 22, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_2)) __PYX_ERR(8, 22, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler), __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 22, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_XGOTREF((PyObject *)__pyx_v_7_cython_6cygrpc__WATCH_CONNECTIVITY_FAILURE_HANDLER);
+  __Pyx_DECREF_SET(__pyx_v_7_cython_6cygrpc__WATCH_CONNECTIVITY_FAILURE_HANDLER, ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_t_2));
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":61
+ *         return f"<{class_name} {id_}>"
+ * 
+ *     def check_connectivity_state(self, bint try_to_connect):             # <<<<<<<<<<<<<<
+ *         """A Cython wrapper for Core's check connectivity state API."""
+ *         if self._status == AIO_CHANNEL_STATUS_DESTROYED:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10AioChannel_7check_connectivity_state, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioChannel_check_connectivity_st, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__471)); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 61, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioChannel, __pyx_n_s_check_connectivity_state, __pyx_t_2) < 0) __PYX_ERR(8, 61, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioChannel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":71
+ *             )
+ * 
+ *     async def watch_connectivity_state(self,             # <<<<<<<<<<<<<<
+ *                                        grpc_connectivity_state last_observed_state,
+ *                                        object deadline):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10AioChannel_9watch_connectivity_state, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioChannel_watch_connectivity_st, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__72)); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 71, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioChannel, __pyx_n_s_watch_connectivity_state, __pyx_t_2) < 0) __PYX_ERR(8, 71, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioChannel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":103
+ *             return True
+ * 
+ *     def closing(self):             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10AioChannel_12closing, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioChannel_closing, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__473)); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 103, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioChannel, __pyx_n_s_closing, __pyx_t_2) < 0) __PYX_ERR(8, 103, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioChannel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":106
+ *         self._status = AIO_CHANNEL_STATUS_CLOSING
+ * 
+ *     def close(self):             # <<<<<<<<<<<<<<
+ *         self._status = AIO_CHANNEL_STATUS_DESTROYED
+ *         grpc_channel_destroy(self.channel)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10AioChannel_14close, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioChannel_close, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__474)); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 106, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioChannel, __pyx_n_s_close, __pyx_t_2) < 0) __PYX_ERR(8, 106, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioChannel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":110
+ *         grpc_channel_destroy(self.channel)
+ * 
+ *     def closed(self):             # <<<<<<<<<<<<<<
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10AioChannel_16closed, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioChannel_closed, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__475)); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 110, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioChannel, __pyx_n_s_closed, __pyx_t_2) < 0) __PYX_ERR(8, 110, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioChannel);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi":113
+ *         return self._status in (AIO_CHANNEL_STATUS_CLOSING, AIO_CHANNEL_STATUS_DESTROYED)
+ * 
+ *     def call(self,             # <<<<<<<<<<<<<<
+ *              bytes method,
+ *              object deadline,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10AioChannel_18call, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioChannel_call, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__477)); if (unlikely(!__pyx_t_2)) __PYX_ERR(8, 113, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioChannel, __pyx_n_s_call, __pyx_t_2) < 0) __PYX_ERR(8, 113, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioChannel);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10AioChannel_20__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioChannel___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__478)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_10AioChannel_22__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioChannel___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__479)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":16
+ * 
+ * 
+ * import inspect             # <<<<<<<<<<<<<<
+ * import traceback
+ * import functools
+ */
+  __pyx_t_2 = __Pyx_patch_inspect(__Pyx_ImportDottedModule(__pyx_n_s_inspect, NULL)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_inspect, __pyx_t_2) < 0) __PYX_ERR(9, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":17
+ * 
+ * import inspect
+ * import traceback             # <<<<<<<<<<<<<<
+ * import functools
+ * 
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_traceback, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 17, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_traceback, __pyx_t_2) < 0) __PYX_ERR(9, 17, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":18
+ * import inspect
+ * import traceback
+ * import functools             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_functools, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 18, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_functools, __pyx_t_2) < 0) __PYX_ERR(9, 18, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":21
+ * 
+ * 
+ * cdef int _EMPTY_FLAG = 0             # <<<<<<<<<<<<<<
+ * cdef str _RPC_FINISHED_DETAILS = 'RPC already finished.'
+ * cdef str _SERVER_STOPPED_DETAILS = 'Server already stopped.'
+ */
+  __pyx_v_7_cython_6cygrpc__EMPTY_FLAG = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":22
+ * 
+ * cdef int _EMPTY_FLAG = 0
+ * cdef str _RPC_FINISHED_DETAILS = 'RPC already finished.'             # <<<<<<<<<<<<<<
+ * cdef str _SERVER_STOPPED_DETAILS = 'Server already stopped.'
+ * 
+ */
+  __Pyx_INCREF(__pyx_kp_s_RPC_already_finished);
+  __Pyx_XGOTREF(__pyx_v_7_cython_6cygrpc__RPC_FINISHED_DETAILS);
+  __Pyx_DECREF_SET(__pyx_v_7_cython_6cygrpc__RPC_FINISHED_DETAILS, __pyx_kp_s_RPC_already_finished);
+  __Pyx_GIVEREF(__pyx_kp_s_RPC_already_finished);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":23
+ * cdef int _EMPTY_FLAG = 0
+ * cdef str _RPC_FINISHED_DETAILS = 'RPC already finished.'
+ * cdef str _SERVER_STOPPED_DETAILS = 'Server already stopped.'             # <<<<<<<<<<<<<<
+ * 
+ * cdef _augment_metadata(tuple metadata, object compression):
+ */
+  __Pyx_INCREF(__pyx_kp_s_Server_already_stopped);
+  __Pyx_XGOTREF(__pyx_v_7_cython_6cygrpc__SERVER_STOPPED_DETAILS);
+  __Pyx_DECREF_SET(__pyx_v_7_cython_6cygrpc__SERVER_STOPPED_DETAILS, __pyx_kp_s_Server_already_stopped);
+  __Pyx_GIVEREF(__pyx_kp_s_Server_already_stopped);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19_HandlerCallDetails_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HandlerCallDetails___reduce_cyt, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__480)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_19_HandlerCallDetails_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HandlerCallDetails___setstate_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__481)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":41
+ * 
+ * 
+ * class _ServerStoppedError(BaseError):             # <<<<<<<<<<<<<<
+ *     """Raised if the server is stopped."""
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_BaseError); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2)) __PYX_ERR(9, 41, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PEP560_update_bases(__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __Pyx_CalculateMetaclass(NULL, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_6 = __Pyx_Py3MetaclassPrepare(__pyx_t_9, __pyx_t_2, __pyx_n_s_ServerStoppedError, __pyx_n_s_ServerStoppedError, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, __pyx_kp_s_Raised_if_the_server_is_stopped); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  if (__pyx_t_2 != __pyx_t_7) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_6, "__orig_bases__", __pyx_t_7) < 0))) __PYX_ERR(9, 41, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __pyx_t_7 = __Pyx_Py3ClassCreate(__pyx_t_9, __pyx_n_s_ServerStoppedError, __pyx_t_2, __pyx_t_6, NULL, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 41, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ServerStoppedError, __pyx_t_7) < 0) __PYX_ERR(9, 41, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8RPCState_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RPCState___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__482)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_8RPCState_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RPCState___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__483)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":127
+ *         self._loop = loop
+ * 
+ *     async def read(self):             # <<<<<<<<<<<<<<
+ *         cdef bytes raw_message
+ *         self._rpc_state.raise_for_termination()
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_3read, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_ServicerContext_read, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__73)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 127, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_read, __pyx_t_2) < 0) __PYX_ERR(9, 127, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":140
+ *                             raw_message)
+ * 
+ *     async def write(self, object message):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_6write, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_ServicerContext_write, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__74)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 140, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_write, __pyx_t_2) < 0) __PYX_ERR(9, 140, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":150
+ *         self._rpc_state.metadata_sent = True
+ * 
+ *     async def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.raise_for_termination()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_9send_initial_metadata, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_ServicerContext_send_initial_me, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__75)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 150, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_send_initial_metadata_2, __pyx_t_2) < 0) __PYX_ERR(9, 150, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":167
+ *               object code,
+ *               str details='',
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.abort_exception is not None:
+ *             raise UsageError('Abort already called!')
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(9, 167, __pyx_L1_error)
+  __pyx_k__76 = ((PyObject*)__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":164
+ *             self._rpc_state.metadata_sent = True
+ * 
+ *     async def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 167, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":167
+ *               object code,
+ *               str details='',
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.abort_exception is not None:
+ *             raise UsageError('Abort already called!')
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(9, 167, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":164
+ *             self._rpc_state.metadata_sent = True
+ * 
+ *     async def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+  __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 164, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_INCREF(__pyx_kp_s__7);
+  __Pyx_GIVEREF(__pyx_kp_s__7);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_kp_s__7)) __PYX_ERR(9, 164, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_2)) __PYX_ERR(9, 164, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_12abort, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_ServicerContext_abort, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__77)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 164, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_9);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_abort, __pyx_t_2) < 0) __PYX_ERR(9, 164, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":203
+ *             raise self._rpc_state.abort_exception
+ * 
+ *     async def abort_with_status(self, object status):             # <<<<<<<<<<<<<<
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_15abort_with_status, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_ServicerContext_abort_with_stat, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__78)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 203, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_abort_with_status, __pyx_t_2) < 0) __PYX_ERR(9, 203, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":206
+ *         await self.abort(status.code, status.details, status.trailing_metadata)
+ * 
+ *     def set_trailing_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         raise_if_not_valid_trailing_metadata(metadata)
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_18set_trailing_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_set_trailing_me, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__488)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 206, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_set_trailing_metadata, __pyx_t_2) < 0) __PYX_ERR(9, 206, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":210
+ *         self._rpc_state.trailing_metadata = tuple(metadata)
+ * 
+ *     def trailing_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.trailing_metadata
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_20trailing_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_trailing_metada, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__489)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 210, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_trailing_metadata, __pyx_t_2) < 0) __PYX_ERR(9, 210, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":213
+ *         return self._rpc_state.trailing_metadata
+ * 
+ *     def invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.invocation_metadata()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_22invocation_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_invocation_meta, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__490)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 213, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_invocation_metadata, __pyx_t_2) < 0) __PYX_ERR(9, 213, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":216
+ *         return self._rpc_state.invocation_metadata()
+ * 
+ *     def set_code(self, object code):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.status_code = get_status_code(code)
+ *         self._rpc_state.py_status_code = code
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_24set_code, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_set_code, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__492)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 216, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_set_code, __pyx_t_2) < 0) __PYX_ERR(9, 216, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":220
+ *         self._rpc_state.py_status_code = code
+ * 
+ *     def code(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.py_status_code
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_26code, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_code, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__493)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 220, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_code, __pyx_t_2) < 0) __PYX_ERR(9, 220, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":223
+ *         return self._rpc_state.py_status_code
+ * 
+ *     def set_details(self, str details):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.status_details = details
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_28set_details, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_set_details, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__495)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 223, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_set_details, __pyx_t_2) < 0) __PYX_ERR(9, 223, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":226
+ *         self._rpc_state.status_details = details
+ * 
+ *     def details(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_details
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_30details, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_details, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__496)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 226, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_details, __pyx_t_2) < 0) __PYX_ERR(9, 226, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":229
+ *         return self._rpc_state.status_details
+ * 
+ *     def set_compression(self, object compression):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.metadata_sent:
+ *             raise RuntimeError('Compression setting must be specified before sending initial metadata')
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_32set_compression, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_set_compression, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__498)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 229, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_set_compression, __pyx_t_2) < 0) __PYX_ERR(9, 229, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":235
+ *             self._rpc_state.compression_algorithm = compression
+ * 
+ *     def disable_next_message_compression(self):             # <<<<<<<<<<<<<<
+ *         self._rpc_state.disable_next_compression = True
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_34disable_next_message_compression, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_disable_next_me, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__499)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 235, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_disable_next_message_compression, __pyx_t_2) < 0) __PYX_ERR(9, 235, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":238
+ *         self._rpc_state.disable_next_compression = True
+ * 
+ *     def peer(self):             # <<<<<<<<<<<<<<
+ *         cdef char *c_peer = NULL
+ *         c_peer = grpc_call_get_peer(self._rpc_state.call)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_36peer, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_peer, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__501)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 238, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_peer, __pyx_t_2) < 0) __PYX_ERR(9, 238, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":245
+ *         return peer
+ * 
+ *     def peer_identities(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_38peer_identities, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_peer_identities, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__503)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 245, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_peer_identities, __pyx_t_2) < 0) __PYX_ERR(9, 245, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":252
+ *         return identities
+ * 
+ *     def peer_identity_key(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_40peer_identity_key, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_peer_identity_k, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__505)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 252, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_peer_identity_key, __pyx_t_2) < 0) __PYX_ERR(9, 252, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":262
+ *             return None
+ * 
+ *     def auth_context(self):             # <<<<<<<<<<<<<<
+ *         cdef Call query_call = Call()
+ *         query_call.c_call = self._rpc_state.call
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_42auth_context, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_auth_context, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__507)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 262, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_auth_context, __pyx_t_2) < 0) __PYX_ERR(9, 262, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":275
+ *             return {}
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         if self._rpc_state.details.deadline.seconds == _GPR_INF_FUTURE.seconds:
+ *             return None
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_44time_remaining, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_time_remaining, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__508)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 275, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_time_remaining, __pyx_t_2) < 0) __PYX_ERR(9, 275, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":281
+ *             return max(_time_from_timespec(self._rpc_state.details.deadline) - time.time(), 0)
+ * 
+ *     def add_done_callback(self, callback):             # <<<<<<<<<<<<<<
+ *         cb = functools.partial(callback, self)
+ *         self._rpc_state.callbacks.append(cb)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_46add_done_callback, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_add_done_callba, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__510)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 281, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_add_done_callback, __pyx_t_2) < 0) __PYX_ERR(9, 281, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":285
+ *         self._rpc_state.callbacks.append(cb)
+ * 
+ *     def done(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_sent
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_48done, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_done, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__511)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 285, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_done, __pyx_t_2) < 0) __PYX_ERR(9, 285, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":288
+ *         return self._rpc_state.status_sent
+ * 
+ *     def cancelled(self):             # <<<<<<<<<<<<<<
+ *         return self._rpc_state.status_code == StatusCode.cancelled
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_50cancelled, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext_cancelled, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__512)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 288, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ServicerContext, __pyx_n_s_cancelled, __pyx_t_2) < 0) __PYX_ERR(9, 288, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ServicerContext);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_52__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__513)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_ServicerContext_54__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ServicerContext___setstate_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__514)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":304
+ *               object code,
+ *               str details='',
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):             # <<<<<<<<<<<<<<
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.abort(code, details, trailing_metadata),
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 304, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(9, 304, __pyx_L1_error)
+  __pyx_k__80 = ((PyObject*)__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":301
+ *         self._loop = context._loop
+ * 
+ *     def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_IMMUTABLE_EMPTY_METADATA); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 304, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":304
+ *               object code,
+ *               str details='',
+ *               tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA):             # <<<<<<<<<<<<<<
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.abort(code, details, trailing_metadata),
+ */
+  if (!(likely(PyTuple_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_t_2))) __PYX_ERR(9, 304, __pyx_L1_error)
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":301
+ *         self._loop = context._loop
+ * 
+ *     def abort(self,             # <<<<<<<<<<<<<<
+ *               object code,
+ *               str details='',
+ */
+  __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 301, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_INCREF(__pyx_kp_s__7);
+  __Pyx_GIVEREF(__pyx_kp_s__7);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_kp_s__7)) __PYX_ERR(9, 301, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_2);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_2)) __PYX_ERR(9, 301, __pyx_L1_error);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_3abort, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_abort, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__516)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 301, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_t_9);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_abort, __pyx_t_2) < 0) __PYX_ERR(9, 301, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":311
+ *         future.exception()
+ * 
+ *     def send_initial_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         future = asyncio.run_coroutine_threadsafe(
+ *             self._context.send_initial_metadata(metadata),
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_5send_initial_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_send_initia, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__518)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_send_initial_metadata_2, __pyx_t_2) < 0) __PYX_ERR(9, 311, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":317
+ *         future.result()
+ * 
+ *     def set_trailing_metadata(self, object metadata):             # <<<<<<<<<<<<<<
+ *         self._context.set_trailing_metadata(metadata)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_7set_trailing_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_set_trailin, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__519)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 317, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_set_trailing_metadata, __pyx_t_2) < 0) __PYX_ERR(9, 317, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":320
+ *         self._context.set_trailing_metadata(metadata)
+ * 
+ *     def invocation_metadata(self):             # <<<<<<<<<<<<<<
+ *         return self._context.invocation_metadata()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_9invocation_metadata, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_invocation, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__520)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 320, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_invocation_metadata, __pyx_t_2) < 0) __PYX_ERR(9, 320, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":323
+ *         return self._context.invocation_metadata()
+ * 
+ *     def set_code(self, object code):             # <<<<<<<<<<<<<<
+ *         self._context.set_code(code)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_11set_code, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_set_code, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__521)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_set_code, __pyx_t_2) < 0) __PYX_ERR(9, 323, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":326
+ *         self._context.set_code(code)
+ * 
+ *     def set_details(self, str details):             # <<<<<<<<<<<<<<
+ *         self._context.set_details(details)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_13set_details, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_set_details, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__522)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_set_details, __pyx_t_2) < 0) __PYX_ERR(9, 326, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":329
+ *         self._context.set_details(details)
+ * 
+ *     def set_compression(self, object compression):             # <<<<<<<<<<<<<<
+ *         self._context.set_compression(compression)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_15set_compression, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_set_compres, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__523)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 329, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_set_compression, __pyx_t_2) < 0) __PYX_ERR(9, 329, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":332
+ *         self._context.set_compression(compression)
+ * 
+ *     def disable_next_message_compression(self):             # <<<<<<<<<<<<<<
+ *         self._context.disable_next_message_compression()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_17disable_next_message_compression, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_disable_nex, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__524)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 332, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_disable_next_message_compression, __pyx_t_2) < 0) __PYX_ERR(9, 332, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":335
+ *         self._context.disable_next_message_compression()
+ * 
+ *     def add_callback(self, object callback):             # <<<<<<<<<<<<<<
+ *         self._callbacks.append(callback)
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_19add_callback, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_add_callbac, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__525)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 335, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_add_callback, __pyx_t_2) < 0) __PYX_ERR(9, 335, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":338
+ *         self._callbacks.append(callback)
+ * 
+ *     def peer(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_21peer, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_peer, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__526)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 338, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_peer, __pyx_t_2) < 0) __PYX_ERR(9, 338, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":341
+ *         return self._context.peer()
+ * 
+ *     def peer_identities(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer_identities()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_23peer_identities, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_peer_identi, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__527)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_peer_identities, __pyx_t_2) < 0) __PYX_ERR(9, 341, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":344
+ *         return self._context.peer_identities()
+ * 
+ *     def peer_identity_key(self):             # <<<<<<<<<<<<<<
+ *         return self._context.peer_identity_key()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_25peer_identity_key, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_peer_identi_2, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__528)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 344, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_peer_identity_key, __pyx_t_2) < 0) __PYX_ERR(9, 344, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":347
+ *         return self._context.peer_identity_key()
+ * 
+ *     def auth_context(self):             # <<<<<<<<<<<<<<
+ *         return self._context.auth_context()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_27auth_context, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_auth_contex, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__529)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 347, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_auth_context, __pyx_t_2) < 0) __PYX_ERR(9, 347, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":350
+ *         return self._context.auth_context()
+ * 
+ *     def time_remaining(self):             # <<<<<<<<<<<<<<
+ *         return self._context.time_remaining()
+ * 
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_29time_remaining, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext_time_remain, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__530)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 350, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__SyncServicerContext, __pyx_n_s_time_remaining, __pyx_t_2) < 0) __PYX_ERR(9, 350, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__SyncServicerContext);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_31__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext___reduce_cy, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__531)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_20_SyncServicerContext_33__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_SyncServicerContext___setstate, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__532)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":354
+ * 
+ * 
+ * async def _run_interceptor(object interceptors, object query_handler,             # <<<<<<<<<<<<<<
+ *                            object handler_call_details):
+ *     interceptor = next(interceptors, None)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_151_run_interceptor, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_run_interceptor, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__81)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_run_interceptor, __pyx_t_2) < 0) __PYX_ERR(9, 354, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":365
+ * 
+ * 
+ * def _is_async_handler(object handler):             # <<<<<<<<<<<<<<
+ *     """Inspect if a method handler is async or sync."""
+ *     return inspect.isawaitable(handler) or inspect.iscoroutinefunction(handler) or inspect.isasyncgenfunction(handler)
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_154_is_async_handler, 0, __pyx_n_s_is_async_handler, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__535)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 365, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_async_handler, __pyx_t_2) < 0) __PYX_ERR(9, 365, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":370
+ * 
+ * 
+ * async def _find_method_handler(str method, tuple metadata, list generic_handlers,             # <<<<<<<<<<<<<<
+ *                           tuple interceptors):
+ *     def query_handlers(handler_call_details):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_156_find_method_handler, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_find_method_handler, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__82)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 370, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_find_method_handler, __pyx_t_2) < 0) __PYX_ERR(9, 370, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":389
+ * 
+ * 
+ * async def _finish_handler_with_unary_response(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                               object unary_handler,
+ *                                               object request,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_159_finish_handler_with_unary_response, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_finish_handler_with_unary_respo, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__85)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 389, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_finish_handler_with_unary_respo, __pyx_t_2) < 0) __PYX_ERR(9, 389, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":460
+ * 
+ * 
+ * async def _finish_handler_with_stream_responses(RPCState rpc_state,             # <<<<<<<<<<<<<<
+ *                                                 object stream_handler,
+ *                                                 object request,
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_162_finish_handler_with_stream_responses, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_finish_handler_with_stream_resp, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__86)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 460, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_finish_handler_with_stream_resp, __pyx_t_2) < 0) __PYX_ERR(9, 460, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":530
+ * 
+ * 
+ * async def _handle_unary_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                   RPCState rpc_state,
+ *                                   object loop):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_165_handle_unary_unary_rpc, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_handle_unary_unary_rpc, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__87)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 530, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_unary_unary_rpc, __pyx_t_2) < 0) __PYX_ERR(9, 530, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":564
+ * 
+ * 
+ * async def _handle_unary_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_168_handle_unary_stream_rpc, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_handle_unary_stream_rpc, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__88)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 564, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_unary_stream_rpc, __pyx_t_2) < 0) __PYX_ERR(9, 564, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":603
+ *         self._agen = None
+ * 
+ *     async def _async_message_receiver(self):             # <<<<<<<<<<<<<<
+ *         """An async generator that receives messages."""
+ *         cdef object message
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_MessageReceiver_3_async_message_receiver, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_MessageReceiver__async_message, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__89)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 603, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__MessageReceiver, __pyx_n_s_async_message_receiver, __pyx_t_2) < 0) __PYX_ERR(9, 603, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__MessageReceiver);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_MessageReceiver_11__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_MessageReceiver___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__540)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_16_MessageReceiver_13__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_MessageReceiver___setstate_cyth, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__541)); if (unlikely(!__pyx_t_2)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":623
+ * 
+ * 
+ * async def _handle_stream_unary_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                    RPCState rpc_state,
+ *                                    object loop):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_171_handle_stream_unary_rpc, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_handle_stream_unary_rpc, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__90)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 623, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_stream_unary_rpc, __pyx_t_2) < 0) __PYX_ERR(9, 623, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":655
+ * 
+ * 
+ * async def _handle_stream_stream_rpc(object method_handler,             # <<<<<<<<<<<<<<
+ *                                     RPCState rpc_state,
+ *                                     object loop):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_174_handle_stream_stream_rpc, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_handle_stream_stream_rpc, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__91)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 655, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_stream_stream_rpc, __pyx_t_2) < 0) __PYX_ERR(9, 655, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":686
+ * 
+ * 
+ * async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop):             # <<<<<<<<<<<<<<
+ *     try:
+ *         try:
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_177_handle_exceptions, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_handle_exceptions, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__92)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 686, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_exceptions, __pyx_t_2) < 0) __PYX_ERR(9, 686, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":755
+ * 
+ * 
+ * async def _handle_cancellation_from_core(object rpc_task,             # <<<<<<<<<<<<<<
+ *                                          RPCState rpc_state,
+ *                                          object loop):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_180_handle_cancellation_from_core, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_handle_cancellation_from_core, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__95)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 755, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_cancellation_from_core, __pyx_t_2) < 0) __PYX_ERR(9, 755, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":772
+ * 
+ * 
+ * async def _schedule_rpc_coro(object rpc_coro,             # <<<<<<<<<<<<<<
+ *                              RPCState rpc_state,
+ *                              object loop):
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_183_schedule_rpc_coro, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_schedule_rpc_coro, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__96)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 772, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_schedule_rpc_coro, __pyx_t_2) < 0) __PYX_ERR(9, 772, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":785
+ * 
+ * 
+ * async def _handle_rpc(list generic_handlers, tuple interceptors,             # <<<<<<<<<<<<<<
+ *                       RPCState rpc_state, object loop, bint concurrency_exceeded):
+ *     cdef object method_handler
+ */
+  __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_186_handle_rpc, __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_handle_rpc, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__97)); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 785, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_handle_rpc, __pyx_t_2) < 0) __PYX_ERR(9, 785, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":848
+ * 
+ * 
+ * class _RequestCallError(Exception): pass             # <<<<<<<<<<<<<<
+ * 
+ * cdef CallbackFailureHandler REQUEST_CALL_FAILURE_HANDLER = CallbackFailureHandler(
+ */
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 848, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]));
+  __Pyx_GIVEREF((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]));
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])))) __PYX_ERR(9, 848, __pyx_L1_error);
+  __pyx_t_9 = __Pyx_PEP560_update_bases(__pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 848, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_6 = __Pyx_CalculateMetaclass(NULL, __pyx_t_9); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 848, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = __Pyx_Py3MetaclassPrepare(__pyx_t_6, __pyx_t_9, __pyx_n_s_RequestCallError, __pyx_n_s_RequestCallError, (PyObject *) NULL, __pyx_n_s_cython_cygrpc, (PyObject *) NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(9, 848, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_7);
+  if (__pyx_t_9 != __pyx_t_2) {
+    if (unlikely((PyDict_SetItemString(__pyx_t_7, "__orig_bases__", __pyx_t_2) < 0))) __PYX_ERR(9, 848, __pyx_L1_error)
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_Py3ClassCreate(__pyx_t_6, __pyx_n_s_RequestCallError, __pyx_t_9, __pyx_t_7, NULL, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(9, 848, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_RequestCallError, __pyx_t_2) < 0) __PYX_ERR(9, 848, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":851
+ * 
+ * cdef CallbackFailureHandler REQUEST_CALL_FAILURE_HANDLER = CallbackFailureHandler(
+ *     'grpc_server_request_call', None, _RequestCallError)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_RequestCallError); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 851, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":850
+ * class _RequestCallError(Exception): pass
+ * 
+ * cdef CallbackFailureHandler REQUEST_CALL_FAILURE_HANDLER = CallbackFailureHandler(             # <<<<<<<<<<<<<<
+ *     'grpc_server_request_call', None, _RequestCallError)
+ * 
+ */
+  __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 850, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_n_s_grpc_server_request_call);
+  __Pyx_GIVEREF(__pyx_n_s_grpc_server_request_call);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_n_s_grpc_server_request_call)) __PYX_ERR(9, 850, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, Py_None)) __PYX_ERR(9, 850, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_9);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_9)) __PYX_ERR(9, 850, __pyx_L1_error);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler), __pyx_t_6, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 850, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_XGOTREF((PyObject *)__pyx_v_7_cython_6cygrpc_REQUEST_CALL_FAILURE_HANDLER);
+  __Pyx_DECREF_SET(__pyx_v_7_cython_6cygrpc_REQUEST_CALL_FAILURE_HANDLER, ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_t_9));
+  __Pyx_GIVEREF(__pyx_t_9);
+  __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":857
+ *     'grpc_server_shutdown_and_notify',
+ *     None,
+ *     InternalError)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_InternalError); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 857, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":854
+ * 
+ * 
+ * cdef CallbackFailureHandler SERVER_SHUTDOWN_FAILURE_HANDLER = CallbackFailureHandler(             # <<<<<<<<<<<<<<
+ *     'grpc_server_shutdown_and_notify',
+ *     None,
+ */
+  __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(9, 854, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_n_s_grpc_server_shutdown_and_notify);
+  __Pyx_GIVEREF(__pyx_n_s_grpc_server_shutdown_and_notify);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_n_s_grpc_server_shutdown_and_notify)) __PYX_ERR(9, 854, __pyx_L1_error);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, Py_None)) __PYX_ERR(9, 854, __pyx_L1_error);
+  __Pyx_GIVEREF(__pyx_t_9);
+  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_9)) __PYX_ERR(9, 854, __pyx_L1_error);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7_cython_6cygrpc_CallbackFailureHandler), __pyx_t_6, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 854, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_XGOTREF((PyObject *)__pyx_v_7_cython_6cygrpc_SERVER_SHUTDOWN_FAILURE_HANDLER);
+  __Pyx_DECREF_SET(__pyx_v_7_cython_6cygrpc_SERVER_SHUTDOWN_FAILURE_HANDLER, ((struct __pyx_obj_7_cython_6cygrpc_CallbackFailureHandler *)__pyx_t_9));
+  __Pyx_GIVEREF(__pyx_t_9);
+  __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":869
+ *         self.limiter_concurrency_exceeded = False
+ * 
+ *     def check_before_request_call(self):             # <<<<<<<<<<<<<<
+ *         if self._active_rpcs >= self._maximum_concurrent_rpcs:
+ *             self.limiter_concurrency_exceeded = True
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_3check_before_request_call, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConcurrentRpcLimiter_check_befo, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__547)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 869, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter, __pyx_n_s_check_before_request_call, __pyx_t_9) < 0) __PYX_ERR(9, 869, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":875
+ *             self._active_rpcs += 1
+ * 
+ *     def _decrease_active_rpcs_count(self, unused_future):             # <<<<<<<<<<<<<<
+ *         self._active_rpcs -= 1
+ *         if self._active_rpcs < self._maximum_concurrent_rpcs:
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_5_decrease_active_rpcs_count, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConcurrentRpcLimiter__decrease, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__549)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 875, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter, __pyx_n_s_decrease_active_rpcs_count, __pyx_t_9) < 0) __PYX_ERR(9, 875, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":880
+ *             self.limiter_concurrency_exceeded = False
+ * 
+ *     def decrease_once_finished(self, object rpc_task):             # <<<<<<<<<<<<<<
+ *         rpc_task.add_done_callback(self._decrease_active_rpcs_count)
+ * 
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_7decrease_once_finished, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConcurrentRpcLimiter_decrease_o, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__551)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 880, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter, __pyx_n_s_decrease_once_finished, __pyx_t_9) < 0) __PYX_ERR(9, 880, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc__ConcurrentRpcLimiter);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_9__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConcurrentRpcLimiter___reduce_c, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__552)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_9) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "(tree fragment)":3
+ * def __reduce_cython__(self):
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     raise TypeError, "no default __reduce__ due to non-trivial __cinit__"
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_21_ConcurrentRpcLimiter_11__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_ConcurrentRpcLimiter___setstate, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__553)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_9) < 0) __PYX_ERR(10, 3, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":922
+ *             self._limiter = _ConcurrentRpcLimiter(maximum_concurrent_rpcs)
+ * 
+ *     def add_generic_rpc_handlers(self, object generic_rpc_handlers):             # <<<<<<<<<<<<<<
+ *         self._generic_handlers.extend(generic_rpc_handlers)
+ * 
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_3add_generic_rpc_handlers, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioServer_add_generic_rpc_handle, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__555)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 922, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_add_generic_rpc_handlers, __pyx_t_9) < 0) __PYX_ERR(9, 922, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":925
+ *         self._generic_handlers.extend(generic_rpc_handlers)
+ * 
+ *     def add_insecure_port(self, address):             # <<<<<<<<<<<<<<
+ *         return self._server.add_http2_port(address)
+ * 
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_5add_insecure_port, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioServer_add_insecure_port, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__557)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 925, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_add_insecure_port, __pyx_t_9) < 0) __PYX_ERR(9, 925, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":928
+ *         return self._server.add_http2_port(address)
+ * 
+ *     def add_secure_port(self, address, server_credentials):             # <<<<<<<<<<<<<<
+ *         return self._server.add_http2_port(address,
+ *                                            server_credentials._credentials)
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_7add_secure_port, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioServer_add_secure_port, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__559)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 928, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_add_secure_port, __pyx_t_9) < 0) __PYX_ERR(9, 928, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":932
+ *                                            server_credentials._credentials)
+ * 
+ *     async def _request_call(self):             # <<<<<<<<<<<<<<
+ *         cdef grpc_call_error error
+ *         cdef RPCState rpc_state = RPCState(self)
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_9_request_call, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioServer__request_call, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__99)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 932, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_request_call, __pyx_t_9) < 0) __PYX_ERR(9, 932, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":952
+ *         return rpc_state
+ * 
+ *     async def _server_main_loop(self,             # <<<<<<<<<<<<<<
+ *                                 object server_started):
+ *         self._server.start(backup_queue=False)
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_12_server_main_loop, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioServer__server_main_loop, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__100)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 952, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_server_main_loop, __pyx_t_9) < 0) __PYX_ERR(9, 952, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":994
+ *                 self._limiter.decrease_once_finished(rpc_task)
+ * 
+ *     def _serving_task_crash_handler(self, object task):             # <<<<<<<<<<<<<<
+ *         """Shutdown the server immediately if unexpectedly exited."""
+ *         if task.cancelled():
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_15_serving_task_crash_handler, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioServer__serving_task_crash_ha, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__563)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 994, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_serving_task_crash_handler, __pyx_t_9) < 0) __PYX_ERR(9, 994, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1005
+ *             self._loop.create_task(self.shutdown(None))
+ * 
+ *     async def start(self):             # <<<<<<<<<<<<<<
+ *         if self._status == AIO_SERVER_STATUS_RUNNING:
+ *             return
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_17start, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioServer_start, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__101)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 1005, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_start, __pyx_t_9) < 0) __PYX_ERR(9, 1005, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1019
+ *         await server_started
+ * 
+ *     async def _start_shutting_down(self):             # <<<<<<<<<<<<<<
+ *         """Prepares the server to shutting down.
+ * 
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_20_start_shutting_down, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioServer__start_shutting_down, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__102)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 1019, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_start_shutting_down, __pyx_t_9) < 0) __PYX_ERR(9, 1019, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1036
+ *             pass
+ * 
+ *     async def shutdown(self, grace):             # <<<<<<<<<<<<<<
+ *         """Gracefully shutdown the Core server.
+ * 
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_23shutdown, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioServer_shutdown, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__103)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 1036, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_shutdown, __pyx_t_9) < 0) __PYX_ERR(9, 1036, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1076
+ *                 self._status = AIO_SERVER_STATUS_STOPPED
+ * 
+ *     async def wait_for_termination(self, object timeout):             # <<<<<<<<<<<<<<
+ *         if timeout is None:
+ *             await self._shutdown_completed
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_26wait_for_termination, __Pyx_CYFUNCTION_CCLASS | __Pyx_CYFUNCTION_COROUTINE, __pyx_n_s_AioServer_wait_for_termination, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__104)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 1076, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_wait_for_termination, __pyx_t_9) < 0) __PYX_ERR(9, 1076, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi":1109
+ *         return self._thread_pool
+ * 
+ *     def is_running(self):             # <<<<<<<<<<<<<<
+ *         return self._status == AIO_SERVER_STATUS_RUNNING
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_31is_running, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioServer_is_running, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__567)); if (unlikely(!__pyx_t_9)) __PYX_ERR(9, 1109, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_is_running, __pyx_t_9) < 0) __PYX_ERR(9, 1109, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "(tree fragment)":1
+ * def __reduce_cython__(self):             # <<<<<<<<<<<<<<
+ *     cdef tuple state
+ *     cdef object _dict
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_33__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioServer___reduce_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__568)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_reduce_cython, __pyx_t_9) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "(tree fragment)":16
+ *     else:
+ *         return __pyx_unpickle_AioServer, (type(self), 0xa3b308d, state)
+ * def __setstate_cython__(self, __pyx_state):             # <<<<<<<<<<<<<<
+ *     __pyx_unpickle_AioServer__set_state(self, __pyx_state)
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_9AioServer_35__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_AioServer___setstate_cython, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__569)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7_cython_6cygrpc_AioServer, __pyx_n_s_setstate_cython, __pyx_t_9) < 0) __PYX_ERR(10, 16, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  PyType_Modified(__pyx_ptype_7_cython_6cygrpc_AioServer);
+
+  /* "_cython/cygrpc.pyx":88
+ * 
+ * 
+ * _initialize()             # <<<<<<<<<<<<<<
+ */
+  __pyx_t_9 = __pyx_f_7_cython_6cygrpc__initialize(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 88, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle_ChannelCredentials(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_189__pyx_unpickle_ChannelCredentials, 0, __pyx_n_s_pyx_unpickle_ChannelCredential, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__571)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_ChannelCredential, __pyx_t_9) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "(tree fragment)":11
+ *         __pyx_unpickle_ChannelCredentials__set_state(<ChannelCredentials> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle_ChannelCredentials__set_state(ChannelCredentials __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_191__pyx_unpickle_InsecureChannelCredentials, 0, __pyx_n_s_pyx_unpickle_InsecureChannelCr, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__572)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_InsecureChannelCr, __pyx_t_9) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle__Tag(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_193__pyx_unpickle__Tag, 0, __pyx_n_s_pyx_unpickle__Tag, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__573)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle__Tag, __pyx_t_9) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "(tree fragment)":11
+ *         __pyx_unpickle__Tag__set_state(<_Tag> __pyx_result, __pyx_state)
+ *     return __pyx_result
+ * cdef __pyx_unpickle__Tag__set_state(_Tag __pyx_result, tuple __pyx_state):             # <<<<<<<<<<<<<<
+ *     if len(__pyx_state) > 0 and hasattr(__pyx_result, '__dict__'):
+ *         __pyx_result.__dict__.update(__pyx_state[0])
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_195__pyx_unpickle_CensusContext, 0, __pyx_n_s_pyx_unpickle_CensusContext, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__574)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_CensusContext, __pyx_t_9) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "(tree fragment)":1
+ * def __pyx_unpickle_AioServer(__pyx_type, long __pyx_checksum, __pyx_state):             # <<<<<<<<<<<<<<
+ *     cdef object __pyx_PickleError
+ *     cdef object __pyx_result
+ */
+  __pyx_t_9 = __Pyx_CyFunction_New(&__pyx_mdef_7_cython_6cygrpc_197__pyx_unpickle_AioServer, 0, __pyx_n_s_pyx_unpickle_AioServer, NULL, __pyx_n_s_cython_cygrpc, __pyx_d, ((PyObject *)__pyx_codeobj__575)); if (unlikely(!__pyx_t_9)) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_AioServer, __pyx_t_9) < 0) __PYX_ERR(10, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /* "_cython/cygrpc.pyx":1
+ * # Copyright 2015 gRPC authors.             # <<<<<<<<<<<<<<
+ * #
+ * # Licensed under the Apache License, Version 2.0 (the "License");
+ */
+  __pyx_t_9 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_9) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+
+  /*--- Wrapped vars code ---*/
+
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_9);
+  if (__pyx_m) {
+    if (__pyx_d && stringtab_initialized) {
+      __Pyx_AddTraceback("init _cython.cygrpc", __pyx_clineno, __pyx_lineno, __pyx_filename);
+    }
+    #if !CYTHON_USE_MODULE_STATE
+    Py_CLEAR(__pyx_m);
+    #else
+    Py_DECREF(__pyx_m);
+    if (pystate_addmodule_run) {
+      PyObject *tp, *value, *tb;
+      PyErr_Fetch(&tp, &value, &tb);
+      PyState_RemoveModule(&__pyx_moduledef);
+      PyErr_Restore(tp, value, tb);
+    }
+    #endif
+  } else if (!PyErr_Occurred()) {
+    PyErr_SetString(PyExc_ImportError, "init _cython.cygrpc");
+  }
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+  return (__pyx_m != NULL) ? 0 : -1;
+  #elif PY_MAJOR_VERSION >= 3
+  return __pyx_m;
+  #else
+  return;
+  #endif
+}
+/* #### Code section: cleanup_globals ### */
+/* #### Code section: cleanup_module ### */
+/* #### Code section: main_method ### */
+/* #### Code section: utility_code_pragmas ### */
+#ifdef _MSC_VER
+#pragma warning( push )
+/* Warning 4127: conditional expression is constant
+ * Cython uses constant conditional expressions to allow in inline functions to be optimized at
+ * compile-time, so this warning is not useful
+ */
+#pragma warning( disable : 4127 )
+#endif
+
+
+
+/* #### Code section: utility_code_def ### */
+
+/* --- Runtime support code --- */
+/* Refnanny */
+#if CYTHON_REFNANNY
+static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
+    PyObject *m = NULL, *p = NULL;
+    void *r = NULL;
+    m = PyImport_ImportModule(modname);
+    if (!m) goto end;
+    p = PyObject_GetAttrString(m, "RefNannyAPI");
+    if (!p) goto end;
+    r = PyLong_AsVoidPtr(p);
+end:
+    Py_XDECREF(p);
+    Py_XDECREF(m);
+    return (__Pyx_RefNannyAPIStruct *)r;
+}
+#endif
+
+/* PyErrExceptionMatches */
+#if CYTHON_FAST_THREAD_STATE
+static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
+    Py_ssize_t i, n;
+    n = PyTuple_GET_SIZE(tuple);
+#if PY_MAJOR_VERSION >= 3
+    for (i=0; i<n; i++) {
+        if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
+    }
+#endif
+    for (i=0; i<n; i++) {
+        if (__Pyx_PyErr_GivenExceptionMatches(exc_type, PyTuple_GET_ITEM(tuple, i))) return 1;
+    }
+    return 0;
+}
+static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
+    int result;
+    PyObject *exc_type;
+#if PY_VERSION_HEX >= 0x030C00A6
+    PyObject *current_exception = tstate->current_exception;
+    if (unlikely(!current_exception)) return 0;
+    exc_type = (PyObject*) Py_TYPE(current_exception);
+    if (exc_type == err) return 1;
+#else
+    exc_type = tstate->curexc_type;
+    if (exc_type == err) return 1;
+    if (unlikely(!exc_type)) return 0;
+#endif
+    #if CYTHON_AVOID_BORROWED_REFS
+    Py_INCREF(exc_type);
+    #endif
+    if (unlikely(PyTuple_Check(err))) {
+        result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err);
+    } else {
+        result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err);
+    }
+    #if CYTHON_AVOID_BORROWED_REFS
+    Py_DECREF(exc_type);
+    #endif
+    return result;
+}
+#endif
+
+/* PyErrFetchRestore */
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
+#if PY_VERSION_HEX >= 0x030C00A6
+    PyObject *tmp_value;
+    assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value)));
+    if (value) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb))
+        #endif
+            PyException_SetTraceback(value, tb);
+    }
+    tmp_value = tstate->current_exception;
+    tstate->current_exception = value;
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(type);
+    Py_XDECREF(tb);
+#else
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    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);
+#endif
+}
+static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+#if PY_VERSION_HEX >= 0x030C00A6
+    PyObject* exc_value;
+    exc_value = tstate->current_exception;
+    tstate->current_exception = 0;
+    *value = exc_value;
+    *type = NULL;
+    *tb = NULL;
+    if (exc_value) {
+        *type = (PyObject*) Py_TYPE(exc_value);
+        Py_INCREF(*type);
+        #if CYTHON_COMPILING_IN_CPYTHON
+        *tb = ((PyBaseExceptionObject*) exc_value)->traceback;
+        Py_XINCREF(*tb);
+        #else
+        *tb = PyException_GetTraceback(exc_value);
+        #endif
+    }
+#else
+    *type = tstate->curexc_type;
+    *value = tstate->curexc_value;
+    *tb = tstate->curexc_traceback;
+    tstate->curexc_type = 0;
+    tstate->curexc_value = 0;
+    tstate->curexc_traceback = 0;
+#endif
+}
+#endif
+
+/* PyObjectGetAttrStr */
+#if CYTHON_USE_TYPE_SLOTS
+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);
+}
+#endif
+
+/* PyObjectGetAttrStrNoError */
+#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1
+static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError)))
+        __Pyx_PyErr_Clear();
+}
+#endif
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) {
+    PyObject *result;
+#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1
+    (void) PyObject_GetOptionalAttr(obj, attr_name, &result);
+    return result;
+#else
+#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1
+    PyTypeObject* tp = Py_TYPE(obj);
+    if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) {
+        return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1);
+    }
+#endif
+    result = __Pyx_PyObject_GetAttrStr(obj, attr_name);
+    if (unlikely(!result)) {
+        __Pyx_PyObject_GetAttrStr_ClearAttributeError();
+    }
+    return result;
+#endif
+}
+
+/* GetBuiltinName */
+static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
+    PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name);
+    if (unlikely(!result) && !PyErr_Occurred()) {
+        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;
+}
+
+/* TupleAndListFromArray */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) {
+    PyObject *v;
+    Py_ssize_t i;
+    for (i = 0; i < length; i++) {
+        v = dest[i] = src[i];
+        Py_INCREF(v);
+    }
+}
+static CYTHON_INLINE PyObject *
+__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n)
+{
+    PyObject *res;
+    if (n <= 0) {
+        Py_INCREF(__pyx_empty_tuple);
+        return __pyx_empty_tuple;
+    }
+    res = PyTuple_New(n);
+    if (unlikely(res == NULL)) return NULL;
+    __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n);
+    return res;
+}
+static CYTHON_INLINE PyObject *
+__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n)
+{
+    PyObject *res;
+    if (n <= 0) {
+        return PyList_New(0);
+    }
+    res = PyList_New(n);
+    if (unlikely(res == NULL)) return NULL;
+    __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n);
+    return res;
+}
+#endif
+
+/* BytesEquals */
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
+#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API
+    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;
+#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000)
+            Py_hash_t hash1, hash2;
+            hash1 = ((PyBytesObject*)s1)->ob_shash;
+            hash2 = ((PyBytesObject*)s2)->ob_shash;
+            if (hash1 != hash2 && hash1 != -1 && hash2 != -1) {
+                return (equals == Py_NE);
+            }
+#endif
+            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
+}
+
+/* UnicodeEquals */
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
+#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API
+    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;
+        }
+#if CYTHON_USE_UNICODE_INTERNALS
+        {
+            Py_hash_t hash1, hash2;
+        #if CYTHON_PEP393_ENABLED
+            hash1 = ((PyASCIIObject*)s1)->hash;
+            hash2 = ((PyASCIIObject*)s2)->hash;
+        #else
+            hash1 = ((PyUnicodeObject*)s1)->hash;
+            hash2 = ((PyUnicodeObject*)s2)->hash;
+        #endif
+            if (hash1 != hash2 && hash1 != -1 && hash2 != -1) {
+                goto return_ne;
+            }
+        }
+#endif
+        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_MAJOR_VERSION < 3
+        Py_XDECREF(owned_ref);
+        #endif
+        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
+}
+
+/* fastcall */
+#if CYTHON_METH_FASTCALL
+static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s)
+{
+    Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames);
+    for (i = 0; i < n; i++)
+    {
+        if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i];
+    }
+    for (i = 0; i < n; i++)
+    {
+        int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ);
+        if (unlikely(eq != 0)) {
+            if (unlikely(eq < 0)) return NULL;
+            return kwvalues[i];
+        }
+    }
+    return NULL;
+}
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000
+CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) {
+    Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames);
+    PyObject *dict;
+    dict = PyDict_New();
+    if (unlikely(!dict))
+        return NULL;
+    for (i=0; i<nkwargs; i++) {
+        PyObject *key = PyTuple_GET_ITEM(kwnames, i);
+        if (unlikely(PyDict_SetItem(dict, key, kwvalues[i]) < 0))
+            goto bad;
+    }
+    return dict;
+bad:
+    Py_DECREF(dict);
+    return NULL;
+}
+#endif
+#endif
+
+/* RaiseDoubleKeywords */
+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
+}
+
+/* ParseKeywords */
+static int __Pyx_ParseOptionalKeywords(
+    PyObject *kwds,
+    PyObject *const *kwvalues,
+    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;
+    int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds));
+    while (1) {
+        Py_XDECREF(key); key = NULL;
+        Py_XDECREF(value); value = NULL;
+        if (kwds_is_tuple) {
+            Py_ssize_t size;
+#if CYTHON_ASSUME_SAFE_MACROS
+            size = PyTuple_GET_SIZE(kwds);
+#else
+            size = PyTuple_Size(kwds);
+            if (size < 0) goto bad;
+#endif
+            if (pos >= size) break;
+#if CYTHON_AVOID_BORROWED_REFS
+            key = __Pyx_PySequence_ITEM(kwds, pos);
+            if (!key) goto bad;
+#elif CYTHON_ASSUME_SAFE_MACROS
+            key = PyTuple_GET_ITEM(kwds, pos);
+#else
+            key = PyTuple_GetItem(kwds, pos);
+            if (!key) goto bad;
+#endif
+            value = kwvalues[pos];
+            pos++;
+        }
+        else
+        {
+            if (!PyDict_Next(kwds, &pos, &key, &value)) break;
+#if CYTHON_AVOID_BORROWED_REFS
+            Py_INCREF(key);
+#endif
+        }
+        name = first_kw_arg;
+        while (*name && (**name != key)) name++;
+        if (*name) {
+            values[name-argnames] = value;
+#if CYTHON_AVOID_BORROWED_REFS
+            Py_INCREF(value);
+            Py_DECREF(key);
+#endif
+            key = NULL;
+            value = NULL;
+            continue;
+        }
+#if !CYTHON_AVOID_BORROWED_REFS
+        Py_INCREF(key);
+#endif
+        Py_INCREF(value);
+        name = first_kw_arg;
+        #if PY_MAJOR_VERSION < 3
+        if (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;
+#if CYTHON_AVOID_BORROWED_REFS
+                    value = NULL;
+#endif
+                    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 = (
+                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+                    (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 :
+                #endif
+                    PyUnicode_Compare(**name, key)
+                );
+                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+                if (cmp == 0) {
+                    values[name-argnames] = value;
+#if CYTHON_AVOID_BORROWED_REFS
+                    value = NULL;
+#endif
+                    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
+                        (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(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;
+        }
+    }
+    Py_XDECREF(key);
+    Py_XDECREF(value);
+    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:
+    #if PY_MAJOR_VERSION < 3
+    PyErr_Format(PyExc_TypeError,
+        "%.200s() got an unexpected keyword argument '%.200s'",
+        function_name, PyString_AsString(key));
+    #else
+    PyErr_Format(PyExc_TypeError,
+        "%s() got an unexpected keyword argument '%U'",
+        function_name, key);
+    #endif
+bad:
+    Py_XDECREF(key);
+    Py_XDECREF(value);
+    return -1;
+}
+
+/* RaiseArgTupleInvalid */
+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);
+}
+
+/* ArgTypeTest */
+static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact)
+{
+    __Pyx_TypeName type_name;
+    __Pyx_TypeName obj_type_name;
+    if (unlikely(!type)) {
+        PyErr_SetString(PyExc_SystemError, "Missing type object");
+        return 0;
+    }
+    else if (exact) {
+        #if PY_MAJOR_VERSION == 2
+        if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
+        #endif
+    }
+    else {
+        if (likely(__Pyx_TypeCheck(obj, type))) return 1;
+    }
+    type_name = __Pyx_PyType_GetName(type);
+    obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj));
+    PyErr_Format(PyExc_TypeError,
+        "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME
+        ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name);
+    __Pyx_DECREF_TypeName(type_name);
+    __Pyx_DECREF_TypeName(obj_type_name);
+    return 0;
+}
+
+/* FixUpExtensionType */
+#if CYTHON_USE_TYPE_SPECS
+static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) {
+#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API
+    CYTHON_UNUSED_VAR(spec);
+    CYTHON_UNUSED_VAR(type);
+#else
+    const PyType_Slot *slot = spec->slots;
+    while (slot && slot->slot && slot->slot != Py_tp_members)
+        slot++;
+    if (slot && slot->slot == Py_tp_members) {
+        int changed = 0;
+#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON)
+        const
+#endif
+            PyMemberDef *memb = (PyMemberDef*) slot->pfunc;
+        while (memb && memb->name) {
+            if (memb->name[0] == '_' && memb->name[1] == '_') {
+#if PY_VERSION_HEX < 0x030900b1
+                if (strcmp(memb->name, "__weaklistoffset__") == 0) {
+                    assert(memb->type == T_PYSSIZET);
+                    assert(memb->flags == READONLY);
+                    type->tp_weaklistoffset = memb->offset;
+                    changed = 1;
+                }
+                else if (strcmp(memb->name, "__dictoffset__") == 0) {
+                    assert(memb->type == T_PYSSIZET);
+                    assert(memb->flags == READONLY);
+                    type->tp_dictoffset = memb->offset;
+                    changed = 1;
+                }
+#if CYTHON_METH_FASTCALL
+                else if (strcmp(memb->name, "__vectorcalloffset__") == 0) {
+                    assert(memb->type == T_PYSSIZET);
+                    assert(memb->flags == READONLY);
+#if PY_VERSION_HEX >= 0x030800b4
+                    type->tp_vectorcall_offset = memb->offset;
+#else
+                    type->tp_print = (printfunc) memb->offset;
+#endif
+                    changed = 1;
+                }
+#endif
+#else
+                if ((0));
+#endif
+#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON
+                else if (strcmp(memb->name, "__module__") == 0) {
+                    PyObject *descr;
+                    assert(memb->type == T_OBJECT);
+                    assert(memb->flags == 0 || memb->flags == READONLY);
+                    descr = PyDescr_NewMember(type, memb);
+                    if (unlikely(!descr))
+                        return -1;
+                    if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) {
+                        Py_DECREF(descr);
+                        return -1;
+                    }
+                    Py_DECREF(descr);
+                    changed = 1;
+                }
+#endif
+            }
+            memb++;
+        }
+        if (changed)
+            PyType_Modified(type);
+    }
+#endif
+    return 0;
+}
+#endif
+
+/* FetchSharedCythonModule */
+static PyObject *__Pyx_FetchSharedCythonABIModule(void) {
+    return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME);
+}
+
+/* FetchCommonType */
+static int __Pyx_VerifyCachedType(PyObject *cached_type,
+                               const char *name,
+                               Py_ssize_t basicsize,
+                               Py_ssize_t expected_basicsize) {
+    if (!PyType_Check(cached_type)) {
+        PyErr_Format(PyExc_TypeError,
+            "Shared Cython type %.200s is not a type object", name);
+        return -1;
+    }
+    if (basicsize != expected_basicsize) {
+        PyErr_Format(PyExc_TypeError,
+            "Shared Cython type %.200s has the wrong size, try recompiling",
+            name);
+        return -1;
+    }
+    return 0;
+}
+#if !CYTHON_USE_TYPE_SPECS
+static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
+    PyObject* abi_module;
+    const char* object_name;
+    PyTypeObject *cached_type = NULL;
+    abi_module = __Pyx_FetchSharedCythonABIModule();
+    if (!abi_module) return NULL;
+    object_name = strrchr(type->tp_name, '.');
+    object_name = object_name ? object_name+1 : type->tp_name;
+    cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name);
+    if (cached_type) {
+        if (__Pyx_VerifyCachedType(
+              (PyObject *)cached_type,
+              object_name,
+              cached_type->tp_basicsize,
+              type->tp_basicsize) < 0) {
+            goto bad;
+        }
+        goto done;
+    }
+    if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
+    PyErr_Clear();
+    if (PyType_Ready(type) < 0) goto bad;
+    if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0)
+        goto bad;
+    Py_INCREF(type);
+    cached_type = type;
+done:
+    Py_DECREF(abi_module);
+    return cached_type;
+bad:
+    Py_XDECREF(cached_type);
+    cached_type = NULL;
+    goto done;
+}
+#else
+static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) {
+    PyObject *abi_module, *cached_type = NULL;
+    const char* object_name = strrchr(spec->name, '.');
+    object_name = object_name ? object_name+1 : spec->name;
+    abi_module = __Pyx_FetchSharedCythonABIModule();
+    if (!abi_module) return NULL;
+    cached_type = PyObject_GetAttrString(abi_module, object_name);
+    if (cached_type) {
+        Py_ssize_t basicsize;
+#if CYTHON_COMPILING_IN_LIMITED_API
+        PyObject *py_basicsize;
+        py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__");
+        if (unlikely(!py_basicsize)) goto bad;
+        basicsize = PyLong_AsSsize_t(py_basicsize);
+        Py_DECREF(py_basicsize);
+        py_basicsize = 0;
+        if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+#else
+        basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1;
+#endif
+        if (__Pyx_VerifyCachedType(
+              cached_type,
+              object_name,
+              basicsize,
+              spec->basicsize) < 0) {
+            goto bad;
+        }
+        goto done;
+    }
+    if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
+    PyErr_Clear();
+    CYTHON_UNUSED_VAR(module);
+    cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases);
+    if (unlikely(!cached_type)) goto bad;
+    if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad;
+    if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad;
+done:
+    Py_DECREF(abi_module);
+    assert(cached_type == NULL || PyType_Check(cached_type));
+    return (PyTypeObject *) cached_type;
+bad:
+    Py_XDECREF(cached_type);
+    cached_type = NULL;
+    goto done;
+}
+#endif
+
+/* PyVectorcallFastCallDict */
+#if CYTHON_METH_FASTCALL
+static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw)
+{
+    PyObject *res = NULL;
+    PyObject *kwnames;
+    PyObject **newargs;
+    PyObject **kwvalues;
+    Py_ssize_t i, pos;
+    size_t j;
+    PyObject *key, *value;
+    unsigned long keys_are_strings;
+    Py_ssize_t nkw = PyDict_GET_SIZE(kw);
+    newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0]));
+    if (unlikely(newargs == NULL)) {
+        PyErr_NoMemory();
+        return NULL;
+    }
+    for (j = 0; j < nargs; j++) newargs[j] = args[j];
+    kwnames = PyTuple_New(nkw);
+    if (unlikely(kwnames == NULL)) {
+        PyMem_Free(newargs);
+        return NULL;
+    }
+    kwvalues = newargs + nargs;
+    pos = i = 0;
+    keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
+    while (PyDict_Next(kw, &pos, &key, &value)) {
+        keys_are_strings &= Py_TYPE(key)->tp_flags;
+        Py_INCREF(key);
+        Py_INCREF(value);
+        PyTuple_SET_ITEM(kwnames, i, key);
+        kwvalues[i] = value;
+        i++;
+    }
+    if (unlikely(!keys_are_strings)) {
+        PyErr_SetString(PyExc_TypeError, "keywords must be strings");
+        goto cleanup;
+    }
+    res = vc(func, newargs, nargs, kwnames);
+cleanup:
+    Py_DECREF(kwnames);
+    for (i = 0; i < nkw; i++)
+        Py_DECREF(kwvalues[i]);
+    PyMem_Free(newargs);
+    return res;
+}
+static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw)
+{
+    if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) {
+        return vc(func, args, nargs, NULL);
+    }
+    return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw);
+}
+#endif
+
+/* CythonFunctionShared */
+#if CYTHON_COMPILING_IN_LIMITED_API
+static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) {
+    if (__Pyx_CyFunction_Check(func)) {
+        return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc;
+    } else if (PyCFunction_Check(func)) {
+        return PyCFunction_GetFunction(func) == (PyCFunction) cfunc;
+    }
+    return 0;
+}
+#else
+static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) {
+    return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc;
+}
+#endif
+static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) {
+#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API
+    __Pyx_Py_XDECREF_SET(
+        __Pyx_CyFunction_GetClassObj(f),
+            ((classobj) ? __Pyx_NewRef(classobj) : NULL));
+#else
+    __Pyx_Py_XDECREF_SET(
+        ((PyCMethodObject *) (f))->mm_class,
+        (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL));
+#endif
+}
+static PyObject *
+__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure)
+{
+    CYTHON_UNUSED_VAR(closure);
+    if (unlikely(op->func_doc == NULL)) {
+#if CYTHON_COMPILING_IN_LIMITED_API
+        op->func_doc = PyObject_GetAttrString(op->func, "__doc__");
+        if (unlikely(!op->func_doc)) return NULL;
+#else
+        if (((PyCFunctionObject*)op)->m_ml->ml_doc) {
+#if PY_MAJOR_VERSION >= 3
+            op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc);
+#else
+            op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc);
+#endif
+            if (unlikely(op->func_doc == NULL))
+                return NULL;
+        } else {
+            Py_INCREF(Py_None);
+            return Py_None;
+        }
+#endif
+    }
+    Py_INCREF(op->func_doc);
+    return op->func_doc;
+}
+static int
+__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+    if (value == NULL) {
+        value = Py_None;
+    }
+    Py_INCREF(value);
+    __Pyx_Py_XDECREF_SET(op->func_doc, value);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+    if (unlikely(op->func_name == NULL)) {
+#if CYTHON_COMPILING_IN_LIMITED_API
+        op->func_name = PyObject_GetAttrString(op->func, "__name__");
+#elif PY_MAJOR_VERSION >= 3
+        op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name);
+#else
+        op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->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, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+#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;
+    }
+    Py_INCREF(value);
+    __Pyx_Py_XDECREF_SET(op->func_name, value);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+    Py_INCREF(op->func_qualname);
+    return op->func_qualname;
+}
+static int
+__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+#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;
+    }
+    Py_INCREF(value);
+    __Pyx_Py_XDECREF_SET(op->func_qualname, value);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+    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, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+    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;
+    }
+    Py_INCREF(value);
+    __Pyx_Py_XDECREF_SET(op->func_dict, value);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+    Py_INCREF(op->func_globals);
+    return op->func_globals;
+}
+static PyObject *
+__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context)
+{
+    CYTHON_UNUSED_VAR(op);
+    CYTHON_UNUSED_VAR(context);
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+static PyObject *
+__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context)
+{
+    PyObject* result = (op->func_code) ? op->func_code : Py_None;
+    CYTHON_UNUSED_VAR(context);
+    Py_INCREF(result);
+    return result;
+}
+static int
+__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) {
+    int result = 0;
+    PyObject *res = op->defaults_getter((PyObject *) op);
+    if (unlikely(!res))
+        return -1;
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    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);
+    #else
+    op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0);
+    if (unlikely(!op->defaults_tuple)) result = -1;
+    else {
+        op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1);
+        if (unlikely(!op->defaults_kwdict)) result = -1;
+    }
+    #endif
+    Py_DECREF(res);
+    return result;
+}
+static int
+__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) {
+    CYTHON_UNUSED_VAR(context);
+    if (!value) {
+        value = Py_None;
+    } else if (unlikely(value != Py_None && !PyTuple_Check(value))) {
+        PyErr_SetString(PyExc_TypeError,
+                        "__defaults__ must be set to a tuple object");
+        return -1;
+    }
+    PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not "
+                 "currently affect the values used in function calls", 1);
+    Py_INCREF(value);
+    __Pyx_Py_XDECREF_SET(op->defaults_tuple, value);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) {
+    PyObject* result = op->defaults_tuple;
+    CYTHON_UNUSED_VAR(context);
+    if (unlikely(!result)) {
+        if (op->defaults_getter) {
+            if (unlikely(__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, void *context) {
+    CYTHON_UNUSED_VAR(context);
+    if (!value) {
+        value = Py_None;
+    } else if (unlikely(value != Py_None && !PyDict_Check(value))) {
+        PyErr_SetString(PyExc_TypeError,
+                        "__kwdefaults__ must be set to a dict object");
+        return -1;
+    }
+    PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not "
+                 "currently affect the values used in function calls", 1);
+    Py_INCREF(value);
+    __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) {
+    PyObject* result = op->defaults_kwdict;
+    CYTHON_UNUSED_VAR(context);
+    if (unlikely(!result)) {
+        if (op->defaults_getter) {
+            if (unlikely(__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, void *context) {
+    CYTHON_UNUSED_VAR(context);
+    if (!value || value == Py_None) {
+        value = NULL;
+    } else if (unlikely(!PyDict_Check(value))) {
+        PyErr_SetString(PyExc_TypeError,
+                        "__annotations__ must be set to a dict object");
+        return -1;
+    }
+    Py_XINCREF(value);
+    __Pyx_Py_XDECREF_SET(op->func_annotations, value);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) {
+    PyObject* result = op->func_annotations;
+    CYTHON_UNUSED_VAR(context);
+    if (unlikely(!result)) {
+        result = PyDict_New();
+        if (unlikely(!result)) return NULL;
+        op->func_annotations = result;
+    }
+    Py_INCREF(result);
+    return result;
+}
+static PyObject *
+__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) {
+    int is_coroutine;
+    CYTHON_UNUSED_VAR(context);
+    if (op->func_is_coroutine) {
+        return __Pyx_NewRef(op->func_is_coroutine);
+    }
+    is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE;
+#if PY_VERSION_HEX >= 0x03050000
+    if (is_coroutine) {
+        PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine;
+        fromlist = PyList_New(1);
+        if (unlikely(!fromlist)) return NULL;
+        Py_INCREF(marker);
+#if CYTHON_ASSUME_SAFE_MACROS
+        PyList_SET_ITEM(fromlist, 0, marker);
+#else
+        if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) {
+            Py_DECREF(marker);
+            Py_DECREF(fromlist);
+            return NULL;
+        }
+#endif
+        module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0);
+        Py_DECREF(fromlist);
+        if (unlikely(!module)) goto ignore;
+        op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker);
+        Py_DECREF(module);
+        if (likely(op->func_is_coroutine)) {
+            return __Pyx_NewRef(op->func_is_coroutine);
+        }
+ignore:
+        PyErr_Clear();
+    }
+#endif
+    op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine);
+    return __Pyx_NewRef(op->func_is_coroutine);
+}
+#if CYTHON_COMPILING_IN_LIMITED_API
+static PyObject *
+__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) {
+    CYTHON_UNUSED_VAR(context);
+    return PyObject_GetAttrString(op->func, "__module__");
+}
+static int
+__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) {
+    CYTHON_UNUSED_VAR(context);
+    return PyObject_SetAttrString(op->func, "__module__", value);
+}
+#endif
+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 *) "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},
+    {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0},
+#if CYTHON_COMPILING_IN_LIMITED_API
+    {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0},
+#endif
+    {0, 0, 0, 0, 0}
+};
+static PyMemberDef __pyx_CyFunction_members[] = {
+#if !CYTHON_COMPILING_IN_LIMITED_API
+    {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0},
+#endif
+#if CYTHON_USE_TYPE_SPECS
+    {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0},
+#if CYTHON_METH_FASTCALL
+#if CYTHON_BACKPORT_VECTORCALL
+    {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0},
+#else
+#if !CYTHON_COMPILING_IN_LIMITED_API
+    {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0},
+#endif
+#endif
+#endif
+#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API
+    {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0},
+#else
+    {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0},
+#endif
+#endif
+    {0, 0, 0,  0, 0}
+};
+static PyObject *
+__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args)
+{
+    CYTHON_UNUSED_VAR(args);
+#if PY_MAJOR_VERSION >= 3
+    Py_INCREF(m->func_qualname);
+    return m->func_qualname;
+#else
+    return PyString_FromString(((PyCFunctionObject*)m)->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 || CYTHON_COMPILING_IN_LIMITED_API
+#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist)
+#else
+#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist)
+#endif
+static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname,
+                                       PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) {
+#if !CYTHON_COMPILING_IN_LIMITED_API
+    PyCFunctionObject *cf = (PyCFunctionObject*) op;
+#endif
+    if (unlikely(op == NULL))
+        return NULL;
+#if CYTHON_COMPILING_IN_LIMITED_API
+    op->func = PyCFunction_NewEx(ml, (PyObject*)op, module);
+    if (unlikely(!op->func)) return NULL;
+#endif
+    op->flags = flags;
+    __Pyx_CyFunction_weakreflist(op) = NULL;
+#if !CYTHON_COMPILING_IN_LIMITED_API
+    cf->m_ml = ml;
+    cf->m_self = (PyObject *) op;
+#endif
+    Py_XINCREF(closure);
+    op->func_closure = closure;
+#if !CYTHON_COMPILING_IN_LIMITED_API
+    Py_XINCREF(module);
+    cf->m_module = module;
+#endif
+    op->func_dict = NULL;
+    op->func_name = NULL;
+    Py_INCREF(qualname);
+    op->func_qualname = qualname;
+    op->func_doc = NULL;
+#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API
+    op->func_classobj = NULL;
+#else
+    ((PyCMethodObject*)op)->mm_class = NULL;
+#endif
+    op->func_globals = globals;
+    Py_INCREF(op->func_globals);
+    Py_XINCREF(code);
+    op->func_code = code;
+    op->defaults_pyobjects = 0;
+    op->defaults_size = 0;
+    op->defaults = NULL;
+    op->defaults_tuple = NULL;
+    op->defaults_kwdict = NULL;
+    op->defaults_getter = NULL;
+    op->func_annotations = NULL;
+    op->func_is_coroutine = NULL;
+#if CYTHON_METH_FASTCALL
+    switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) {
+    case METH_NOARGS:
+        __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS;
+        break;
+    case METH_O:
+        __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O;
+        break;
+    case METH_METHOD | METH_FASTCALL | METH_KEYWORDS:
+        __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD;
+        break;
+    case METH_FASTCALL | METH_KEYWORDS:
+        __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS;
+        break;
+    case METH_VARARGS | METH_KEYWORDS:
+        __Pyx_CyFunction_func_vectorcall(op) = NULL;
+        break;
+    default:
+        PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction");
+        Py_DECREF(op);
+        return NULL;
+    }
+#endif
+    return (PyObject *) op;
+}
+static int
+__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
+{
+    Py_CLEAR(m->func_closure);
+#if CYTHON_COMPILING_IN_LIMITED_API
+    Py_CLEAR(m->func);
+#else
+    Py_CLEAR(((PyCFunctionObject*)m)->m_module);
+#endif
+    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);
+#if !CYTHON_COMPILING_IN_LIMITED_API
+#if PY_VERSION_HEX < 0x030900B1
+    Py_CLEAR(__Pyx_CyFunction_GetClassObj(m));
+#else
+    {
+        PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class;
+        ((PyCMethodObject *) (m))->mm_class = NULL;
+        Py_XDECREF(cls);
+    }
+#endif
+#endif
+    Py_CLEAR(m->defaults_tuple);
+    Py_CLEAR(m->defaults_kwdict);
+    Py_CLEAR(m->func_annotations);
+    Py_CLEAR(m->func_is_coroutine);
+    if (m->defaults) {
+        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
+        int i;
+        for (i = 0; i < m->defaults_pyobjects; i++)
+            Py_XDECREF(pydefaults[i]);
+        PyObject_Free(m->defaults);
+        m->defaults = NULL;
+    }
+    return 0;
+}
+static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m)
+{
+    if (__Pyx_CyFunction_weakreflist(m) != NULL)
+        PyObject_ClearWeakRefs((PyObject *) m);
+    __Pyx_CyFunction_clear(m);
+    __Pyx_PyHeapTypeObject_GC_Del(m);
+}
+static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
+{
+    PyObject_GC_UnTrack(m);
+    __Pyx__CyFunction_dealloc(m);
+}
+static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
+{
+    Py_VISIT(m->func_closure);
+#if CYTHON_COMPILING_IN_LIMITED_API
+    Py_VISIT(m->func);
+#else
+    Py_VISIT(((PyCFunctionObject*)m)->m_module);
+#endif
+    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);
+#if !CYTHON_COMPILING_IN_LIMITED_API
+    Py_VISIT(__Pyx_CyFunction_GetClassObj(m));
+#endif
+    Py_VISIT(m->defaults_tuple);
+    Py_VISIT(m->defaults_kwdict);
+    Py_VISIT(m->func_is_coroutine);
+    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_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
+}
+static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) {
+#if CYTHON_COMPILING_IN_LIMITED_API
+    PyObject *f = ((__pyx_CyFunctionObject*)func)->func;
+    PyObject *py_name = NULL;
+    PyCFunction meth;
+    int flags;
+    meth = PyCFunction_GetFunction(f);
+    if (unlikely(!meth)) return NULL;
+    flags = PyCFunction_GetFlags(f);
+    if (unlikely(flags < 0)) return NULL;
+#else
+    PyCFunctionObject* f = (PyCFunctionObject*)func;
+    PyCFunction meth = f->m_ml->ml_meth;
+    int flags = f->m_ml->ml_flags;
+#endif
+    Py_ssize_t size;
+    switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) {
+    case METH_VARARGS:
+        if (likely(kw == NULL || PyDict_Size(kw) == 0))
+            return (*meth)(self, arg);
+        break;
+    case METH_VARARGS | METH_KEYWORDS:
+        return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw);
+    case METH_NOARGS:
+        if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
+#if CYTHON_ASSUME_SAFE_MACROS
+            size = PyTuple_GET_SIZE(arg);
+#else
+            size = PyTuple_Size(arg);
+            if (unlikely(size < 0)) return NULL;
+#endif
+            if (likely(size == 0))
+                return (*meth)(self, NULL);
+#if CYTHON_COMPILING_IN_LIMITED_API
+            py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL);
+            if (!py_name) return NULL;
+            PyErr_Format(PyExc_TypeError,
+                "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                py_name, size);
+            Py_DECREF(py_name);
+#else
+            PyErr_Format(PyExc_TypeError,
+                "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                f->m_ml->ml_name, size);
+#endif
+            return NULL;
+        }
+        break;
+    case METH_O:
+        if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
+#if CYTHON_ASSUME_SAFE_MACROS
+            size = PyTuple_GET_SIZE(arg);
+#else
+            size = PyTuple_Size(arg);
+            if (unlikely(size < 0)) return NULL;
+#endif
+            if (likely(size == 1)) {
+                PyObject *result, *arg0;
+                #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                arg0 = PyTuple_GET_ITEM(arg, 0);
+                #else
+                arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL;
+                #endif
+                result = (*meth)(self, arg0);
+                #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
+                Py_DECREF(arg0);
+                #endif
+                return result;
+            }
+#if CYTHON_COMPILING_IN_LIMITED_API
+            py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL);
+            if (!py_name) return NULL;
+            PyErr_Format(PyExc_TypeError,
+                "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                py_name, size);
+            Py_DECREF(py_name);
+#else
+            PyErr_Format(PyExc_TypeError,
+                "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                f->m_ml->ml_name, size);
+#endif
+            return NULL;
+        }
+        break;
+    default:
+        PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction");
+        return NULL;
+    }
+#if CYTHON_COMPILING_IN_LIMITED_API
+    py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL);
+    if (!py_name) return NULL;
+    PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments",
+                 py_name);
+    Py_DECREF(py_name);
+#else
+    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
+                 f->m_ml->ml_name);
+#endif
+    return NULL;
+}
+static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyObject *self, *result;
+#if CYTHON_COMPILING_IN_LIMITED_API
+    self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func);
+    if (unlikely(!self) && PyErr_Occurred()) return NULL;
+#else
+    self = ((PyCFunctionObject*)func)->m_self;
+#endif
+    result = __Pyx_CyFunction_CallMethod(func, self, arg, kw);
+    return result;
+}
+static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) {
+    PyObject *result;
+    __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func;
+#if CYTHON_METH_FASTCALL
+     __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc);
+    if (vc) {
+#if CYTHON_ASSUME_SAFE_MACROS
+        return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw);
+#else
+        (void) &__Pyx_PyVectorcall_FastCallDict;
+        return PyVectorcall_Call(func, args, kw);
+#endif
+    }
+#endif
+    if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) {
+        Py_ssize_t argc;
+        PyObject *new_args;
+        PyObject *self;
+#if CYTHON_ASSUME_SAFE_MACROS
+        argc = PyTuple_GET_SIZE(args);
+#else
+        argc = PyTuple_Size(args);
+        if (unlikely(!argc) < 0) return NULL;
+#endif
+        new_args = PyTuple_GetSlice(args, 1, argc);
+        if (unlikely(!new_args))
+            return NULL;
+        self = PyTuple_GetItem(args, 0);
+        if (unlikely(!self)) {
+            Py_DECREF(new_args);
+#if PY_MAJOR_VERSION > 2
+            PyErr_Format(PyExc_TypeError,
+                         "unbound method %.200S() needs an argument",
+                         cyfunc->func_qualname);
+#else
+            PyErr_SetString(PyExc_TypeError,
+                            "unbound method needs an argument");
+#endif
+            return NULL;
+        }
+        result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw);
+        Py_DECREF(new_args);
+    } else {
+        result = __Pyx_CyFunction_Call(func, args, kw);
+    }
+    return result;
+}
+#if CYTHON_METH_FASTCALL
+static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames)
+{
+    int ret = 0;
+    if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) {
+        if (unlikely(nargs < 1)) {
+            PyErr_Format(PyExc_TypeError, "%.200s() needs an argument",
+                         ((PyCFunctionObject*)cyfunc)->m_ml->ml_name);
+            return -1;
+        }
+        ret = 1;
+    }
+    if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) {
+        PyErr_Format(PyExc_TypeError,
+                     "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name);
+        return -1;
+    }
+    return ret;
+}
+static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames)
+{
+    __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func;
+    PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml;
+#if CYTHON_BACKPORT_VECTORCALL
+    Py_ssize_t nargs = (Py_ssize_t)nargsf;
+#else
+    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+#endif
+    PyObject *self;
+    switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) {
+    case 1:
+        self = args[0];
+        args += 1;
+        nargs -= 1;
+        break;
+    case 0:
+        self = ((PyCFunctionObject*)cyfunc)->m_self;
+        break;
+    default:
+        return NULL;
+    }
+    if (unlikely(nargs != 0)) {
+        PyErr_Format(PyExc_TypeError,
+            "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)",
+            def->ml_name, nargs);
+        return NULL;
+    }
+    return def->ml_meth(self, NULL);
+}
+static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames)
+{
+    __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func;
+    PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml;
+#if CYTHON_BACKPORT_VECTORCALL
+    Py_ssize_t nargs = (Py_ssize_t)nargsf;
+#else
+    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+#endif
+    PyObject *self;
+    switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) {
+    case 1:
+        self = args[0];
+        args += 1;
+        nargs -= 1;
+        break;
+    case 0:
+        self = ((PyCFunctionObject*)cyfunc)->m_self;
+        break;
+    default:
+        return NULL;
+    }
+    if (unlikely(nargs != 1)) {
+        PyErr_Format(PyExc_TypeError,
+            "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)",
+            def->ml_name, nargs);
+        return NULL;
+    }
+    return def->ml_meth(self, args[0]);
+}
+static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames)
+{
+    __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func;
+    PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml;
+#if CYTHON_BACKPORT_VECTORCALL
+    Py_ssize_t nargs = (Py_ssize_t)nargsf;
+#else
+    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+#endif
+    PyObject *self;
+    switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) {
+    case 1:
+        self = args[0];
+        args += 1;
+        nargs -= 1;
+        break;
+    case 0:
+        self = ((PyCFunctionObject*)cyfunc)->m_self;
+        break;
+    default:
+        return NULL;
+    }
+    return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames);
+}
+static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames)
+{
+    __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func;
+    PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml;
+    PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc);
+#if CYTHON_BACKPORT_VECTORCALL
+    Py_ssize_t nargs = (Py_ssize_t)nargsf;
+#else
+    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+#endif
+    PyObject *self;
+    switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) {
+    case 1:
+        self = args[0];
+        args += 1;
+        nargs -= 1;
+        break;
+    case 0:
+        self = ((PyCFunctionObject*)cyfunc)->m_self;
+        break;
+    default:
+        return NULL;
+    }
+    return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames);
+}
+#endif
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_CyFunctionType_slots[] = {
+    {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc},
+    {Py_tp_repr, (void *)__Pyx_CyFunction_repr},
+    {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod},
+    {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse},
+    {Py_tp_clear, (void *)__Pyx_CyFunction_clear},
+    {Py_tp_methods, (void *)__pyx_CyFunction_methods},
+    {Py_tp_members, (void *)__pyx_CyFunction_members},
+    {Py_tp_getset, (void *)__pyx_CyFunction_getsets},
+    {Py_tp_descr_get, (void *)__Pyx_PyMethod_New},
+    {0, 0},
+};
+static PyType_Spec __pyx_CyFunctionType_spec = {
+    __PYX_TYPE_MODULE_PREFIX "cython_function_or_method",
+    sizeof(__pyx_CyFunctionObject),
+    0,
+#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR
+    Py_TPFLAGS_METHOD_DESCRIPTOR |
+#endif
+#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL)
+    _Py_TPFLAGS_HAVE_VECTORCALL |
+#endif
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,
+    __pyx_CyFunctionType_slots
+};
+#else
+static PyTypeObject __pyx_CyFunctionType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __PYX_TYPE_MODULE_PREFIX "cython_function_or_method",
+    sizeof(__pyx_CyFunctionObject),
+    0,
+    (destructor) __Pyx_CyFunction_dealloc,
+#if !CYTHON_METH_FASTCALL
+    0,
+#elif CYTHON_BACKPORT_VECTORCALL
+    (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall),
+#else
+    offsetof(PyCFunctionObject, vectorcall),
+#endif
+    0,
+    0,
+#if PY_MAJOR_VERSION < 3
+    0,
+#else
+    0,
+#endif
+    (reprfunc) __Pyx_CyFunction_repr,
+    0,
+    0,
+    0,
+    0,
+    __Pyx_CyFunction_CallAsMethod,
+    0,
+    0,
+    0,
+    0,
+#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR
+    Py_TPFLAGS_METHOD_DESCRIPTOR |
+#endif
+#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL
+    _Py_TPFLAGS_HAVE_VECTORCALL |
+#endif
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,
+    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_PyMethod_New,
+    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
+#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+    0,
+#endif
+#if __PYX_NEED_TP_PRINT_SLOT
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030C0000
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030d00A4
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+    0,
+#endif
+};
+#endif
+static int __pyx_CyFunction_init(PyObject *module) {
+#if CYTHON_USE_TYPE_SPECS
+    __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL);
+#else
+    CYTHON_UNUSED_VAR(module);
+    __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type);
+#endif
+    if (unlikely(__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 = PyObject_Malloc(size);
+    if (unlikely(!m->defaults))
+        return PyErr_NoMemory();
+    memset(m->defaults, 0, size);
+    m->defaults_pyobjects = pyobjects;
+    m->defaults_size = size;
+    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);
+}
+
+/* CythonFunction */
+static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname,
+                                      PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) {
+    PyObject *op = __Pyx_CyFunction_Init(
+        PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType),
+        ml, flags, qualname, closure, module, globals, code
+    );
+    if (likely(op)) {
+        PyObject_GC_Track(op);
+    }
+    return op;
+}
+
+/* RaiseUnexpectedTypeError */
+static int
+__Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj)
+{
+    __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj));
+    PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME,
+                 expected, obj_type_name);
+    __Pyx_DECREF_TypeName(obj_type_name);
+    return 0;
+}
+
+/* PyFunctionFastCall */
+#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL
+static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na,
+                                               PyObject *globals) {
+    PyFrameObject *f;
+    PyThreadState *tstate = __Pyx_PyThreadState_Current;
+    PyObject **fastlocals;
+    Py_ssize_t i;
+    PyObject *result;
+    assert(globals != NULL);
+    /* XXX Perhaps we should create a specialized
+       PyFrame_New() that doesn't take locals, but does
+       take builtins without sanity checking them.
+       */
+    assert(tstate != NULL);
+    f = PyFrame_New(tstate, co, globals, NULL);
+    if (f == NULL) {
+        return NULL;
+    }
+    fastlocals = __Pyx_PyFrame_GetLocalsplus(f);
+    for (i = 0; i < na; i++) {
+        Py_INCREF(*args);
+        fastlocals[i] = *args++;
+    }
+    result = PyEval_EvalFrameEx(f,0);
+    ++tstate->recursion_depth;
+    Py_DECREF(f);
+    --tstate->recursion_depth;
+    return result;
+}
+static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) {
+    PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
+    PyObject *globals = PyFunction_GET_GLOBALS(func);
+    PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
+    PyObject *closure;
+#if PY_MAJOR_VERSION >= 3
+    PyObject *kwdefs;
+#endif
+    PyObject *kwtuple, **k;
+    PyObject **d;
+    Py_ssize_t nd;
+    Py_ssize_t nk;
+    PyObject *result;
+    assert(kwargs == NULL || PyDict_Check(kwargs));
+    nk = kwargs ? PyDict_Size(kwargs) : 0;
+    #if PY_MAJOR_VERSION < 3
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) {
+        return NULL;
+    }
+    #else
+    if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) {
+        return NULL;
+    }
+    #endif
+    if (
+#if PY_MAJOR_VERSION >= 3
+            co->co_kwonlyargcount == 0 &&
+#endif
+            likely(kwargs == NULL || nk == 0) &&
+            co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
+        if (argdefs == NULL && co->co_argcount == nargs) {
+            result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals);
+            goto done;
+        }
+        else if (nargs == 0 && argdefs != NULL
+                 && co->co_argcount == Py_SIZE(argdefs)) {
+            /* function called with no arguments, but all parameters have
+               a default value: use default values as arguments .*/
+            args = &PyTuple_GET_ITEM(argdefs, 0);
+            result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals);
+            goto done;
+        }
+    }
+    if (kwargs != NULL) {
+        Py_ssize_t pos, i;
+        kwtuple = PyTuple_New(2 * nk);
+        if (kwtuple == NULL) {
+            result = NULL;
+            goto done;
+        }
+        k = &PyTuple_GET_ITEM(kwtuple, 0);
+        pos = i = 0;
+        while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
+            Py_INCREF(k[i]);
+            Py_INCREF(k[i+1]);
+            i += 2;
+        }
+        nk = i / 2;
+    }
+    else {
+        kwtuple = NULL;
+        k = NULL;
+    }
+    closure = PyFunction_GET_CLOSURE(func);
+#if PY_MAJOR_VERSION >= 3
+    kwdefs = PyFunction_GET_KW_DEFAULTS(func);
+#endif
+    if (argdefs != NULL) {
+        d = &PyTuple_GET_ITEM(argdefs, 0);
+        nd = Py_SIZE(argdefs);
+    }
+    else {
+        d = NULL;
+        nd = 0;
+    }
+#if PY_MAJOR_VERSION >= 3
+    result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL,
+                               args, (int)nargs,
+                               k, (int)nk,
+                               d, (int)nd, kwdefs, closure);
+#else
+    result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL,
+                               args, (int)nargs,
+                               k, (int)nk,
+                               d, (int)nd, closure);
+#endif
+    Py_XDECREF(kwtuple);
+done:
+    Py_LeaveRecursiveCall();
+    return result;
+}
+#endif
+
+/* PyObjectCall */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyObject *result;
+    ternaryfunc call = Py_TYPE(func)->tp_call;
+    if (unlikely(!call))
+        return PyObject_Call(func, arg, kw);
+    #if PY_MAJOR_VERSION < 3
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    #else
+    if (unlikely(Py_EnterRecursiveCall(" while calling a Python object")))
+        return NULL;
+    #endif
+    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
+
+/* PyObjectCallMethO */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
+    PyObject *self, *result;
+    PyCFunction cfunc;
+    cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func);
+    self = __Pyx_CyOrPyCFunction_GET_SELF(func);
+    #if PY_MAJOR_VERSION < 3
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    #else
+    if (unlikely(Py_EnterRecursiveCall(" while calling a Python object")))
+        return NULL;
+    #endif
+    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
+
+/* PyObjectFastCall */
+#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API
+static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) {
+    PyObject *argstuple;
+    PyObject *result = 0;
+    size_t i;
+    argstuple = PyTuple_New((Py_ssize_t)nargs);
+    if (unlikely(!argstuple)) return NULL;
+    for (i = 0; i < nargs; i++) {
+        Py_INCREF(args[i]);
+        if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad;
+    }
+    result = __Pyx_PyObject_Call(func, argstuple, kwargs);
+  bad:
+    Py_DECREF(argstuple);
+    return result;
+}
+#endif
+static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) {
+    Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs);
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (nargs == 0 && kwargs == NULL) {
+        if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS))
+            return __Pyx_PyObject_CallMethO(func, NULL);
+    }
+    else if (nargs == 1 && kwargs == NULL) {
+        if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O))
+            return __Pyx_PyObject_CallMethO(func, args[0]);
+    }
+#endif
+    #if PY_VERSION_HEX < 0x030800B1
+    #if CYTHON_FAST_PYCCALL
+    if (PyCFunction_Check(func)) {
+        if (kwargs) {
+            return _PyCFunction_FastCallDict(func, args, nargs, kwargs);
+        } else {
+            return _PyCFunction_FastCallKeywords(func, args, nargs, NULL);
+        }
+    }
+    #if PY_VERSION_HEX >= 0x030700A1
+    if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) {
+        return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL);
+    }
+    #endif
+    #endif
+    #if CYTHON_FAST_PYCALL
+    if (PyFunction_Check(func)) {
+        return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs);
+    }
+    #endif
+    #endif
+    if (kwargs == NULL) {
+        #if CYTHON_VECTORCALL
+        #if PY_VERSION_HEX < 0x03090000
+        vectorcallfunc f = _PyVectorcall_Function(func);
+        #else
+        vectorcallfunc f = PyVectorcall_Function(func);
+        #endif
+        if (f) {
+            return f(func, args, (size_t)nargs, NULL);
+        }
+        #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL
+        if (__Pyx_CyFunction_CheckExact(func)) {
+            __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func);
+            if (f) return f(func, args, (size_t)nargs, NULL);
+        }
+        #endif
+    }
+    if (nargs == 0) {
+        return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs);
+    }
+    #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API
+    return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs);
+    #else
+    return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs);
+    #endif
+}
+
+/* PyObjectCallOneArg */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject *args[2] = {NULL, arg};
+    return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET);
+}
+
+/* RaiseException */
+#if PY_MAJOR_VERSION < 3
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+    __Pyx_PyThreadState_declare
+    CYTHON_UNUSED_VAR(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_PyThreadState_assign
+    __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) {
+                int is_subclass = PyObject_IsSubclass(instance_class, type);
+                if (!is_subclass) {
+                    instance_class = NULL;
+                } else if (unlikely(is_subclass == -1)) {
+                    goto bad;
+                } else {
+                    type = instance_class;
+                }
+            }
+        }
+        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 (cause) {
+        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 PY_VERSION_HEX >= 0x030C00A6
+        PyException_SetTraceback(value, tb);
+      #elif CYTHON_FAST_THREAD_STATE
+        PyThreadState *tstate = __Pyx_PyThreadState_Current;
+        PyObject* tmp_tb = tstate->curexc_traceback;
+        if (tb != tmp_tb) {
+            Py_INCREF(tb);
+            tstate->curexc_traceback = tb;
+            Py_XDECREF(tmp_tb);
+        }
+#else
+        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);
+#endif
+    }
+bad:
+    Py_XDECREF(owned_instance);
+    return;
+}
+#endif
+
+/* decode_c_bytes */
+static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes(
+         const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop,
+         const char* encoding, const char* errors,
+         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
+    if (unlikely((start < 0) | (stop < 0))) {
+        if (start < 0) {
+            start += length;
+            if (start < 0)
+                start = 0;
+        }
+        if (stop < 0)
+            stop += length;
+    }
+    if (stop > length)
+        stop = length;
+    if (unlikely(stop <= start))
+        return __Pyx_NewRef(__pyx_empty_unicode);
+    length = stop - start;
+    cstring += start;
+    if (decode_func) {
+        return decode_func(cstring, length, errors);
+    } else {
+        return PyUnicode_Decode(cstring, length, encoding, errors);
+    }
+}
+
+/* GetTopmostException */
+#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE
+static _PyErr_StackItem *
+__Pyx_PyErr_GetTopmostException(PyThreadState *tstate)
+{
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) &&
+           exc_info->previous_item != NULL)
+    {
+        exc_info = exc_info->previous_item;
+    }
+    return exc_info;
+}
+#endif
+
+/* SaveResetException */
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+  #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4
+    _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
+    PyObject *exc_value = exc_info->exc_value;
+    if (exc_value == NULL || exc_value == Py_None) {
+        *value = NULL;
+        *type = NULL;
+        *tb = NULL;
+    } else {
+        *value = exc_value;
+        Py_INCREF(*value);
+        *type = (PyObject*) Py_TYPE(exc_value);
+        Py_INCREF(*type);
+        *tb = PyException_GetTraceback(exc_value);
+    }
+  #elif CYTHON_USE_EXC_INFO_STACK
+    _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
+    *type = exc_info->exc_type;
+    *value = exc_info->exc_value;
+    *tb = exc_info->exc_traceback;
+    Py_XINCREF(*type);
+    Py_XINCREF(*value);
+    Py_XINCREF(*tb);
+  #else
+    *type = tstate->exc_type;
+    *value = tstate->exc_value;
+    *tb = tstate->exc_traceback;
+    Py_XINCREF(*type);
+    Py_XINCREF(*value);
+    Py_XINCREF(*tb);
+  #endif
+}
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
+  #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    PyObject *tmp_value = exc_info->exc_value;
+    exc_info->exc_value = value;
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(type);
+    Py_XDECREF(tb);
+  #else
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    #if CYTHON_USE_EXC_INFO_STACK
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    tmp_type = exc_info->exc_type;
+    tmp_value = exc_info->exc_value;
+    tmp_tb = exc_info->exc_traceback;
+    exc_info->exc_type = type;
+    exc_info->exc_value = value;
+    exc_info->exc_traceback = tb;
+    #else
+    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;
+    #endif
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
+  #endif
+}
+#endif
+
+/* GetException */
+#if CYTHON_FAST_THREAD_STATE
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb)
+#else
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
+#endif
+{
+    PyObject *local_type = NULL, *local_value, *local_tb = NULL;
+#if CYTHON_FAST_THREAD_STATE
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+  #if PY_VERSION_HEX >= 0x030C00A6
+    local_value = tstate->current_exception;
+    tstate->current_exception = 0;
+    if (likely(local_value)) {
+        local_type = (PyObject*) Py_TYPE(local_value);
+        Py_INCREF(local_type);
+        local_tb = PyException_GetTraceback(local_value);
+    }
+  #else
+    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;
+  #endif
+#else
+    PyErr_Fetch(&local_type, &local_value, &local_tb);
+#endif
+    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
+#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6
+    if (unlikely(tstate->current_exception))
+#elif CYTHON_FAST_THREAD_STATE
+    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_FAST_THREAD_STATE
+    #if CYTHON_USE_EXC_INFO_STACK
+    {
+        _PyErr_StackItem *exc_info = tstate->exc_info;
+      #if PY_VERSION_HEX >= 0x030B00a4
+        tmp_value = exc_info->exc_value;
+        exc_info->exc_value = local_value;
+        tmp_type = NULL;
+        tmp_tb = NULL;
+        Py_XDECREF(local_type);
+        Py_XDECREF(local_tb);
+      #else
+        tmp_type = exc_info->exc_type;
+        tmp_value = exc_info->exc_value;
+        tmp_tb = exc_info->exc_traceback;
+        exc_info->exc_type = local_type;
+        exc_info->exc_value = local_value;
+        exc_info->exc_traceback = local_tb;
+      #endif
+    }
+    #else
+    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;
+    #endif
+    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;
+}
+
+/* PyDictVersioning */
+#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) {
+    PyObject *dict = Py_TYPE(obj)->tp_dict;
+    return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0;
+}
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) {
+    PyObject **dictptr = NULL;
+    Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset;
+    if (offset) {
+#if CYTHON_COMPILING_IN_CPYTHON
+        dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj);
+#else
+        dictptr = _PyObject_GetDictPtr(obj);
+#endif
+    }
+    return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0;
+}
+static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) {
+    PyObject *dict = Py_TYPE(obj)->tp_dict;
+    if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict)))
+        return 0;
+    return obj_dict_version == __Pyx_get_object_dict_version(obj);
+}
+#endif
+
+/* GetModuleGlobalName */
+#if CYTHON_USE_DICT_VERSIONS
+static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value)
+#else
+static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name)
+#endif
+{
+    PyObject *result;
+#if !CYTHON_AVOID_BORROWED_REFS
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000
+    result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash);
+    __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
+    if (likely(result)) {
+        return __Pyx_NewRef(result);
+    } else if (unlikely(PyErr_Occurred())) {
+        return NULL;
+    }
+#elif CYTHON_COMPILING_IN_LIMITED_API
+    if (unlikely(!__pyx_m)) {
+        return NULL;
+    }
+    result = PyObject_GetAttr(__pyx_m, name);
+    if (likely(result)) {
+        return result;
+    }
+#else
+    result = PyDict_GetItem(__pyx_d, name);
+    __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
+    if (likely(result)) {
+        return __Pyx_NewRef(result);
+    }
+#endif
+#else
+    result = PyObject_GetItem(__pyx_d, name);
+    __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
+    if (likely(result)) {
+        return __Pyx_NewRef(result);
+    }
+    PyErr_Clear();
+#endif
+    return __Pyx_GetBuiltinName(name);
+}
+
+/* KeywordStringCheck */
+static int __Pyx_CheckKeywordStrings(
+    PyObject *kw,
+    const char* function_name,
+    int kw_allowed)
+{
+    PyObject* key = 0;
+    Py_ssize_t pos = 0;
+#if CYTHON_COMPILING_IN_PYPY
+    if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0))
+        goto invalid_keyword;
+    return 1;
+#else
+    if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) {
+        Py_ssize_t kwsize;
+#if CYTHON_ASSUME_SAFE_MACROS
+        kwsize = PyTuple_GET_SIZE(kw);
+#else
+        kwsize = PyTuple_Size(kw);
+        if (kwsize < 0) return 0;
+#endif
+        if (unlikely(kwsize == 0))
+            return 1;
+        if (!kw_allowed) {
+#if CYTHON_ASSUME_SAFE_MACROS
+            key = PyTuple_GET_ITEM(kw, 0);
+#else
+            key = PyTuple_GetItem(kw, pos);
+            if (!key) return 0;
+#endif
+            goto invalid_keyword;
+        }
+#if PY_VERSION_HEX < 0x03090000
+        for (pos = 0; pos < kwsize; pos++) {
+#if CYTHON_ASSUME_SAFE_MACROS
+            key = PyTuple_GET_ITEM(kw, pos);
+#else
+            key = PyTuple_GetItem(kw, pos);
+            if (!key) return 0;
+#endif
+            if (unlikely(!PyUnicode_Check(key)))
+                goto invalid_keyword_type;
+        }
+#endif
+        return 1;
+    }
+    while (PyDict_Next(kw, &pos, &key, 0)) {
+        #if PY_MAJOR_VERSION < 3
+        if (unlikely(!PyString_Check(key)))
+        #endif
+            if (unlikely(!PyUnicode_Check(key)))
+                goto invalid_keyword_type;
+    }
+    if (!kw_allowed && unlikely(key))
+        goto invalid_keyword;
+    return 1;
+invalid_keyword_type:
+    PyErr_Format(PyExc_TypeError,
+        "%.200s() keywords must be strings", function_name);
+    return 0;
+#endif
+invalid_keyword:
+    #if PY_MAJOR_VERSION < 3
+    PyErr_Format(PyExc_TypeError,
+        "%.200s() got an unexpected keyword argument '%.200s'",
+        function_name, PyString_AsString(key));
+    #else
+    PyErr_Format(PyExc_TypeError,
+        "%s() got an unexpected keyword argument '%U'",
+        function_name, key);
+    #endif
+    return 0;
+}
+
+/* PyObjectCallNoArg */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
+    PyObject *arg[2] = {NULL, NULL};
+    return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET);
+}
+
+/* GetItemInt */
+static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
+    PyObject *r;
+    if (unlikely(!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,
+                                                              CYTHON_NCP_UNUSED int wraparound,
+                                                              CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    Py_ssize_t wrapped_i = i;
+    if (wraparound & unlikely(i < 0)) {
+        wrapped_i += PyList_GET_SIZE(o);
+    }
+    if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) {
+        PyObject *r = PyList_GET_ITEM(o, wrapped_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,
+                                                              CYTHON_NCP_UNUSED int wraparound,
+                                                              CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    Py_ssize_t wrapped_i = i;
+    if (wraparound & unlikely(i < 0)) {
+        wrapped_i += PyTuple_GET_SIZE(o);
+    }
+    if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) {
+        PyObject *r = PyTuple_GET_ITEM(o, wrapped_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,
+                                                     CYTHON_NCP_UNUSED int wraparound,
+                                                     CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS
+    if (is_list || PyList_CheckExact(o)) {
+        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if ((!boundscheck) || (likely(__Pyx_is_valid_index(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(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
+    } else {
+        PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping;
+        PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence;
+        if (mm && mm->mp_subscript) {
+            PyObject *r, *key = PyInt_FromSsize_t(i);
+            if (unlikely(!key)) return NULL;
+            r = mm->mp_subscript(o, key);
+            Py_DECREF(key);
+            return r;
+        }
+        if (likely(sm && sm->sq_item)) {
+            if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) {
+                Py_ssize_t l = sm->sq_length(o);
+                if (likely(l >= 0)) {
+                    i += l;
+                } else {
+                    if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+                        return NULL;
+                    PyErr_Clear();
+                }
+            }
+            return sm->sq_item(o, i);
+        }
+    }
+#else
+    if (is_list || !PyMapping_Check(o)) {
+        return PySequence_GetItem(o, i);
+    }
+#endif
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+}
+
+/* ExtTypeTest */
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
+    __Pyx_TypeName obj_type_name;
+    __Pyx_TypeName type_name;
+    if (unlikely(!type)) {
+        PyErr_SetString(PyExc_SystemError, "Missing type object");
+        return 0;
+    }
+    if (likely(__Pyx_TypeCheck(obj, type)))
+        return 1;
+    obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj));
+    type_name = __Pyx_PyType_GetName(type);
+    PyErr_Format(PyExc_TypeError,
+                 "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME,
+                 obj_type_name, type_name);
+    __Pyx_DECREF_TypeName(obj_type_name);
+    __Pyx_DECREF_TypeName(type_name);
+    return 0;
+}
+
+/* RaiseTooManyValuesToUnpack */
+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);
+}
+
+/* RaiseNeedMoreValuesToUnpack */
+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");
+}
+
+/* IterFinish */
+static CYTHON_INLINE int __Pyx_IterFinish(void) {
+    PyObject* exc_type;
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (unlikely(exc_type)) {
+        if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))
+            return -1;
+        __Pyx_PyErr_Clear();
+        return 0;
+    }
+    return 0;
+}
+
+/* UnpackItemEndCheck */
+static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
+    if (unlikely(retval)) {
+        Py_DECREF(retval);
+        __Pyx_RaiseTooManyValuesError(expected);
+        return -1;
+    }
+    return __Pyx_IterFinish();
+}
+
+/* PyObjectCall2Args */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) {
+    PyObject *args[3] = {NULL, arg1, arg2};
+    return __Pyx_PyObject_FastCall(function, args+1, 2 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET);
+}
+
+/* PyObjectGetMethod */
+static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) {
+    PyObject *attr;
+#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP
+    __Pyx_TypeName type_name;
+    PyTypeObject *tp = Py_TYPE(obj);
+    PyObject *descr;
+    descrgetfunc f = NULL;
+    PyObject **dictptr, *dict;
+    int meth_found = 0;
+    assert (*method == NULL);
+    if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) {
+        attr = __Pyx_PyObject_GetAttrStr(obj, name);
+        goto try_unpack;
+    }
+    if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) {
+        return 0;
+    }
+    descr = _PyType_Lookup(tp, name);
+    if (likely(descr != NULL)) {
+        Py_INCREF(descr);
+#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR
+        if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR))
+#elif PY_MAJOR_VERSION >= 3
+        #ifdef __Pyx_CyFunction_USED
+        if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr)))
+        #else
+        if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type)))
+        #endif
+#else
+        #ifdef __Pyx_CyFunction_USED
+        if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr)))
+        #else
+        if (likely(PyFunction_Check(descr)))
+        #endif
+#endif
+        {
+            meth_found = 1;
+        } else {
+            f = Py_TYPE(descr)->tp_descr_get;
+            if (f != NULL && PyDescr_IsData(descr)) {
+                attr = f(descr, obj, (PyObject *)Py_TYPE(obj));
+                Py_DECREF(descr);
+                goto try_unpack;
+            }
+        }
+    }
+    dictptr = _PyObject_GetDictPtr(obj);
+    if (dictptr != NULL && (dict = *dictptr) != NULL) {
+        Py_INCREF(dict);
+        attr = __Pyx_PyDict_GetItemStr(dict, name);
+        if (attr != NULL) {
+            Py_INCREF(attr);
+            Py_DECREF(dict);
+            Py_XDECREF(descr);
+            goto try_unpack;
+        }
+        Py_DECREF(dict);
+    }
+    if (meth_found) {
+        *method = descr;
+        return 1;
+    }
+    if (f != NULL) {
+        attr = f(descr, obj, (PyObject *)Py_TYPE(obj));
+        Py_DECREF(descr);
+        goto try_unpack;
+    }
+    if (likely(descr != NULL)) {
+        *method = descr;
+        return 0;
+    }
+    type_name = __Pyx_PyType_GetName(tp);
+    PyErr_Format(PyExc_AttributeError,
+#if PY_MAJOR_VERSION >= 3
+                 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'",
+                 type_name, name);
+#else
+                 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'",
+                 type_name, PyString_AS_STRING(name));
+#endif
+    __Pyx_DECREF_TypeName(type_name);
+    return 0;
+#else
+    attr = __Pyx_PyObject_GetAttrStr(obj, name);
+    goto try_unpack;
+#endif
+try_unpack:
+#if CYTHON_UNPACK_METHODS
+    if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) {
+        PyObject *function = PyMethod_GET_FUNCTION(attr);
+        Py_INCREF(function);
+        Py_DECREF(attr);
+        *method = function;
+        return 1;
+    }
+#endif
+    *method = attr;
+    return 0;
+}
+
+/* PyObjectCallMethod1 */
+#if !(CYTHON_VECTORCALL && __PYX_LIMITED_VERSION_HEX >= 0x030C00A2)
+static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) {
+    PyObject *result = __Pyx_PyObject_CallOneArg(method, arg);
+    Py_DECREF(method);
+    return result;
+}
+#endif
+static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
+#if CYTHON_VECTORCALL && __PYX_LIMITED_VERSION_HEX >= 0x030C00A2
+    PyObject *args[2] = {obj, arg};
+    (void) __Pyx_PyObject_GetMethod;
+    (void) __Pyx_PyObject_CallOneArg;
+    (void) __Pyx_PyObject_Call2Args;
+    return PyObject_VectorcallMethod(method_name, args, 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
+#else
+    PyObject *method = NULL, *result;
+    int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
+    if (likely(is_method)) {
+        result = __Pyx_PyObject_Call2Args(method, obj, arg);
+        Py_DECREF(method);
+        return result;
+    }
+    if (unlikely(!method)) return NULL;
+    return __Pyx__PyObject_CallMethod1(method, arg);
+#endif
+}
+
+/* append */
+static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
+    if (likely(PyList_CheckExact(L))) {
+        if (unlikely(__Pyx_PyList_Append(L, x) < 0)) return -1;
+    } else {
+        PyObject* retval = __Pyx_PyObject_CallMethod1(L, __pyx_n_s_append, x);
+        if (unlikely(!retval))
+            return -1;
+        Py_DECREF(retval);
+    }
+    return 0;
+}
+
+/* GetAttr */
+static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) {
+#if CYTHON_USE_TYPE_SLOTS
+#if PY_MAJOR_VERSION >= 3
+    if (likely(PyUnicode_Check(n)))
+#else
+    if (likely(PyString_Check(n)))
+#endif
+        return __Pyx_PyObject_GetAttrStr(o, n);
+#endif
+    return PyObject_GetAttr(o, n);
+}
+
+/* HasAttr */
+static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) {
+    PyObject *r;
+    if (unlikely(!__Pyx_PyBaseString_Check(n))) {
+        PyErr_SetString(PyExc_TypeError,
+                        "hasattr(): attribute name must be string");
+        return -1;
+    }
+    r = __Pyx_GetAttr(o, n);
+    if (!r) {
+        PyErr_Clear();
+        return 0;
+    } else {
+        Py_DECREF(r);
+        return 1;
+    }
+}
+
+/* PyIntBinop */
+#if !CYTHON_COMPILING_IN_PYPY
+static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) {
+    CYTHON_MAYBE_UNUSED_VAR(intval);
+    CYTHON_MAYBE_UNUSED_VAR(inplace);
+    CYTHON_UNUSED_VAR(zerodivision_check);
+    #if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_CheckExact(op1))) {
+        const long b = intval;
+        long x;
+        long a = PyInt_AS_LONG(op1);
+        
+            x = (long)((unsigned long)a + (unsigned long)b);
+            if (likely((x^a) >= 0 || (x^b) >= 0))
+                return PyInt_FromLong(x);
+            return PyLong_Type.tp_as_number->nb_add(op1, op2);
+    }
+    #endif
+    #if CYTHON_USE_PYLONG_INTERNALS
+    if (likely(PyLong_CheckExact(op1))) {
+        const long b = intval;
+        long a, x;
+#ifdef HAVE_LONG_LONG
+        const PY_LONG_LONG llb = intval;
+        PY_LONG_LONG lla, llx;
+#endif
+        if (unlikely(__Pyx_PyLong_IsZero(op1))) {
+            return __Pyx_NewRef(op2);
+        }
+        if (likely(__Pyx_PyLong_IsCompact(op1))) {
+            a = __Pyx_PyLong_CompactValue(op1);
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(op1);
+            const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1);
+            switch (size) {
+                case -2:
+                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
+                        lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case 2:
+                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
+                        lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case -3:
+                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
+                        lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case 3:
+                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
+                        lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case -4:
+                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
+                        lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case 4:
+                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
+                        lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                default: return PyLong_Type.tp_as_number->nb_add(op1, op2);
+            }
+        }
+                x = a + b;
+            return PyLong_FromLong(x);
+#ifdef HAVE_LONG_LONG
+        long_long:
+                llx = lla + llb;
+            return PyLong_FromLongLong(llx);
+#endif
+        
+        
+    }
+    #endif
+    if (PyFloat_CheckExact(op1)) {
+        const long b = intval;
+#if CYTHON_COMPILING_IN_LIMITED_API
+        double a = __pyx_PyFloat_AsDouble(op1);
+#else
+        double a = PyFloat_AS_DOUBLE(op1);
+#endif
+            double result;
+            
+            PyFPE_START_PROTECT("add", return NULL)
+            result = ((double)a) + (double)b;
+            PyFPE_END_PROTECT(result)
+            return PyFloat_FromDouble(result);
+    }
+    return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2);
+}
+#endif
+
+/* PyObjectLookupSpecial */
+#if CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PyObject* __Pyx__PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name, int with_error) {
+    PyObject *res;
+    PyTypeObject *tp = Py_TYPE(obj);
+#if PY_MAJOR_VERSION < 3
+    if (unlikely(PyInstance_Check(obj)))
+        return with_error ? __Pyx_PyObject_GetAttrStr(obj, attr_name) : __Pyx_PyObject_GetAttrStrNoError(obj, attr_name);
+#endif
+    res = _PyType_Lookup(tp, attr_name);
+    if (likely(res)) {
+        descrgetfunc f = Py_TYPE(res)->tp_descr_get;
+        if (!f) {
+            Py_INCREF(res);
+        } else {
+            res = f(res, obj, (PyObject *)tp);
+        }
+    } else if (with_error) {
+        PyErr_SetObject(PyExc_AttributeError, attr_name);
+    }
+    return res;
+}
+#endif
+
+/* RaiseNoneIterError */
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+}
+
+/* UnpackUnboundCMethod */
+static PyObject *__Pyx_SelflessCall(PyObject *method, PyObject *args, PyObject *kwargs) {
+    PyObject *result;
+    PyObject *selfless_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args));
+    if (unlikely(!selfless_args)) return NULL;
+    result = PyObject_Call(method, selfless_args, kwargs);
+    Py_DECREF(selfless_args);
+    return result;
+}
+static PyMethodDef __Pyx_UnboundCMethod_Def = {
+     "CythonUnboundCMethod",
+     __PYX_REINTERPRET_FUNCION(PyCFunction, __Pyx_SelflessCall),
+     METH_VARARGS | METH_KEYWORDS,
+     NULL
+};
+static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) {
+    PyObject *method;
+    method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name);
+    if (unlikely(!method))
+        return -1;
+    target->method = method;
+#if CYTHON_COMPILING_IN_CPYTHON
+    #if PY_MAJOR_VERSION >= 3
+    if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type)))
+    #else
+    if (likely(!__Pyx_CyOrPyCFunction_Check(method)))
+    #endif
+    {
+        PyMethodDescrObject *descr = (PyMethodDescrObject*) method;
+        target->func = descr->d_method->ml_meth;
+        target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS);
+    } else
+#endif
+#if CYTHON_COMPILING_IN_PYPY
+#else
+    if (PyCFunction_Check(method))
+#endif
+    {
+        PyObject *self;
+        int self_found;
+#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY
+        self = PyObject_GetAttrString(method, "__self__");
+        if (!self) {
+            PyErr_Clear();
+        }
+#else
+        self = PyCFunction_GET_SELF(method);
+#endif
+        self_found = (self && self != Py_None);
+#if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY
+        Py_XDECREF(self);
+#endif
+        if (self_found) {
+            PyObject *unbound_method = PyCFunction_New(&__Pyx_UnboundCMethod_Def, method);
+            if (unlikely(!unbound_method)) return -1;
+            Py_DECREF(method);
+            target->method = unbound_method;
+        }
+    }
+    return 0;
+}
+
+/* CallUnboundCMethod2 */
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030600B1
+static CYTHON_INLINE PyObject *__Pyx_CallUnboundCMethod2(__Pyx_CachedCFunction *cfunc, PyObject *self, PyObject *arg1, PyObject *arg2) {
+    if (likely(cfunc->func)) {
+        PyObject *args[2] = {arg1, arg2};
+        if (cfunc->flag == METH_FASTCALL) {
+            #if PY_VERSION_HEX >= 0x030700A0
+            return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, args, 2);
+            #else
+            return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL);
+            #endif
+        }
+        #if PY_VERSION_HEX >= 0x030700A0
+        if (cfunc->flag == (METH_FASTCALL | METH_KEYWORDS))
+            return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, 2, NULL);
+        #endif
+    }
+    return __Pyx__CallUnboundCMethod2(cfunc, self, arg1, arg2);
+}
+#endif
+static PyObject* __Pyx__CallUnboundCMethod2(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg1, PyObject* arg2){
+    PyObject *args, *result = NULL;
+    if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL;
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (cfunc->func && (cfunc->flag & METH_VARARGS)) {
+        args = PyTuple_New(2);
+        if (unlikely(!args)) goto bad;
+        Py_INCREF(arg1);
+        PyTuple_SET_ITEM(args, 0, arg1);
+        Py_INCREF(arg2);
+        PyTuple_SET_ITEM(args, 1, arg2);
+        if (cfunc->flag & METH_KEYWORDS)
+            result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL);
+        else
+            result = (*cfunc->func)(self, args);
+    } else {
+        args = PyTuple_New(3);
+        if (unlikely(!args)) goto bad;
+        Py_INCREF(self);
+        PyTuple_SET_ITEM(args, 0, self);
+        Py_INCREF(arg1);
+        PyTuple_SET_ITEM(args, 1, arg1);
+        Py_INCREF(arg2);
+        PyTuple_SET_ITEM(args, 2, arg2);
+        result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
+    }
+#else
+    args = PyTuple_Pack(3, self, arg1, arg2);
+    if (unlikely(!args)) goto bad;
+    result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
+#endif
+bad:
+    Py_XDECREF(args);
+    return result;
+}
+
+/* CallUnboundCMethod1 */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg) {
+    if (likely(cfunc->func)) {
+        int flag = cfunc->flag;
+        if (flag == METH_O) {
+            return (*(cfunc->func))(self, arg);
+        } else if ((PY_VERSION_HEX >= 0x030600B1) && flag == METH_FASTCALL) {
+            #if PY_VERSION_HEX >= 0x030700A0
+                return (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)cfunc->func)(self, &arg, 1);
+            #else
+                return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL);
+            #endif
+        } else if ((PY_VERSION_HEX >= 0x030700A0) && flag == (METH_FASTCALL | METH_KEYWORDS)) {
+            return (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)cfunc->func)(self, &arg, 1, NULL);
+        }
+    }
+    return __Pyx__CallUnboundCMethod1(cfunc, self, arg);
+}
+#endif
+static PyObject* __Pyx__CallUnboundCMethod1(__Pyx_CachedCFunction* cfunc, PyObject* self, PyObject* arg){
+    PyObject *args, *result = NULL;
+    if (unlikely(!cfunc->func && !cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL;
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (cfunc->func && (cfunc->flag & METH_VARARGS)) {
+        args = PyTuple_New(1);
+        if (unlikely(!args)) goto bad;
+        Py_INCREF(arg);
+        PyTuple_SET_ITEM(args, 0, arg);
+        if (cfunc->flag & METH_KEYWORDS)
+            result = (*(PyCFunctionWithKeywords)(void*)(PyCFunction)cfunc->func)(self, args, NULL);
+        else
+            result = (*cfunc->func)(self, args);
+    } else {
+        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);
+        result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
+    }
+#else
+    args = PyTuple_Pack(2, self, arg);
+    if (unlikely(!args)) goto bad;
+    result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
+#endif
+bad:
+    Py_XDECREF(args);
+    return result;
+}
+
+/* py_dict_pop */
+static CYTHON_INLINE PyObject *__Pyx_PyDict_Pop(PyObject *d, PyObject *key, PyObject *default_value) {
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B3 & PY_VERSION_HEX < 0x030d0000
+    if ((1)) {
+        return _PyDict_Pop(d, key, default_value);
+    } else
+#endif
+    if (default_value) {
+        return __Pyx_CallUnboundCMethod2(&__pyx_umethod_PyDict_Type_pop, d, key, default_value);
+    } else {
+        return __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_pop, d, key);
+    }
+}
+
+/* pyfrozenset_new */
+static CYTHON_INLINE PyObject* __Pyx_PyFrozenSet_New(PyObject* it) {
+    if (it) {
+        PyObject* result;
+#if CYTHON_COMPILING_IN_PYPY
+        PyObject* args;
+        args = PyTuple_Pack(1, it);
+        if (unlikely(!args))
+            return NULL;
+        result = PyObject_Call((PyObject*)&PyFrozenSet_Type, args, NULL);
+        Py_DECREF(args);
+        return result;
+#else
+        if (PyFrozenSet_CheckExact(it)) {
+            Py_INCREF(it);
+            return it;
+        }
+        result = PyFrozenSet_New(it);
+        if (unlikely(!result))
+            return NULL;
+        if ((PY_VERSION_HEX >= 0x031000A1) || likely(PySet_GET_SIZE(result)))
+            return result;
+        Py_DECREF(result);
+#endif
+    }
+#if CYTHON_USE_TYPE_SLOTS
+    return PyFrozenSet_Type.tp_new(&PyFrozenSet_Type, __pyx_empty_tuple, NULL);
+#else
+    return PyObject_Call((PyObject*)&PyFrozenSet_Type, __pyx_empty_tuple, NULL);
+#endif
+}
+
+/* py_set_discard_unhashable */
+static int __Pyx_PySet_DiscardUnhashable(PyObject *set, PyObject *key) {
+    PyObject *tmpkey;
+    int rv;
+    if (likely(!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError)))
+        return -1;
+    PyErr_Clear();
+    tmpkey = __Pyx_PyFrozenSet_New(key);
+    if (tmpkey == NULL)
+        return -1;
+    rv = PySet_Discard(set, tmpkey);
+    Py_DECREF(tmpkey);
+    return rv;
+}
+
+/* py_set_remove */
+static int __Pyx_PySet_RemoveNotFound(PyObject *set, PyObject *key, int found) {
+    if (unlikely(found < 0)) {
+        found = __Pyx_PySet_DiscardUnhashable(set, key);
+    }
+    if (likely(found == 0)) {
+        PyObject *tup;
+        tup = PyTuple_Pack(1, key);
+        if (!tup)
+            return -1;
+        PyErr_SetObject(PyExc_KeyError, tup);
+        Py_DECREF(tup);
+        return -1;
+    }
+    return found;
+}
+static CYTHON_INLINE int __Pyx_PySet_Remove(PyObject *set, PyObject *key) {
+    int found = PySet_Discard(set, key);
+    if (unlikely(found != 1)) {
+        return __Pyx_PySet_RemoveNotFound(set, key, found);
+    }
+    return 0;
+}
+
+/* RaiseClosureNameError */
+static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
+    PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
+}
+
+/* set_iter */
+static CYTHON_INLINE PyObject* __Pyx_set_iterator(PyObject* iterable, int is_set,
+                                                  Py_ssize_t* p_orig_length, int* p_source_is_set) {
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000
+    is_set = is_set || likely(PySet_CheckExact(iterable) || PyFrozenSet_CheckExact(iterable));
+    *p_source_is_set = is_set;
+    if (likely(is_set)) {
+        *p_orig_length = PySet_Size(iterable);
+        Py_INCREF(iterable);
+        return iterable;
+    }
+#else
+    CYTHON_UNUSED_VAR(is_set);
+    *p_source_is_set = 0;
+#endif
+    *p_orig_length = 0;
+    return PyObject_GetIter(iterable);
+}
+static CYTHON_INLINE int __Pyx_set_iter_next(
+        PyObject* iter_obj, Py_ssize_t orig_length,
+        Py_ssize_t* ppos, PyObject **value,
+        int source_is_set) {
+    if (!CYTHON_COMPILING_IN_CPYTHON || PY_VERSION_HEX >= 0x030d0000 || unlikely(!source_is_set)) {
+        *value = PyIter_Next(iter_obj);
+        if (unlikely(!*value)) {
+            return __Pyx_IterFinish();
+        }
+        CYTHON_UNUSED_VAR(orig_length);
+        CYTHON_UNUSED_VAR(ppos);
+        return 1;
+    }
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000
+    if (unlikely(PySet_GET_SIZE(iter_obj) != orig_length)) {
+        PyErr_SetString(
+            PyExc_RuntimeError,
+            "set changed size during iteration");
+        return -1;
+    }
+    {
+        Py_hash_t hash;
+        int ret = _PySet_NextEntry(iter_obj, ppos, value, &hash);
+        assert (ret != -1);
+        if (likely(ret)) {
+            Py_INCREF(*value);
+            return 1;
+        }
+    }
+#endif
+    return 0;
+}
+
+/* CallUnboundCMethod0 */
+static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) {
+    PyObject *args, *result = NULL;
+    if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL;
+#if CYTHON_ASSUME_SAFE_MACROS
+    args = PyTuple_New(1);
+    if (unlikely(!args)) goto bad;
+    Py_INCREF(self);
+    PyTuple_SET_ITEM(args, 0, self);
+#else
+    args = PyTuple_Pack(1, self);
+    if (unlikely(!args)) goto bad;
+#endif
+    result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
+    Py_DECREF(args);
+bad:
+    return result;
+}
+
+/* py_dict_values */
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Values(PyObject* d) {
+    if (PY_MAJOR_VERSION >= 3)
+        return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyDict_Type_values, d);
+    else
+        return PyDict_Values(d);
+}
+
+/* PyFloatBinop */
+#if !CYTHON_COMPILING_IN_PYPY
+static PyObject* __Pyx_PyFloat_AddObjC(PyObject *op1, PyObject *op2, double floatval, int inplace, int zerodivision_check) {
+    const double b = floatval;
+    double a, result;
+    CYTHON_UNUSED_VAR(inplace);
+    CYTHON_UNUSED_VAR(zerodivision_check);
+    if (likely(PyFloat_CheckExact(op1))) {
+#if CYTHON_COMPILING_IN_LIMITED_API
+        a = __pyx_PyFloat_AsDouble(op1);
+#else
+        a = PyFloat_AS_DOUBLE(op1);
+#endif
+        
+    } else
+    #if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_CheckExact(op1))) {
+        a = (double) PyInt_AS_LONG(op1);
+        
+    } else
+    #endif
+    if (likely(PyLong_CheckExact(op1))) {
+        #if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsZero(op1)) {
+            a = 0.0;
+            
+        } else if (__Pyx_PyLong_IsCompact(op1)) {
+            a = (double) __Pyx_PyLong_CompactValue(op1);
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(op1);
+            const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1);
+            switch (size) {
+                case -2:
+                case 2:
+                    if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (1 * PyLong_SHIFT < 53))) {
+                        a = (double) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        if ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53) || (a < (double) ((PY_LONG_LONG)1 << 53))) {
+                            if (size == -2)
+                                a = -a;
+                            break;
+                        }
+                    }
+                    CYTHON_FALLTHROUGH;
+                case -3:
+                case 3:
+                    if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53))) {
+                        a = (double) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        if ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53) || (a < (double) ((PY_LONG_LONG)1 << 53))) {
+                            if (size == -3)
+                                a = -a;
+                            break;
+                        }
+                    }
+                    CYTHON_FALLTHROUGH;
+                case -4:
+                case 4:
+                    if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53))) {
+                        a = (double) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        if ((8 * sizeof(unsigned long) < 53) || (4 * PyLong_SHIFT < 53) || (a < (double) ((PY_LONG_LONG)1 << 53))) {
+                            if (size == -4)
+                                a = -a;
+                            break;
+                        }
+                    }
+                    CYTHON_FALLTHROUGH;
+                default:
+        #endif
+                    a = PyLong_AsDouble(op1);
+                    if (unlikely(a == -1.0 && PyErr_Occurred())) return NULL;
+        #if CYTHON_USE_PYLONG_INTERNALS
+            }
+        }
+        #endif
+    } else {
+        return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2);
+    }
+        PyFPE_START_PROTECT("add", return NULL)
+        result = a + b;
+        PyFPE_END_PROTECT(result)
+        return PyFloat_FromDouble(result);
+}
+#endif
+
+/* py_dict_keys */
+static CYTHON_INLINE PyObject* __Pyx_PyDict_Keys(PyObject* d) {
+    if (PY_MAJOR_VERSION >= 3)
+        return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyDict_Type_keys, d);
+    else
+        return PyDict_Keys(d);
+}
+
+/* DictGetItem */
+#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
+static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
+    PyObject *value;
+    value = PyDict_GetItemWithError(d, key);
+    if (unlikely(!value)) {
+        if (!PyErr_Occurred()) {
+            if (unlikely(PyTuple_Check(key))) {
+                PyObject* args = PyTuple_Pack(1, key);
+                if (likely(args)) {
+                    PyErr_SetObject(PyExc_KeyError, args);
+                    Py_DECREF(args);
+                }
+            } else {
+                PyErr_SetObject(PyExc_KeyError, key);
+            }
+        }
+        return NULL;
+    }
+    Py_INCREF(value);
+    return value;
+}
+#endif
+
+/* IterNext */
+static PyObject *__Pyx_PyIter_Next2Default(PyObject* defval) {
+    PyObject* exc_type;
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    exc_type = __Pyx_PyErr_CurrentExceptionType();
+    if (unlikely(exc_type)) {
+        if (!defval || unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)))
+            return NULL;
+        __Pyx_PyErr_Clear();
+        Py_INCREF(defval);
+        return defval;
+    }
+    if (defval) {
+        Py_INCREF(defval);
+        return defval;
+    }
+    __Pyx_PyErr_SetNone(PyExc_StopIteration);
+    return NULL;
+}
+static void __Pyx_PyIter_Next_ErrorNoIterator(PyObject *iterator) {
+    __Pyx_TypeName iterator_type_name = __Pyx_PyType_GetName(Py_TYPE(iterator));
+    PyErr_Format(PyExc_TypeError,
+        __Pyx_FMT_TYPENAME " object is not an iterator", iterator_type_name);
+    __Pyx_DECREF_TypeName(iterator_type_name);
+}
+static CYTHON_INLINE PyObject *__Pyx_PyIter_Next2(PyObject* iterator, PyObject* defval) {
+    PyObject* next;
+    iternextfunc iternext = Py_TYPE(iterator)->tp_iternext;
+    if (likely(iternext)) {
+#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+        next = iternext(iterator);
+        if (likely(next))
+            return next;
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000
+        if (unlikely(iternext == &_PyObject_NextNotImplemented))
+            return NULL;
+#endif
+#else
+        next = PyIter_Next(iterator);
+        if (likely(next))
+            return next;
+#endif
+    } else if (CYTHON_USE_TYPE_SLOTS || unlikely(!PyIter_Check(iterator))) {
+        __Pyx_PyIter_Next_ErrorNoIterator(iterator);
+        return NULL;
+    }
+#if !CYTHON_USE_TYPE_SLOTS
+    else {
+        next = PyIter_Next(iterator);
+        if (likely(next))
+            return next;
+    }
+#endif
+    return __Pyx_PyIter_Next2Default(defval);
+}
+
+/* GetAttr3 */
+#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1
+static PyObject *__Pyx_GetAttr3Default(PyObject *d) {
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError)))
+        return NULL;
+    __Pyx_PyErr_Clear();
+    Py_INCREF(d);
+    return d;
+}
+#endif
+static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) {
+    PyObject *r;
+#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1
+    int res = PyObject_GetOptionalAttr(o, n, &r);
+    return (res != 0) ? r : __Pyx_NewRef(d);
+#else
+  #if CYTHON_USE_TYPE_SLOTS
+    if (likely(PyString_Check(n))) {
+        r = __Pyx_PyObject_GetAttrStrNoError(o, n);
+        if (unlikely(!r) && likely(!PyErr_Occurred())) {
+            r = __Pyx_NewRef(d);
+        }
+        return r;
+    }
+  #endif
+    r = PyObject_GetAttr(o, n);
+    return (likely(r)) ? r : __Pyx_GetAttr3Default(d);
+#endif
+}
+
+/* WriteUnraisableException */
+static void __Pyx_WriteUnraisable(const char *name, int clineno,
+                                  int lineno, const char *filename,
+                                  int full_traceback, int nogil) {
+    PyObject *old_exc, *old_val, *old_tb;
+    PyObject *ctx;
+    __Pyx_PyThreadState_declare
+#ifdef WITH_THREAD
+    PyGILState_STATE state;
+    if (nogil)
+        state = PyGILState_Ensure();
+    else state = (PyGILState_STATE)0;
+#endif
+    CYTHON_UNUSED_VAR(clineno);
+    CYTHON_UNUSED_VAR(lineno);
+    CYTHON_UNUSED_VAR(filename);
+    CYTHON_MAYBE_UNUSED_VAR(nogil);
+    __Pyx_PyThreadState_assign
+    __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(0);
+    }
+    #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);
+    }
+#ifdef WITH_THREAD
+    if (nogil)
+        PyGILState_Release(state);
+#endif
+}
+
+/* PyIntCompare */
+static CYTHON_INLINE int __Pyx_PyInt_BoolEqObjC(PyObject *op1, PyObject *op2, long intval, long inplace) {
+    CYTHON_MAYBE_UNUSED_VAR(intval);
+    CYTHON_UNUSED_VAR(inplace);
+    if (op1 == op2) {
+        return 1;
+    }
+    #if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_CheckExact(op1))) {
+        const long b = intval;
+        long a = PyInt_AS_LONG(op1);
+        return (a == b);
+    }
+    #endif
+    #if CYTHON_USE_PYLONG_INTERNALS
+    if (likely(PyLong_CheckExact(op1))) {
+        int unequal;
+        unsigned long uintval;
+        Py_ssize_t size = __Pyx_PyLong_DigitCount(op1);
+        const digit* digits = __Pyx_PyLong_Digits(op1);
+        if (intval == 0) {
+            return (__Pyx_PyLong_IsZero(op1) == 1);
+        } else if (intval < 0) {
+            if (__Pyx_PyLong_IsNonNeg(op1))
+                return 0;
+            intval = -intval;
+        } else {
+            if (__Pyx_PyLong_IsNeg(op1))
+                return 0;
+        }
+        uintval = (unsigned long) intval;
+#if PyLong_SHIFT * 4 < SIZEOF_LONG*8
+        if (uintval >> (PyLong_SHIFT * 4)) {
+            unequal = (size != 5) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
+                 | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[3] != ((uintval >> (3 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[4] != ((uintval >> (4 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK));
+        } else
+#endif
+#if PyLong_SHIFT * 3 < SIZEOF_LONG*8
+        if (uintval >> (PyLong_SHIFT * 3)) {
+            unequal = (size != 4) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
+                 | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[3] != ((uintval >> (3 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK));
+        } else
+#endif
+#if PyLong_SHIFT * 2 < SIZEOF_LONG*8
+        if (uintval >> (PyLong_SHIFT * 2)) {
+            unequal = (size != 3) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
+                 | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK));
+        } else
+#endif
+#if PyLong_SHIFT * 1 < SIZEOF_LONG*8
+        if (uintval >> (PyLong_SHIFT * 1)) {
+            unequal = (size != 2) || (digits[0] != (uintval & (unsigned long) PyLong_MASK))
+                 | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK));
+        } else
+#endif
+            unequal = (size != 1) || (((unsigned long) digits[0]) != (uintval & (unsigned long) PyLong_MASK));
+        return (unequal == 0);
+    }
+    #endif
+    if (PyFloat_CheckExact(op1)) {
+        const long b = intval;
+#if CYTHON_COMPILING_IN_LIMITED_API
+        double a = __pyx_PyFloat_AsDouble(op1);
+#else
+        double a = PyFloat_AS_DOUBLE(op1);
+#endif
+        return ((double)a == (double)b);
+    }
+    return __Pyx_PyObject_IsTrueAndDecref(
+        PyObject_RichCompare(op1, op2, Py_EQ));
+}
+
+/* pep479 */
+static void __Pyx_Generator_Replace_StopIteration(int in_async_gen) {
+    PyObject *exc, *val, *tb, *cur_exc;
+    __Pyx_PyThreadState_declare
+    #ifdef __Pyx_StopAsyncIteration_USED
+    int is_async_stopiteration = 0;
+    #endif
+    CYTHON_MAYBE_UNUSED_VAR(in_async_gen);
+    cur_exc = PyErr_Occurred();
+    if (likely(!__Pyx_PyErr_GivenExceptionMatches(cur_exc, PyExc_StopIteration))) {
+        #ifdef __Pyx_StopAsyncIteration_USED
+        if (in_async_gen && unlikely(__Pyx_PyErr_GivenExceptionMatches(cur_exc, __Pyx_PyExc_StopAsyncIteration))) {
+            is_async_stopiteration = 1;
+        } else
+        #endif
+            return;
+    }
+    __Pyx_PyThreadState_assign
+    __Pyx_GetException(&exc, &val, &tb);
+    Py_XDECREF(exc);
+    Py_XDECREF(val);
+    Py_XDECREF(tb);
+    PyErr_SetString(PyExc_RuntimeError,
+        #ifdef __Pyx_StopAsyncIteration_USED
+        is_async_stopiteration ? "async generator raised StopAsyncIteration" :
+        in_async_gen ? "async generator raised StopIteration" :
+        #endif
+        "generator raised StopIteration");
+}
+
+/* SliceObject */
+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) {
+    __Pyx_TypeName obj_type_name;
+#if CYTHON_USE_TYPE_SLOTS
+    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))
+                    goto bad;
+                PyErr_Clear();
+            }
+        }
+        return ms->sq_slice(obj, cstart, cstop);
+    }
+#else
+    CYTHON_UNUSED_VAR(wraparound);
+#endif
+    mp = Py_TYPE(obj)->tp_as_mapping;
+    if (likely(mp && mp->mp_subscript))
+#else
+    CYTHON_UNUSED_VAR(wraparound);
+#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_USE_TYPE_SLOTS
+        result = mp->mp_subscript(obj, py_slice);
+#else
+        result = PyObject_GetItem(obj, py_slice);
+#endif
+        if (!_py_slice) {
+            Py_DECREF(py_slice);
+        }
+        return result;
+    }
+    obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj));
+    PyErr_Format(PyExc_TypeError,
+        "'" __Pyx_FMT_TYPENAME "' object is unsliceable", obj_type_name);
+    __Pyx_DECREF_TypeName(obj_type_name);
+bad:
+    return NULL;
+}
+
+/* Import */
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
+    PyObject *module = 0;
+    PyObject *empty_dict = 0;
+    PyObject *empty_list = 0;
+    #if PY_MAJOR_VERSION < 3
+    PyObject *py_import;
+    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
+    if (unlikely(!py_import))
+        goto bad;
+    if (!from_list) {
+        empty_list = PyList_New(0);
+        if (unlikely(!empty_list))
+            goto bad;
+        from_list = empty_list;
+    }
+    #endif
+    empty_dict = PyDict_New();
+    if (unlikely(!empty_dict))
+        goto bad;
+    {
+        #if PY_MAJOR_VERSION >= 3
+        if (level == -1) {
+            if (strchr(__Pyx_MODULE_NAME, '.') != NULL) {
+                module = PyImport_ImportModuleLevelObject(
+                    name, __pyx_d, empty_dict, from_list, 1);
+                if (unlikely(!module)) {
+                    if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError)))
+                        goto bad;
+                    PyErr_Clear();
+                }
+            }
+            level = 0;
+        }
+        #endif
+        if (!module) {
+            #if PY_MAJOR_VERSION < 3
+            PyObject *py_level = PyInt_FromLong(level);
+            if (unlikely(!py_level))
+                goto bad;
+            module = PyObject_CallFunctionObjArgs(py_import,
+                name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL);
+            Py_DECREF(py_level);
+            #else
+            module = PyImport_ImportModuleLevelObject(
+                name, __pyx_d, empty_dict, from_list, level);
+            #endif
+        }
+    }
+bad:
+    Py_XDECREF(empty_dict);
+    Py_XDECREF(empty_list);
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(py_import);
+    #endif
+    return module;
+}
+
+/* ImportDottedModule */
+#if PY_MAJOR_VERSION >= 3
+static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) {
+    PyObject *partial_name = NULL, *slice = NULL, *sep = NULL;
+    if (unlikely(PyErr_Occurred())) {
+        PyErr_Clear();
+    }
+    if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) {
+        partial_name = name;
+    } else {
+        slice = PySequence_GetSlice(parts_tuple, 0, count);
+        if (unlikely(!slice))
+            goto bad;
+        sep = PyUnicode_FromStringAndSize(".", 1);
+        if (unlikely(!sep))
+            goto bad;
+        partial_name = PyUnicode_Join(sep, slice);
+    }
+    PyErr_Format(
+#if PY_MAJOR_VERSION < 3
+        PyExc_ImportError,
+        "No module named '%s'", PyString_AS_STRING(partial_name));
+#else
+#if PY_VERSION_HEX >= 0x030600B1
+        PyExc_ModuleNotFoundError,
+#else
+        PyExc_ImportError,
+#endif
+        "No module named '%U'", partial_name);
+#endif
+bad:
+    Py_XDECREF(sep);
+    Py_XDECREF(slice);
+    Py_XDECREF(partial_name);
+    return NULL;
+}
+#endif
+#if PY_MAJOR_VERSION >= 3
+static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) {
+    PyObject *imported_module;
+#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM  < 0x07030400)
+    PyObject *modules = PyImport_GetModuleDict();
+    if (unlikely(!modules))
+        return NULL;
+    imported_module = __Pyx_PyDict_GetItemStr(modules, name);
+    Py_XINCREF(imported_module);
+#else
+    imported_module = PyImport_GetModule(name);
+#endif
+    return imported_module;
+}
+#endif
+#if PY_MAJOR_VERSION >= 3
+static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) {
+    Py_ssize_t i, nparts;
+    nparts = PyTuple_GET_SIZE(parts_tuple);
+    for (i=1; i < nparts && module; i++) {
+        PyObject *part, *submodule;
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+        part = PyTuple_GET_ITEM(parts_tuple, i);
+#else
+        part = PySequence_ITEM(parts_tuple, i);
+#endif
+        submodule = __Pyx_PyObject_GetAttrStrNoError(module, part);
+#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
+        Py_DECREF(part);
+#endif
+        Py_DECREF(module);
+        module = submodule;
+    }
+    if (unlikely(!module)) {
+        return __Pyx__ImportDottedModule_Error(name, parts_tuple, i);
+    }
+    return module;
+}
+#endif
+static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) {
+#if PY_MAJOR_VERSION < 3
+    PyObject *module, *from_list, *star = __pyx_n_s__38;
+    CYTHON_UNUSED_VAR(parts_tuple);
+    from_list = PyList_New(1);
+    if (unlikely(!from_list))
+        return NULL;
+    Py_INCREF(star);
+    PyList_SET_ITEM(from_list, 0, star);
+    module = __Pyx_Import(name, from_list, 0);
+    Py_DECREF(from_list);
+    return module;
+#else
+    PyObject *imported_module;
+    PyObject *module = __Pyx_Import(name, NULL, 0);
+    if (!parts_tuple || unlikely(!module))
+        return module;
+    imported_module = __Pyx__ImportDottedModule_Lookup(name);
+    if (likely(imported_module)) {
+        Py_DECREF(module);
+        return imported_module;
+    }
+    PyErr_Clear();
+    return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple);
+#endif
+}
+static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) {
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1
+    PyObject *module = __Pyx__ImportDottedModule_Lookup(name);
+    if (likely(module)) {
+        PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec);
+        if (likely(spec)) {
+            PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing);
+            if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) {
+                Py_DECREF(spec);
+                spec = NULL;
+            }
+            Py_XDECREF(unsafe);
+        }
+        if (likely(!spec)) {
+            PyErr_Clear();
+            return module;
+        }
+        Py_DECREF(spec);
+        Py_DECREF(module);
+    } else if (PyErr_Occurred()) {
+        PyErr_Clear();
+    }
+#endif
+    return __Pyx__ImportDottedModule(name, parts_tuple);
+}
+
+/* PyObjectSetAttrStr */
+#if CYTHON_USE_TYPE_SLOTS
+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);
+}
+#endif
+
+/* SwapException */
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+  #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    tmp_value = exc_info->exc_value;
+    exc_info->exc_value = *value;
+    if (tmp_value == NULL || tmp_value == Py_None) {
+        Py_XDECREF(tmp_value);
+        tmp_value = NULL;
+        tmp_type = NULL;
+        tmp_tb = NULL;
+    } else {
+        tmp_type = (PyObject*) Py_TYPE(tmp_value);
+        Py_INCREF(tmp_type);
+        #if CYTHON_COMPILING_IN_CPYTHON
+        tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback;
+        Py_XINCREF(tmp_tb);
+        #else
+        tmp_tb = PyException_GetTraceback(tmp_value);
+        #endif
+    }
+  #elif CYTHON_USE_EXC_INFO_STACK
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    tmp_type = exc_info->exc_type;
+    tmp_value = exc_info->exc_value;
+    tmp_tb = exc_info->exc_traceback;
+    exc_info->exc_type = *type;
+    exc_info->exc_value = *value;
+    exc_info->exc_traceback = *tb;
+  #else
+    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;
+  #endif
+    *type = tmp_type;
+    *value = tmp_value;
+    *tb = tmp_tb;
+}
+#else
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
+    PyErr_SetExcInfo(*type, *value, *tb);
+    *type = tmp_type;
+    *value = tmp_value;
+    *tb = tmp_tb;
+}
+#endif
+
+/* PyIntBinop */
+#if !CYTHON_COMPILING_IN_PYPY
+static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) {
+    CYTHON_MAYBE_UNUSED_VAR(intval);
+    CYTHON_MAYBE_UNUSED_VAR(inplace);
+    CYTHON_UNUSED_VAR(zerodivision_check);
+    #if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_CheckExact(op1))) {
+        const long b = intval;
+        long x;
+        long a = PyInt_AS_LONG(op1);
+        
+            x = (long)((unsigned long)a - (unsigned long)b);
+            if (likely((x^a) >= 0 || (x^~b) >= 0))
+                return PyInt_FromLong(x);
+            return PyLong_Type.tp_as_number->nb_subtract(op1, op2);
+    }
+    #endif
+    #if CYTHON_USE_PYLONG_INTERNALS
+    if (likely(PyLong_CheckExact(op1))) {
+        const long b = intval;
+        long a, x;
+#ifdef HAVE_LONG_LONG
+        const PY_LONG_LONG llb = intval;
+        PY_LONG_LONG lla, llx;
+#endif
+        if (unlikely(__Pyx_PyLong_IsZero(op1))) {
+            return PyLong_FromLong(-intval);
+        }
+        if (likely(__Pyx_PyLong_IsCompact(op1))) {
+            a = __Pyx_PyLong_CompactValue(op1);
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(op1);
+            const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1);
+            switch (size) {
+                case -2:
+                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
+                        lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case 2:
+                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
+                        lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case -3:
+                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
+                        lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case 3:
+                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
+                        lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case -4:
+                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
+                        lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                case 4:
+                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
+                        break;
+                    #ifdef HAVE_LONG_LONG
+                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
+                        lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
+                        goto long_long;
+                    #endif
+                    }
+                    CYTHON_FALLTHROUGH;
+                default: return PyLong_Type.tp_as_number->nb_subtract(op1, op2);
+            }
+        }
+                x = a - b;
+            return PyLong_FromLong(x);
+#ifdef HAVE_LONG_LONG
+        long_long:
+                llx = lla - llb;
+            return PyLong_FromLongLong(llx);
+#endif
+        
+        
+    }
+    #endif
+    if (PyFloat_CheckExact(op1)) {
+        const long b = intval;
+#if CYTHON_COMPILING_IN_LIMITED_API
+        double a = __pyx_PyFloat_AsDouble(op1);
+#else
+        double a = PyFloat_AS_DOUBLE(op1);
+#endif
+            double result;
+            
+            PyFPE_START_PROTECT("subtract", return NULL)
+            result = ((double)a) - (double)b;
+            PyFPE_END_PROTECT(result)
+            return PyFloat_FromDouble(result);
+    }
+    return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2);
+}
+#endif
+
+/* FastTypeChecks */
+#if CYTHON_COMPILING_IN_CPYTHON
+static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) {
+    while (a) {
+        a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*);
+        if (a == b)
+            return 1;
+    }
+    return b == &PyBaseObject_Type;
+}
+static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) {
+    PyObject *mro;
+    if (a == b) return 1;
+    mro = a->tp_mro;
+    if (likely(mro)) {
+        Py_ssize_t i, n;
+        n = PyTuple_GET_SIZE(mro);
+        for (i = 0; i < n; i++) {
+            if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
+                return 1;
+        }
+        return 0;
+    }
+    return __Pyx_InBases(a, b);
+}
+static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) {
+    PyObject *mro;
+    if (cls == a || cls == b) return 1;
+    mro = cls->tp_mro;
+    if (likely(mro)) {
+        Py_ssize_t i, n;
+        n = PyTuple_GET_SIZE(mro);
+        for (i = 0; i < n; i++) {
+            PyObject *base = PyTuple_GET_ITEM(mro, i);
+            if (base == (PyObject *)a || base == (PyObject *)b)
+                return 1;
+        }
+        return 0;
+    }
+    return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b);
+}
+#if PY_MAJOR_VERSION == 2
+static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) {
+    PyObject *exception, *value, *tb;
+    int res;
+    __Pyx_PyThreadState_declare
+    __Pyx_PyThreadState_assign
+    __Pyx_ErrFetch(&exception, &value, &tb);
+    res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0;
+    if (unlikely(res == -1)) {
+        PyErr_WriteUnraisable(err);
+        res = 0;
+    }
+    if (!res) {
+        res = PyObject_IsSubclass(err, exc_type2);
+        if (unlikely(res == -1)) {
+            PyErr_WriteUnraisable(err);
+            res = 0;
+        }
+    }
+    __Pyx_ErrRestore(exception, value, tb);
+    return res;
+}
+#else
+static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) {
+    if (exc_type1) {
+        return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2);
+    } else {
+        return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2);
+    }
+}
+#endif
+static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
+    Py_ssize_t i, n;
+    assert(PyExceptionClass_Check(exc_type));
+    n = PyTuple_GET_SIZE(tuple);
+#if PY_MAJOR_VERSION >= 3
+    for (i=0; i<n; i++) {
+        if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
+    }
+#endif
+    for (i=0; i<n; i++) {
+        PyObject *t = PyTuple_GET_ITEM(tuple, i);
+        #if PY_MAJOR_VERSION < 3
+        if (likely(exc_type == t)) return 1;
+        #endif
+        if (likely(PyExceptionClass_Check(t))) {
+            if (__Pyx_inner_PyErr_GivenExceptionMatches2(exc_type, NULL, t)) return 1;
+        } else {
+        }
+    }
+    return 0;
+}
+static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject* exc_type) {
+    if (likely(err == exc_type)) return 1;
+    if (likely(PyExceptionClass_Check(err))) {
+        if (likely(PyExceptionClass_Check(exc_type))) {
+            return __Pyx_inner_PyErr_GivenExceptionMatches2(err, NULL, exc_type);
+        } else if (likely(PyTuple_Check(exc_type))) {
+            return __Pyx_PyErr_GivenExceptionMatchesTuple(err, exc_type);
+        } else {
+        }
+    }
+    return PyErr_GivenExceptionMatches(err, exc_type);
+}
+static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *exc_type1, PyObject *exc_type2) {
+    assert(PyExceptionClass_Check(exc_type1));
+    assert(PyExceptionClass_Check(exc_type2));
+    if (likely(err == exc_type1 || err == exc_type2)) return 1;
+    if (likely(PyExceptionClass_Check(err))) {
+        return __Pyx_inner_PyErr_GivenExceptionMatches2(err, exc_type1, exc_type2);
+    }
+    return (PyErr_GivenExceptionMatches(err, exc_type1) || PyErr_GivenExceptionMatches(err, exc_type2));
+}
+#endif
+
+/* StopAsyncIteration */
+#if PY_VERSION_HEX < 0x030500B1
+#if CYTHON_USE_TYPE_SPECS
+#error Using async coroutines with type specs requires Python 3.5 or later.
+#else
+static PyTypeObject __Pyx__PyExc_StopAsyncIteration_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    "StopAsyncIteration",
+    sizeof(PyBaseExceptionObject),
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+    PyDoc_STR("Signal the end from iterator.__anext__()."),
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM+0 >= 0x06000000
+    0,
+#endif
+};
+#endif
+#endif
+static int __pyx_StopAsyncIteration_init(PyObject *module) {
+    CYTHON_UNUSED_VAR(module);
+#if PY_VERSION_HEX >= 0x030500B1
+    __Pyx_PyExc_StopAsyncIteration = PyExc_StopAsyncIteration;
+#else
+    PyObject *builtins = PyEval_GetBuiltins();
+    if (likely(builtins)) {
+        PyObject *exc = PyMapping_GetItemString(builtins, (char*) "StopAsyncIteration");
+        if (exc) {
+            __Pyx_PyExc_StopAsyncIteration = exc;
+            return 0;
+        }
+    }
+    PyErr_Clear();
+    __Pyx__PyExc_StopAsyncIteration_type.tp_traverse = ((PyTypeObject*)PyExc_BaseException)->tp_traverse;
+    __Pyx__PyExc_StopAsyncIteration_type.tp_clear = ((PyTypeObject*)PyExc_BaseException)->tp_clear;
+    __Pyx__PyExc_StopAsyncIteration_type.tp_dictoffset = ((PyTypeObject*)PyExc_BaseException)->tp_dictoffset;
+    __Pyx__PyExc_StopAsyncIteration_type.tp_base = (PyTypeObject*)PyExc_Exception;
+    __Pyx_PyExc_StopAsyncIteration = (PyObject*) __Pyx_FetchCommonType(&__Pyx__PyExc_StopAsyncIteration_type);
+    if (unlikely(!__Pyx_PyExc_StopAsyncIteration))
+        return -1;
+    if (likely(builtins) && unlikely(PyMapping_SetItemString(builtins, (char*) "StopAsyncIteration", __Pyx_PyExc_StopAsyncIteration) < 0))
+        return -1;
+#endif
+    return 0;
+}
+
+/* CoroutineBase */
+#include <frameobject.h>
+#if PY_VERSION_HEX >= 0x030b00a6
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
+#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
+static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *__pyx_tstate, PyObject **pvalue) {
+    PyObject *et, *ev, *tb;
+    PyObject *value = NULL;
+    CYTHON_UNUSED_VAR(__pyx_tstate);
+    __Pyx_ErrFetch(&et, &ev, &tb);
+    if (!et) {
+        Py_XDECREF(tb);
+        Py_XDECREF(ev);
+        Py_INCREF(Py_None);
+        *pvalue = Py_None;
+        return 0;
+    }
+    if (likely(et == PyExc_StopIteration)) {
+        if (!ev) {
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+#if PY_VERSION_HEX >= 0x030300A0
+        else if (likely(__Pyx_IS_TYPE(ev, (PyTypeObject*)PyExc_StopIteration))) {
+            value = ((PyStopIterationObject *)ev)->value;
+            Py_INCREF(value);
+            Py_DECREF(ev);
+        }
+#endif
+        else if (unlikely(PyTuple_Check(ev))) {
+            if (PyTuple_GET_SIZE(ev) >= 1) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+                value = PyTuple_GET_ITEM(ev, 0);
+                Py_INCREF(value);
+#else
+                value = PySequence_ITEM(ev, 0);
+#endif
+            } else {
+                Py_INCREF(Py_None);
+                value = Py_None;
+            }
+            Py_DECREF(ev);
+        }
+        else if (!__Pyx_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) {
+            value = ev;
+        }
+        if (likely(value)) {
+            Py_XDECREF(tb);
+            Py_DECREF(et);
+            *pvalue = value;
+            return 0;
+        }
+    } else if (!__Pyx_PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    PyErr_NormalizeException(&et, &ev, &tb);
+    if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)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 = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args);
+        Py_DECREF(ev);
+        if (likely(args)) {
+            value = PySequence_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;
+}
+static CYTHON_INLINE
+void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *exc_state) {
+#if PY_VERSION_HEX >= 0x030B00a4
+    Py_CLEAR(exc_state->exc_value);
+#else
+    PyObject *t, *v, *tb;
+    t = exc_state->exc_type;
+    v = exc_state->exc_value;
+    tb = exc_state->exc_traceback;
+    exc_state->exc_type = NULL;
+    exc_state->exc_value = NULL;
+    exc_state->exc_traceback = NULL;
+    Py_XDECREF(t);
+    Py_XDECREF(v);
+    Py_XDECREF(tb);
+#endif
+}
+#define __Pyx_Coroutine_AlreadyRunningError(gen)  (__Pyx__Coroutine_AlreadyRunningError(gen), (PyObject*)NULL)
+static void __Pyx__Coroutine_AlreadyRunningError(__pyx_CoroutineObject *gen) {
+    const char *msg;
+    CYTHON_MAYBE_UNUSED_VAR(gen);
+    if ((0)) {
+    #ifdef __Pyx_Coroutine_USED
+    } else if (__Pyx_Coroutine_Check((PyObject*)gen)) {
+        msg = "coroutine already executing";
+    #endif
+    #ifdef __Pyx_AsyncGen_USED
+    } else if (__Pyx_AsyncGen_CheckExact((PyObject*)gen)) {
+        msg = "async generator already executing";
+    #endif
+    } else {
+        msg = "generator already executing";
+    }
+    PyErr_SetString(PyExc_ValueError, msg);
+}
+#define __Pyx_Coroutine_NotStartedError(gen)  (__Pyx__Coroutine_NotStartedError(gen), (PyObject*)NULL)
+static void __Pyx__Coroutine_NotStartedError(PyObject *gen) {
+    const char *msg;
+    CYTHON_MAYBE_UNUSED_VAR(gen);
+    if ((0)) {
+    #ifdef __Pyx_Coroutine_USED
+    } else if (__Pyx_Coroutine_Check(gen)) {
+        msg = "can't send non-None value to a just-started coroutine";
+    #endif
+    #ifdef __Pyx_AsyncGen_USED
+    } else if (__Pyx_AsyncGen_CheckExact(gen)) {
+        msg = "can't send non-None value to a just-started async generator";
+    #endif
+    } else {
+        msg = "can't send non-None value to a just-started generator";
+    }
+    PyErr_SetString(PyExc_TypeError, msg);
+}
+#define __Pyx_Coroutine_AlreadyTerminatedError(gen, value, closing)  (__Pyx__Coroutine_AlreadyTerminatedError(gen, value, closing), (PyObject*)NULL)
+static void __Pyx__Coroutine_AlreadyTerminatedError(PyObject *gen, PyObject *value, int closing) {
+    CYTHON_MAYBE_UNUSED_VAR(gen);
+    CYTHON_MAYBE_UNUSED_VAR(closing);
+    #ifdef __Pyx_Coroutine_USED
+    if (!closing && __Pyx_Coroutine_Check(gen)) {
+        PyErr_SetString(PyExc_RuntimeError, "cannot reuse already awaited coroutine");
+    } else
+    #endif
+    if (value) {
+        #ifdef __Pyx_AsyncGen_USED
+        if (__Pyx_AsyncGen_CheckExact(gen))
+            PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration);
+        else
+        #endif
+        PyErr_SetNone(PyExc_StopIteration);
+    }
+}
+static
+PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, int closing) {
+    __Pyx_PyThreadState_declare
+    PyThreadState *tstate;
+    __Pyx_ExcInfoStruct *exc_state;
+    PyObject *retval;
+    assert(!self->is_running);
+    if (unlikely(self->resume_label == 0)) {
+        if (unlikely(value && value != Py_None)) {
+            return __Pyx_Coroutine_NotStartedError((PyObject*)self);
+        }
+    }
+    if (unlikely(self->resume_label == -1)) {
+        return __Pyx_Coroutine_AlreadyTerminatedError((PyObject*)self, value, closing);
+    }
+#if CYTHON_FAST_THREAD_STATE
+    __Pyx_PyThreadState_assign
+    tstate = __pyx_tstate;
+#else
+    tstate = __Pyx_PyThreadState_Current;
+#endif
+    exc_state = &self->gi_exc_state;
+    if (exc_state->exc_value) {
+        #if CYTHON_COMPILING_IN_PYPY
+        #else
+        PyObject *exc_tb;
+        #if PY_VERSION_HEX >= 0x030B00a4 && !CYTHON_COMPILING_IN_CPYTHON
+        exc_tb = PyException_GetTraceback(exc_state->exc_value);
+        #elif PY_VERSION_HEX >= 0x030B00a4
+        exc_tb = ((PyBaseExceptionObject*) exc_state->exc_value)->traceback;
+        #else
+        exc_tb = exc_state->exc_traceback;
+        #endif
+        if (exc_tb) {
+            PyTracebackObject *tb = (PyTracebackObject *) exc_tb;
+            PyFrameObject *f = tb->tb_frame;
+            assert(f->f_back == NULL);
+            #if PY_VERSION_HEX >= 0x030B00A1
+            f->f_back = PyThreadState_GetFrame(tstate);
+            #else
+            Py_XINCREF(tstate->frame);
+            f->f_back = tstate->frame;
+            #endif
+            #if PY_VERSION_HEX >= 0x030B00a4 && !CYTHON_COMPILING_IN_CPYTHON
+            Py_DECREF(exc_tb);
+            #endif
+        }
+        #endif
+    }
+#if CYTHON_USE_EXC_INFO_STACK
+    exc_state->previous_item = tstate->exc_info;
+    tstate->exc_info = exc_state;
+#else
+    if (exc_state->exc_type) {
+        __Pyx_ExceptionSwap(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback);
+    } else {
+        __Pyx_Coroutine_ExceptionClear(exc_state);
+        __Pyx_ExceptionSave(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback);
+    }
+#endif
+    self->is_running = 1;
+    retval = self->body(self, tstate, value);
+    self->is_running = 0;
+#if CYTHON_USE_EXC_INFO_STACK
+    exc_state = &self->gi_exc_state;
+    tstate->exc_info = exc_state->previous_item;
+    exc_state->previous_item = NULL;
+    __Pyx_Coroutine_ResetFrameBackpointer(exc_state);
+#endif
+    return retval;
+}
+static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state) {
+#if CYTHON_COMPILING_IN_PYPY
+    CYTHON_UNUSED_VAR(exc_state);
+#else
+    PyObject *exc_tb;
+    #if PY_VERSION_HEX >= 0x030B00a4
+    if (!exc_state->exc_value) return;
+    exc_tb = PyException_GetTraceback(exc_state->exc_value);
+    #else
+    exc_tb = exc_state->exc_traceback;
+    #endif
+    if (likely(exc_tb)) {
+        PyTracebackObject *tb = (PyTracebackObject *) exc_tb;
+        PyFrameObject *f = tb->tb_frame;
+        Py_CLEAR(f->f_back);
+        #if PY_VERSION_HEX >= 0x030B00a4
+        Py_DECREF(exc_tb);
+        #endif
+    }
+#endif
+}
+static CYTHON_INLINE
+PyObject *__Pyx_Coroutine_MethodReturn(PyObject* gen, PyObject *retval) {
+    CYTHON_MAYBE_UNUSED_VAR(gen);
+    if (unlikely(!retval)) {
+        __Pyx_PyThreadState_declare
+        __Pyx_PyThreadState_assign
+        if (!__Pyx_PyErr_Occurred()) {
+            PyObject *exc = PyExc_StopIteration;
+            #ifdef __Pyx_AsyncGen_USED
+            if (__Pyx_AsyncGen_CheckExact(gen))
+                exc = __Pyx_PyExc_StopAsyncIteration;
+            #endif
+            __Pyx_PyErr_SetNone(exc);
+        }
+    }
+    return retval;
+}
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3)
+static CYTHON_INLINE
+PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) {
+#if PY_VERSION_HEX <= 0x030A00A1
+    return _PyGen_Send(gen, arg);
+#else
+    PyObject *result;
+    if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) {
+        if (PyAsyncGen_CheckExact(gen)) {
+            assert(result == Py_None);
+            PyErr_SetNone(PyExc_StopAsyncIteration);
+        }
+        else if (result == Py_None) {
+            PyErr_SetNone(PyExc_StopIteration);
+        }
+        else {
+#if PY_VERSION_HEX < 0x030d00A1
+            _PyGen_SetStopIterationValue(result);
+#else
+            if (!PyTuple_Check(result) && !PyExceptionInstance_Check(result)) {
+                PyErr_SetObject(PyExc_StopIteration, result);
+            } else {
+                PyObject *exc = __Pyx_PyObject_CallOneArg(PyExc_StopIteration, result);
+                if (likely(exc != NULL)) {
+                    PyErr_SetObject(PyExc_StopIteration, exc);
+                    Py_DECREF(exc);
+                }
+            }
+#endif
+        }
+        Py_DECREF(result);
+        result = NULL;
+    }
+    return result;
+#endif
+}
+#endif
+static CYTHON_INLINE
+PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) {
+    PyObject *ret;
+    PyObject *val = NULL;
+    __Pyx_Coroutine_Undelegate(gen);
+    __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, &val);
+    ret = __Pyx_Coroutine_SendEx(gen, val, 0);
+    Py_XDECREF(val);
+    return ret;
+}
+static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) {
+    PyObject *retval;
+    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(gen->is_running))
+        return __Pyx_Coroutine_AlreadyRunningError(gen);
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        #ifdef __Pyx_Generator_USED
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Coroutine_Send(yf, value);
+        } else
+        #endif
+        #ifdef __Pyx_Coroutine_USED
+        if (__Pyx_Coroutine_Check(yf)) {
+            ret = __Pyx_Coroutine_Send(yf, value);
+        } else
+        #endif
+        #ifdef __Pyx_AsyncGen_USED
+        if (__pyx_PyAsyncGenASend_CheckExact(yf)) {
+            ret = __Pyx_async_gen_asend_send(yf, value);
+        } else
+        #endif
+        #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3)
+        if (PyGen_CheckExact(yf)) {
+            ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value);
+        } else
+        #endif
+        #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3)
+        if (PyCoro_CheckExact(yf)) {
+            ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value);
+        } else
+        #endif
+        {
+            if (value == Py_None)
+                ret = __Pyx_PyObject_GetIterNextFunc(yf)(yf);
+            else
+                ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value);
+        }
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        retval = __Pyx_Coroutine_FinishDelegation(gen);
+    } else {
+        retval = __Pyx_Coroutine_SendEx(gen, value, 0);
+    }
+    return __Pyx_Coroutine_MethodReturn(self, retval);
+}
+static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) {
+    PyObject *retval = NULL;
+    int err = 0;
+    #ifdef __Pyx_Generator_USED
+    if (__Pyx_Generator_CheckExact(yf)) {
+        retval = __Pyx_Coroutine_Close(yf);
+        if (!retval)
+            return -1;
+    } else
+    #endif
+    #ifdef __Pyx_Coroutine_USED
+    if (__Pyx_Coroutine_Check(yf)) {
+        retval = __Pyx_Coroutine_Close(yf);
+        if (!retval)
+            return -1;
+    } else
+    if (__Pyx_CoroutineAwait_CheckExact(yf)) {
+        retval = __Pyx_CoroutineAwait_Close((__pyx_CoroutineAwaitObject*)yf, NULL);
+        if (!retval)
+            return -1;
+    } else
+    #endif
+    #ifdef __Pyx_AsyncGen_USED
+    if (__pyx_PyAsyncGenASend_CheckExact(yf)) {
+        retval = __Pyx_async_gen_asend_close(yf, NULL);
+    } else
+    if (__pyx_PyAsyncGenAThrow_CheckExact(yf)) {
+        retval = __Pyx_async_gen_athrow_close(yf, NULL);
+    } else
+    #endif
+    {
+        PyObject *meth;
+        gen->is_running = 1;
+        meth = __Pyx_PyObject_GetAttrStrNoError(yf, __pyx_n_s_close);
+        if (unlikely(!meth)) {
+            if (unlikely(PyErr_Occurred())) {
+                PyErr_WriteUnraisable(yf);
+            }
+        } else {
+            retval = __Pyx_PyObject_CallNoArg(meth);
+            Py_DECREF(meth);
+            if (unlikely(!retval))
+                err = -1;
+        }
+        gen->is_running = 0;
+    }
+    Py_XDECREF(retval);
+    return err;
+}
+static PyObject *__Pyx_Generator_Next(PyObject *self) {
+    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(gen->is_running))
+        return __Pyx_Coroutine_AlreadyRunningError(gen);
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        #ifdef __Pyx_Generator_USED
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Next(yf);
+        } else
+        #endif
+        #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3)
+        if (PyGen_CheckExact(yf)) {
+            ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL);
+        } else
+        #endif
+        #ifdef __Pyx_Coroutine_USED
+        if (__Pyx_Coroutine_Check(yf)) {
+            ret = __Pyx_Coroutine_Send(yf, Py_None);
+        } else
+        #endif
+            ret = __Pyx_PyObject_GetIterNextFunc(yf)(yf);
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Coroutine_FinishDelegation(gen);
+    }
+    return __Pyx_Coroutine_SendEx(gen, Py_None, 0);
+}
+static PyObject *__Pyx_Coroutine_Close_Method(PyObject *self, PyObject *arg) {
+    CYTHON_UNUSED_VAR(arg);
+    return __Pyx_Coroutine_Close(self);
+}
+static PyObject *__Pyx_Coroutine_Close(PyObject *self) {
+    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+    PyObject *retval, *raised_exception;
+    PyObject *yf = gen->yieldfrom;
+    int err = 0;
+    if (unlikely(gen->is_running))
+        return __Pyx_Coroutine_AlreadyRunningError(gen);
+    if (yf) {
+        Py_INCREF(yf);
+        err = __Pyx_Coroutine_CloseIter(gen, yf);
+        __Pyx_Coroutine_Undelegate(gen);
+        Py_DECREF(yf);
+    }
+    if (err == 0)
+        PyErr_SetNone(PyExc_GeneratorExit);
+    retval = __Pyx_Coroutine_SendEx(gen, NULL, 1);
+    if (unlikely(retval)) {
+        const char *msg;
+        Py_DECREF(retval);
+        if ((0)) {
+        #ifdef __Pyx_Coroutine_USED
+        } else if (__Pyx_Coroutine_Check(self)) {
+            msg = "coroutine ignored GeneratorExit";
+        #endif
+        #ifdef __Pyx_AsyncGen_USED
+        } else if (__Pyx_AsyncGen_CheckExact(self)) {
+#if PY_VERSION_HEX < 0x03060000
+            msg = "async generator ignored GeneratorExit - might require Python 3.6+ finalisation (PEP 525)";
+#else
+            msg = "async generator ignored GeneratorExit";
+#endif
+        #endif
+        } else {
+            msg = "generator ignored GeneratorExit";
+        }
+        PyErr_SetString(PyExc_RuntimeError, msg);
+        return NULL;
+    }
+    raised_exception = PyErr_Occurred();
+    if (likely(!raised_exception || __Pyx_PyErr_GivenExceptionMatches2(raised_exception, PyExc_GeneratorExit, PyExc_StopIteration))) {
+        if (raised_exception) PyErr_Clear();
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+    return NULL;
+}
+static PyObject *__Pyx__Coroutine_Throw(PyObject *self, PyObject *typ, PyObject *val, PyObject *tb,
+                                        PyObject *args, int close_on_genexit) {
+    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(gen->is_running))
+        return __Pyx_Coroutine_AlreadyRunningError(gen);
+    if (yf) {
+        PyObject *ret;
+        Py_INCREF(yf);
+        if (__Pyx_PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && close_on_genexit) {
+            int err = __Pyx_Coroutine_CloseIter(gen, yf);
+            Py_DECREF(yf);
+            __Pyx_Coroutine_Undelegate(gen);
+            if (err < 0)
+                return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0));
+            goto throw_here;
+        }
+        gen->is_running = 1;
+        if (0
+        #ifdef __Pyx_Generator_USED
+            || __Pyx_Generator_CheckExact(yf)
+        #endif
+        #ifdef __Pyx_Coroutine_USED
+            || __Pyx_Coroutine_Check(yf)
+        #endif
+            ) {
+            ret = __Pyx__Coroutine_Throw(yf, typ, val, tb, args, close_on_genexit);
+        #ifdef __Pyx_Coroutine_USED
+        } else if (__Pyx_CoroutineAwait_CheckExact(yf)) {
+            ret = __Pyx__Coroutine_Throw(((__pyx_CoroutineAwaitObject*)yf)->coroutine, typ, val, tb, args, close_on_genexit);
+        #endif
+        } else {
+            PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(yf, __pyx_n_s_throw);
+            if (unlikely(!meth)) {
+                Py_DECREF(yf);
+                if (unlikely(PyErr_Occurred())) {
+                    gen->is_running = 0;
+                    return NULL;
+                }
+                __Pyx_Coroutine_Undelegate(gen);
+                gen->is_running = 0;
+                goto throw_here;
+            }
+            if (likely(args)) {
+                ret = __Pyx_PyObject_Call(meth, args, NULL);
+            } else {
+                PyObject *cargs[4] = {NULL, typ, val, tb};
+                ret = __Pyx_PyObject_FastCall(meth, cargs+1, 3 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET);
+            }
+            Py_DECREF(meth);
+        }
+        gen->is_running = 0;
+        Py_DECREF(yf);
+        if (!ret) {
+            ret = __Pyx_Coroutine_FinishDelegation(gen);
+        }
+        return __Pyx_Coroutine_MethodReturn(self, ret);
+    }
+throw_here:
+    __Pyx_Raise(typ, val, tb, NULL);
+    return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0));
+}
+static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) {
+    PyObject *typ;
+    PyObject *val = NULL;
+    PyObject *tb = NULL;
+    if (unlikely(!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb)))
+        return NULL;
+    return __Pyx__Coroutine_Throw(self, typ, val, tb, args, 1);
+}
+static CYTHON_INLINE int __Pyx_Coroutine_traverse_excstate(__Pyx_ExcInfoStruct *exc_state, visitproc visit, void *arg) {
+#if PY_VERSION_HEX >= 0x030B00a4
+    Py_VISIT(exc_state->exc_value);
+#else
+    Py_VISIT(exc_state->exc_type);
+    Py_VISIT(exc_state->exc_value);
+    Py_VISIT(exc_state->exc_traceback);
+#endif
+    return 0;
+}
+static int __Pyx_Coroutine_traverse(__pyx_CoroutineObject *gen, visitproc visit, void *arg) {
+    Py_VISIT(gen->closure);
+    Py_VISIT(gen->classobj);
+    Py_VISIT(gen->yieldfrom);
+    return __Pyx_Coroutine_traverse_excstate(&gen->gi_exc_state, visit, arg);
+}
+static int __Pyx_Coroutine_clear(PyObject *self) {
+    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+    Py_CLEAR(gen->closure);
+    Py_CLEAR(gen->classobj);
+    Py_CLEAR(gen->yieldfrom);
+    __Pyx_Coroutine_ExceptionClear(&gen->gi_exc_state);
+#ifdef __Pyx_AsyncGen_USED
+    if (__Pyx_AsyncGen_CheckExact(self)) {
+        Py_CLEAR(((__pyx_PyAsyncGenObject*)gen)->ag_finalizer);
+    }
+#endif
+    Py_CLEAR(gen->gi_code);
+    Py_CLEAR(gen->gi_frame);
+    Py_CLEAR(gen->gi_name);
+    Py_CLEAR(gen->gi_qualname);
+    Py_CLEAR(gen->gi_modulename);
+    return 0;
+}
+static void __Pyx_Coroutine_dealloc(PyObject *self) {
+    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) 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 && CYTHON_USE_TP_FINALIZE
+        if (unlikely(PyObject_CallFinalizerFromDealloc(self)))
+#else
+        Py_TYPE(gen)->tp_del(self);
+        if (unlikely(Py_REFCNT(self) > 0))
+#endif
+        {
+            return;
+        }
+        PyObject_GC_UnTrack(self);
+    }
+#ifdef __Pyx_AsyncGen_USED
+    if (__Pyx_AsyncGen_CheckExact(self)) {
+        /* We have to handle this case for asynchronous generators
+           right here, because this code has to be between UNTRACK
+           and GC_Del. */
+        Py_CLEAR(((__pyx_PyAsyncGenObject*)self)->ag_finalizer);
+    }
+#endif
+    __Pyx_Coroutine_clear(self);
+    __Pyx_PyHeapTypeObject_GC_Del(gen);
+}
+static void __Pyx_Coroutine_del(PyObject *self) {
+    PyObject *error_type, *error_value, *error_traceback;
+    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
+    __Pyx_PyThreadState_declare
+    if (gen->resume_label < 0) {
+        return;
+    }
+#if !CYTHON_USE_TP_FINALIZE
+    assert(self->ob_refcnt == 0);
+    __Pyx_SET_REFCNT(self, 1);
+#endif
+    __Pyx_PyThreadState_assign
+    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
+#ifdef __Pyx_AsyncGen_USED
+    if (__Pyx_AsyncGen_CheckExact(self)) {
+        __pyx_PyAsyncGenObject *agen = (__pyx_PyAsyncGenObject*)self;
+        PyObject *finalizer = agen->ag_finalizer;
+        if (finalizer && !agen->ag_closed) {
+            PyObject *res = __Pyx_PyObject_CallOneArg(finalizer, self);
+            if (unlikely(!res)) {
+                PyErr_WriteUnraisable(self);
+            } else {
+                Py_DECREF(res);
+            }
+            __Pyx_ErrRestore(error_type, error_value, error_traceback);
+            return;
+        }
+    }
+#endif
+    if (unlikely(gen->resume_label == 0 && !error_value)) {
+#ifdef __Pyx_Coroutine_USED
+#ifdef __Pyx_Generator_USED
+    if (!__Pyx_Generator_CheckExact(self))
+#endif
+        {
+        PyObject_GC_UnTrack(self);
+#if PY_MAJOR_VERSION >= 3  || defined(PyErr_WarnFormat)
+        if (unlikely(PyErr_WarnFormat(PyExc_RuntimeWarning, 1, "coroutine '%.50S' was never awaited", gen->gi_qualname) < 0))
+            PyErr_WriteUnraisable(self);
+#else
+        {PyObject *msg;
+        char *cmsg;
+        #if CYTHON_COMPILING_IN_PYPY
+        msg = NULL;
+        cmsg = (char*) "coroutine was never awaited";
+        #else
+        char *cname;
+        PyObject *qualname;
+        qualname = gen->gi_qualname;
+        cname = PyString_AS_STRING(qualname);
+        msg = PyString_FromFormat("coroutine '%.50s' was never awaited", cname);
+        if (unlikely(!msg)) {
+            PyErr_Clear();
+            cmsg = (char*) "coroutine was never awaited";
+        } else {
+            cmsg = PyString_AS_STRING(msg);
+        }
+        #endif
+        if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, cmsg, 1) < 0))
+            PyErr_WriteUnraisable(self);
+        Py_XDECREF(msg);}
+#endif
+        PyObject_GC_Track(self);
+        }
+#endif
+    } else {
+        PyObject *res = __Pyx_Coroutine_Close(self);
+        if (unlikely(!res)) {
+            if (PyErr_Occurred())
+                PyErr_WriteUnraisable(self);
+        } else {
+            Py_DECREF(res);
+        }
+    }
+    __Pyx_ErrRestore(error_type, error_value, error_traceback);
+#if !CYTHON_USE_TP_FINALIZE
+    assert(Py_REFCNT(self) > 0);
+    if (likely(--self->ob_refcnt == 0)) {
+        return;
+    }
+    {
+        Py_ssize_t refcnt = Py_REFCNT(self);
+        _Py_NewReference(self);
+        __Pyx_SET_REFCNT(self, refcnt);
+    }
+#if CYTHON_COMPILING_IN_CPYTHON
+    assert(PyType_IS_GC(Py_TYPE(self)) &&
+           _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_Coroutine_get_name(__pyx_CoroutineObject *self, void *context)
+{
+    PyObject *name = self->gi_name;
+    CYTHON_UNUSED_VAR(context);
+    if (unlikely(!name)) name = Py_None;
+    Py_INCREF(name);
+    return name;
+}
+static int
+__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+#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;
+    }
+    Py_INCREF(value);
+    __Pyx_Py_XDECREF_SET(self->gi_name, value);
+    return 0;
+}
+static PyObject *
+__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self, void *context)
+{
+    PyObject *name = self->gi_qualname;
+    CYTHON_UNUSED_VAR(context);
+    if (unlikely(!name)) name = Py_None;
+    Py_INCREF(name);
+    return name;
+}
+static int
+__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, void *context)
+{
+    CYTHON_UNUSED_VAR(context);
+#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;
+    }
+    Py_INCREF(value);
+    __Pyx_Py_XDECREF_SET(self->gi_qualname, value);
+    return 0;
+}
+static PyObject *
+__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, void *context)
+{
+    PyObject *frame = self->gi_frame;
+    CYTHON_UNUSED_VAR(context);
+    if (!frame) {
+        if (unlikely(!self->gi_code)) {
+            Py_RETURN_NONE;
+        }
+        frame = (PyObject *) PyFrame_New(
+            PyThreadState_Get(),            /*PyThreadState *tstate,*/
+            (PyCodeObject*) self->gi_code,  /*PyCodeObject *code,*/
+            __pyx_d,                 /*PyObject *globals,*/
+            0                               /*PyObject *locals*/
+        );
+        if (unlikely(!frame))
+            return NULL;
+        self->gi_frame = frame;
+    }
+    Py_INCREF(frame);
+    return frame;
+}
+static __pyx_CoroutineObject *__Pyx__Coroutine_New(
+            PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
+            PyObject *name, PyObject *qualname, PyObject *module_name) {
+    __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type);
+    if (unlikely(!gen))
+        return NULL;
+    return __Pyx__Coroutine_NewInit(gen, body, code, closure, name, qualname, module_name);
+}
+static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit(
+            __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure,
+            PyObject *name, PyObject *qualname, PyObject *module_name) {
+    gen->body = body;
+    gen->closure = closure;
+    Py_XINCREF(closure);
+    gen->is_running = 0;
+    gen->resume_label = 0;
+    gen->classobj = NULL;
+    gen->yieldfrom = NULL;
+    #if PY_VERSION_HEX >= 0x030B00a4
+    gen->gi_exc_state.exc_value = NULL;
+    #else
+    gen->gi_exc_state.exc_type = NULL;
+    gen->gi_exc_state.exc_value = NULL;
+    gen->gi_exc_state.exc_traceback = NULL;
+    #endif
+#if CYTHON_USE_EXC_INFO_STACK
+    gen->gi_exc_state.previous_item = NULL;
+#endif
+    gen->gi_weakreflist = NULL;
+    Py_XINCREF(qualname);
+    gen->gi_qualname = qualname;
+    Py_XINCREF(name);
+    gen->gi_name = name;
+    Py_XINCREF(module_name);
+    gen->gi_modulename = module_name;
+    Py_XINCREF(code);
+    gen->gi_code = code;
+    gen->gi_frame = NULL;
+    PyObject_GC_Track(gen);
+    return gen;
+}
+
+/* PyObject_GenericGetAttrNoDict */
+#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
+static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) {
+    __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp);
+    PyErr_Format(PyExc_AttributeError,
+#if PY_MAJOR_VERSION >= 3
+                 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'",
+                 type_name, attr_name);
+#else
+                 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'",
+                 type_name, PyString_AS_STRING(attr_name));
+#endif
+    __Pyx_DECREF_TypeName(type_name);
+    return NULL;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) {
+    PyObject *descr;
+    PyTypeObject *tp = Py_TYPE(obj);
+    if (unlikely(!PyString_Check(attr_name))) {
+        return PyObject_GenericGetAttr(obj, attr_name);
+    }
+    assert(!tp->tp_dictoffset);
+    descr = _PyType_Lookup(tp, attr_name);
+    if (unlikely(!descr)) {
+        return __Pyx_RaiseGenericGetAttributeError(tp, attr_name);
+    }
+    Py_INCREF(descr);
+    #if PY_MAJOR_VERSION < 3
+    if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)))
+    #endif
+    {
+        descrgetfunc f = Py_TYPE(descr)->tp_descr_get;
+        if (unlikely(f)) {
+            PyObject *res = f(descr, obj, (PyObject *)tp);
+            Py_DECREF(descr);
+            return res;
+        }
+    }
+    return descr;
+}
+#endif
+
+/* PatchModuleWithCoroutine */
+static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) {
+#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+    int result;
+    PyObject *globals, *result_obj;
+    globals = PyDict_New();  if (unlikely(!globals)) goto ignore;
+    result = PyDict_SetItemString(globals, "_cython_coroutine_type",
+    #ifdef __Pyx_Coroutine_USED
+        (PyObject*)__pyx_CoroutineType);
+    #else
+        Py_None);
+    #endif
+    if (unlikely(result < 0)) goto ignore;
+    result = PyDict_SetItemString(globals, "_cython_generator_type",
+    #ifdef __Pyx_Generator_USED
+        (PyObject*)__pyx_GeneratorType);
+    #else
+        Py_None);
+    #endif
+    if (unlikely(result < 0)) goto ignore;
+    if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore;
+    if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore;
+    result_obj = PyRun_String(py_code, Py_file_input, globals, globals);
+    if (unlikely(!result_obj)) goto ignore;
+    Py_DECREF(result_obj);
+    Py_DECREF(globals);
+    return module;
+ignore:
+    Py_XDECREF(globals);
+    PyErr_WriteUnraisable(module);
+    if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) {
+        Py_DECREF(module);
+        module = NULL;
+    }
+#else
+    py_code++;
+#endif
+    return module;
+}
+
+/* PatchGeneratorABC */
+#ifndef CYTHON_REGISTER_ABCS
+#define CYTHON_REGISTER_ABCS 1
+#endif
+#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+static PyObject* __Pyx_patch_abc_module(PyObject *module);
+static PyObject* __Pyx_patch_abc_module(PyObject *module) {
+    module = __Pyx_Coroutine_patch_module(
+        module, ""
+"if _cython_generator_type is not None:\n"
+"    try: Generator = _module.Generator\n"
+"    except AttributeError: pass\n"
+"    else: Generator.register(_cython_generator_type)\n"
+"if _cython_coroutine_type is not None:\n"
+"    try: Coroutine = _module.Coroutine\n"
+"    except AttributeError: pass\n"
+"    else: Coroutine.register(_cython_coroutine_type)\n"
+    );
+    return module;
+}
+#endif
+static int __Pyx_patch_abc(void) {
+#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+    static int abc_patched = 0;
+    if (CYTHON_REGISTER_ABCS && !abc_patched) {
+        PyObject *module;
+        module = PyImport_ImportModule((PY_MAJOR_VERSION >= 3) ? "collections.abc" : "collections");
+        if (unlikely(!module)) {
+            PyErr_WriteUnraisable(NULL);
+            if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning,
+                    ((PY_MAJOR_VERSION >= 3) ?
+                        "Cython module failed to register with collections.abc module" :
+                        "Cython module failed to register with collections module"), 1) < 0)) {
+                return -1;
+            }
+        } else {
+            module = __Pyx_patch_abc_module(module);
+            abc_patched = 1;
+            if (unlikely(!module))
+                return -1;
+            Py_DECREF(module);
+        }
+        module = PyImport_ImportModule("backports_abc");
+        if (module) {
+            module = __Pyx_patch_abc_module(module);
+            Py_XDECREF(module);
+        }
+        if (!module) {
+            PyErr_Clear();
+        }
+    }
+#else
+    if ((0)) __Pyx_Coroutine_patch_module(NULL, NULL);
+#endif
+    return 0;
+}
+
+/* Coroutine */
+static void __Pyx_CoroutineAwait_dealloc(PyObject *self) {
+    PyObject_GC_UnTrack(self);
+    Py_CLEAR(((__pyx_CoroutineAwaitObject*)self)->coroutine);
+    __Pyx_PyHeapTypeObject_GC_Del(self);
+}
+static int __Pyx_CoroutineAwait_traverse(__pyx_CoroutineAwaitObject *self, visitproc visit, void *arg) {
+    Py_VISIT(self->coroutine);
+    return 0;
+}
+static int __Pyx_CoroutineAwait_clear(__pyx_CoroutineAwaitObject *self) {
+    Py_CLEAR(self->coroutine);
+    return 0;
+}
+static PyObject *__Pyx_CoroutineAwait_Next(__pyx_CoroutineAwaitObject *self) {
+    return __Pyx_Generator_Next(self->coroutine);
+}
+static PyObject *__Pyx_CoroutineAwait_Send(__pyx_CoroutineAwaitObject *self, PyObject *value) {
+    return __Pyx_Coroutine_Send(self->coroutine, value);
+}
+static PyObject *__Pyx_CoroutineAwait_Throw(__pyx_CoroutineAwaitObject *self, PyObject *args) {
+    return __Pyx_Coroutine_Throw(self->coroutine, args);
+}
+static PyObject *__Pyx_CoroutineAwait_Close(__pyx_CoroutineAwaitObject *self, PyObject *arg) {
+    CYTHON_UNUSED_VAR(arg);
+    return __Pyx_Coroutine_Close(self->coroutine);
+}
+static PyObject *__Pyx_CoroutineAwait_self(PyObject *self) {
+    Py_INCREF(self);
+    return self;
+}
+#if !CYTHON_COMPILING_IN_PYPY
+static PyObject *__Pyx_CoroutineAwait_no_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) {
+    CYTHON_UNUSED_VAR(type);
+    CYTHON_UNUSED_VAR(args);
+    CYTHON_UNUSED_VAR(kwargs);
+    PyErr_SetString(PyExc_TypeError, "cannot instantiate type, use 'await coroutine' instead");
+    return NULL;
+}
+#endif
+static PyObject *__Pyx_CoroutineAwait_reduce_ex(__pyx_CoroutineAwaitObject *self, PyObject *arg) {
+    CYTHON_UNUSED_VAR(arg);
+    PyErr_Format(PyExc_TypeError, "cannot pickle '%.200s' object",
+                         Py_TYPE(self)->tp_name);
+    return NULL;
+}
+static PyMethodDef __pyx_CoroutineAwait_methods[] = {
+    {"send", (PyCFunction) __Pyx_CoroutineAwait_Send, METH_O,
+     (char*) PyDoc_STR("send(arg) -> send 'arg' into coroutine,\nreturn next yielded value or raise StopIteration.")},
+    {"throw", (PyCFunction) __Pyx_CoroutineAwait_Throw, METH_VARARGS,
+     (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in coroutine,\nreturn next yielded value or raise StopIteration.")},
+    {"close", (PyCFunction) __Pyx_CoroutineAwait_Close, METH_NOARGS,
+     (char*) PyDoc_STR("close() -> raise GeneratorExit inside coroutine.")},
+    {"__reduce_ex__", (PyCFunction) __Pyx_CoroutineAwait_reduce_ex, METH_O, 0},
+    {"__reduce__", (PyCFunction) __Pyx_CoroutineAwait_reduce_ex, METH_NOARGS, 0},
+    {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_CoroutineAwaitType_slots[] = {
+    {Py_tp_dealloc, (void *)__Pyx_CoroutineAwait_dealloc},
+    {Py_tp_traverse, (void *)__Pyx_CoroutineAwait_traverse},
+    {Py_tp_clear, (void *)__Pyx_CoroutineAwait_clear},
+#if !CYTHON_COMPILING_IN_PYPY
+    {Py_tp_new, (void *)__Pyx_CoroutineAwait_no_new},
+#endif
+    {Py_tp_methods, (void *)__pyx_CoroutineAwait_methods},
+    {Py_tp_iter, (void *)__Pyx_CoroutineAwait_self},
+    {Py_tp_iternext, (void *)__Pyx_CoroutineAwait_Next},
+    {0, 0},
+};
+static PyType_Spec __pyx_CoroutineAwaitType_spec = {
+    __PYX_TYPE_MODULE_PREFIX "coroutine_wrapper",
+    sizeof(__pyx_CoroutineAwaitObject),
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    __pyx_CoroutineAwaitType_slots
+};
+#else
+static PyTypeObject __pyx_CoroutineAwaitType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __PYX_TYPE_MODULE_PREFIX "coroutine_wrapper",
+    sizeof(__pyx_CoroutineAwaitObject),
+    0,
+    (destructor) __Pyx_CoroutineAwait_dealloc,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    PyDoc_STR("A wrapper object implementing __await__ for coroutines."),
+    (traverseproc) __Pyx_CoroutineAwait_traverse,
+    (inquiry) __Pyx_CoroutineAwait_clear,
+    0,
+    0,
+    __Pyx_CoroutineAwait_self,
+    (iternextfunc) __Pyx_CoroutineAwait_Next,
+    __pyx_CoroutineAwait_methods,
+    0                         ,
+    0                      ,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if !CYTHON_COMPILING_IN_PYPY
+    __Pyx_CoroutineAwait_no_new,
+#else
+    0,
+#endif
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+    0,
+#endif
+#if __PYX_NEED_TP_PRINT_SLOT
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030C0000
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030d00A4
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+    0,
+#endif
+};
+#endif
+#if PY_VERSION_HEX < 0x030500B1 || defined(__Pyx_IterableCoroutine_USED) || CYTHON_USE_ASYNC_SLOTS
+static CYTHON_INLINE PyObject *__Pyx__Coroutine_await(PyObject *coroutine) {
+    __pyx_CoroutineAwaitObject *await = PyObject_GC_New(__pyx_CoroutineAwaitObject, __pyx_CoroutineAwaitType);
+    if (unlikely(!await)) return NULL;
+    Py_INCREF(coroutine);
+    await->coroutine = coroutine;
+    PyObject_GC_Track(await);
+    return (PyObject*)await;
+}
+#endif
+#if PY_VERSION_HEX < 0x030500B1
+static PyObject *__Pyx_Coroutine_await_method(PyObject *coroutine, PyObject *arg) {
+    CYTHON_UNUSED_VAR(arg);
+    return __Pyx__Coroutine_await(coroutine);
+}
+#endif
+#if defined(__Pyx_IterableCoroutine_USED) || CYTHON_USE_ASYNC_SLOTS
+static PyObject *__Pyx_Coroutine_await(PyObject *coroutine) {
+    if (unlikely(!coroutine || !__Pyx_Coroutine_Check(coroutine))) {
+        PyErr_SetString(PyExc_TypeError, "invalid input, expected coroutine");
+        return NULL;
+    }
+    return __Pyx__Coroutine_await(coroutine);
+}
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x030500B1
+static PyObject *__Pyx_Coroutine_compare(PyObject *obj, PyObject *other, int op) {
+    PyObject* result;
+    switch (op) {
+        case Py_EQ: result = (other == obj) ? Py_True : Py_False; break;
+        case Py_NE: result = (other != obj) ? Py_True : Py_False; break;
+        default:
+            result = Py_NotImplemented;
+    }
+    Py_INCREF(result);
+    return result;
+}
+#endif
+static PyMethodDef __pyx_Coroutine_methods[] = {
+    {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
+     (char*) PyDoc_STR("send(arg) -> send 'arg' into coroutine,\nreturn next iterated value or raise StopIteration.")},
+    {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
+     (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in coroutine,\nreturn next iterated value or raise StopIteration.")},
+    {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS,
+     (char*) PyDoc_STR("close() -> raise GeneratorExit inside coroutine.")},
+#if PY_VERSION_HEX < 0x030500B1
+    {"__await__", (PyCFunction) __Pyx_Coroutine_await_method, METH_NOARGS,
+     (char*) PyDoc_STR("__await__() -> return an iterator to be used in await expression.")},
+#endif
+    {0, 0, 0, 0}
+};
+static PyMemberDef __pyx_Coroutine_memberlist[] = {
+    {(char *) "cr_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
+    {(char*) "cr_await", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
+     (char*) PyDoc_STR("object being awaited, or None")},
+    {(char*) "cr_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL},
+    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_modulename), 0, 0},
+#if CYTHON_USE_TYPE_SPECS
+    {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CoroutineObject, gi_weakreflist), READONLY, 0},
+#endif
+    {0, 0, 0, 0, 0}
+};
+static PyGetSetDef __pyx_Coroutine_getsets[] = {
+    {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
+     (char*) PyDoc_STR("name of the coroutine"), 0},
+    {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
+     (char*) PyDoc_STR("qualified name of the coroutine"), 0},
+    {(char *) "cr_frame", (getter)__Pyx_Coroutine_get_frame, NULL,
+     (char*) PyDoc_STR("Frame of the coroutine"), 0},
+    {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_CoroutineType_slots[] = {
+    {Py_tp_dealloc, (void *)__Pyx_Coroutine_dealloc},
+    {Py_am_await, (void *)&__Pyx_Coroutine_await},
+    {Py_tp_traverse, (void *)__Pyx_Coroutine_traverse},
+    {Py_tp_methods, (void *)__pyx_Coroutine_methods},
+    {Py_tp_members, (void *)__pyx_Coroutine_memberlist},
+    {Py_tp_getset, (void *)__pyx_Coroutine_getsets},
+    {Py_tp_getattro, (void *) __Pyx_PyObject_GenericGetAttrNoDict},
+#if CYTHON_USE_TP_FINALIZE
+    {Py_tp_finalize, (void *)__Pyx_Coroutine_del},
+#endif
+    {0, 0},
+};
+static PyType_Spec __pyx_CoroutineType_spec = {
+    __PYX_TYPE_MODULE_PREFIX "coroutine",
+    sizeof(__pyx_CoroutineObject),
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
+    __pyx_CoroutineType_slots
+};
+#else
+#if CYTHON_USE_ASYNC_SLOTS
+static __Pyx_PyAsyncMethodsStruct __pyx_Coroutine_as_async = {
+    __Pyx_Coroutine_await,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030A00A3
+    0,
+#endif
+};
+#endif
+static PyTypeObject __pyx_CoroutineType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __PYX_TYPE_MODULE_PREFIX "coroutine",
+    sizeof(__pyx_CoroutineObject),
+    0,
+    (destructor) __Pyx_Coroutine_dealloc,
+    0,
+    0,
+    0,
+#if CYTHON_USE_ASYNC_SLOTS
+    &__pyx_Coroutine_as_async,
+#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_Coroutine_traverse,
+    0,
+#if CYTHON_USE_ASYNC_SLOTS && CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x030500B1
+    __Pyx_Coroutine_compare,
+#else
+    0,
+#endif
+    offsetof(__pyx_CoroutineObject, gi_weakreflist),
+    0,
+    0,
+    __pyx_Coroutine_methods,
+    __pyx_Coroutine_memberlist,
+    __pyx_Coroutine_getsets,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if CYTHON_USE_TP_FINALIZE
+    0,
+#else
+    __Pyx_Coroutine_del,
+#endif
+    0,
+#if CYTHON_USE_TP_FINALIZE
+    __Pyx_Coroutine_del,
+#elif PY_VERSION_HEX >= 0x030400a1
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+    0,
+#endif
+#if __PYX_NEED_TP_PRINT_SLOT
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030C0000
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030d00A4
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+    0,
+#endif
+};
+#endif
+static int __pyx_Coroutine_init(PyObject *module) {
+    CYTHON_MAYBE_UNUSED_VAR(module);
+#if CYTHON_USE_TYPE_SPECS
+    __pyx_CoroutineType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CoroutineType_spec, NULL);
+#else
+    __pyx_CoroutineType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+    __pyx_CoroutineType = __Pyx_FetchCommonType(&__pyx_CoroutineType_type);
+#endif
+    if (unlikely(!__pyx_CoroutineType))
+        return -1;
+#ifdef __Pyx_IterableCoroutine_USED
+    if (unlikely(__pyx_IterableCoroutine_init(module) == -1))
+        return -1;
+#endif
+#if CYTHON_USE_TYPE_SPECS
+    __pyx_CoroutineAwaitType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CoroutineAwaitType_spec, NULL);
+#else
+    __pyx_CoroutineAwaitType = __Pyx_FetchCommonType(&__pyx_CoroutineAwaitType_type);
+#endif
+    if (unlikely(!__pyx_CoroutineAwaitType))
+        return -1;
+    return 0;
+}
+
+/* GetAwaitIter */
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAwaitableIter(PyObject *o) {
+#ifdef __Pyx_Coroutine_USED
+    if (__Pyx_Coroutine_Check(o)) {
+        return __Pyx_NewRef(o);
+    }
+#endif
+    return __Pyx__Coroutine_GetAwaitableIter(o);
+}
+static void __Pyx_Coroutine_AwaitableIterError(PyObject *source) {
+#if PY_VERSION_HEX >= 0x030600B3 && PY_VERSION_HEX < 0x030d0000 || defined(_PyErr_FormatFromCause)
+    __Pyx_TypeName source_type_name = __Pyx_PyType_GetName(Py_TYPE(source));
+    _PyErr_FormatFromCause(PyExc_TypeError,
+        "'async for' received an invalid object from __anext__: " __Pyx_FMT_TYPENAME, source_type_name);
+    __Pyx_DECREF_TypeName(source_type_name);
+#elif PY_MAJOR_VERSION >= 3
+    PyObject *exc, *val, *val2, *tb;
+    __Pyx_TypeName source_type_name = __Pyx_PyType_GetName(Py_TYPE(source));
+    assert(PyErr_Occurred());
+    PyErr_Fetch(&exc, &val, &tb);
+    PyErr_NormalizeException(&exc, &val, &tb);
+    if (tb != NULL) {
+        PyException_SetTraceback(val, tb);
+        Py_DECREF(tb);
+    }
+    Py_DECREF(exc);
+    assert(!PyErr_Occurred());
+    PyErr_Format(PyExc_TypeError,
+        "'async for' received an invalid object from __anext__: " __Pyx_FMT_TYPENAME, source_type_name);
+    __Pyx_DECREF_TypeName(source_type_name);
+    PyErr_Fetch(&exc, &val2, &tb);
+    PyErr_NormalizeException(&exc, &val2, &tb);
+    Py_INCREF(val);
+    PyException_SetCause(val2, val);
+    PyException_SetContext(val2, val);
+    PyErr_Restore(exc, val2, tb);
+#else
+    CYTHON_UNUSED_VAR(source);
+#endif
+}
+static PyObject *__Pyx__Coroutine_GetAwaitableIter(PyObject *obj) {
+    PyObject *res;
+#if CYTHON_USE_ASYNC_SLOTS
+    __Pyx_PyAsyncMethodsStruct* am = __Pyx_PyType_AsAsync(obj);
+    if (likely(am && am->am_await)) {
+        res = (*am->am_await)(obj);
+    } else
+#endif
+#if PY_VERSION_HEX >= 0x030500B2 || defined(PyCoro_CheckExact)
+    if (PyCoro_CheckExact(obj)) {
+        return __Pyx_NewRef(obj);
+    } else
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && defined(CO_ITERABLE_COROUTINE)
+#if PY_VERSION_HEX >= 0x030C00A6
+    if (PyGen_CheckExact(obj) && (PyGen_GetCode((PyGenObject*)obj)->co_flags & CO_ITERABLE_COROUTINE)) {
+#else
+    if (PyGen_CheckExact(obj) && ((PyGenObject*)obj)->gi_code && ((PyCodeObject *)((PyGenObject*)obj)->gi_code)->co_flags & CO_ITERABLE_COROUTINE) {
+#endif
+        return __Pyx_NewRef(obj);
+    } else
+#endif
+    {
+        PyObject *method = NULL;
+        int is_method = __Pyx_PyObject_GetMethod(obj, __pyx_n_s_await, &method);
+        if (likely(is_method)) {
+            res = __Pyx_PyObject_CallOneArg(method, obj);
+        } else if (likely(method)) {
+            res = __Pyx_PyObject_CallNoArg(method);
+        } else
+            goto slot_error;
+        Py_DECREF(method);
+    }
+    if (unlikely(!res)) {
+        __Pyx_Coroutine_AwaitableIterError(obj);
+        goto bad;
+    }
+    if (unlikely(!PyIter_Check(res))) {
+        __Pyx_TypeName res_type_name = __Pyx_PyType_GetName(Py_TYPE(res));
+        PyErr_Format(PyExc_TypeError,
+            "__await__() returned non-iterator of type '" __Pyx_FMT_TYPENAME "'", res_type_name);
+        __Pyx_DECREF_TypeName(res_type_name);
+        Py_CLEAR(res);
+    } else {
+        int is_coroutine = 0;
+        #ifdef __Pyx_Coroutine_USED
+        is_coroutine |= __Pyx_Coroutine_Check(res);
+        #endif
+        #if PY_VERSION_HEX >= 0x030500B2 || defined(PyCoro_CheckExact)
+        is_coroutine |= PyCoro_CheckExact(res);
+        #endif
+        if (unlikely(is_coroutine)) {
+            /* __await__ must return an *iterator*, not
+               a coroutine or another awaitable (see PEP 492) */
+            PyErr_SetString(PyExc_TypeError,
+                            "__await__() returned a coroutine");
+            Py_CLEAR(res);
+        }
+    }
+    return res;
+slot_error:
+    {
+        __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj));
+        PyErr_Format(PyExc_TypeError,
+            "object " __Pyx_FMT_TYPENAME " can't be used in 'await' expression", obj_type_name);
+        __Pyx_DECREF_TypeName(obj_type_name);
+    }
+bad:
+    return NULL;
+}
+
+/* CoroutineYieldFrom */
+  static PyObject* __Pyx__Coroutine_Yield_From_Generic(__pyx_CoroutineObject *gen, PyObject *source) {
+    PyObject *retval;
+    PyObject *source_gen = __Pyx__Coroutine_GetAwaitableIter(source);
+    if (unlikely(!source_gen)) {
+        return NULL;
+    }
+    if (__Pyx_Coroutine_Check(source_gen)) {
+        retval = __Pyx_Generator_Next(source_gen);
+    } else {
+        retval = __Pyx_PyObject_GetIterNextFunc(source_gen)(source_gen);
+    }
+    if (retval) {
+        gen->yieldfrom = source_gen;
+        return retval;
+    }
+    Py_DECREF(source_gen);
+    return NULL;
+}
+static CYTHON_INLINE PyObject* __Pyx_Coroutine_Yield_From(__pyx_CoroutineObject *gen, PyObject *source) {
+    PyObject *retval;
+    if (__Pyx_Coroutine_Check(source)) {
+        if (unlikely(((__pyx_CoroutineObject*)source)->yieldfrom)) {
+            PyErr_SetString(
+                PyExc_RuntimeError,
+                "coroutine is being awaited already");
+            return NULL;
+        }
+        retval = __Pyx_Generator_Next(source);
+#ifdef __Pyx_AsyncGen_USED
+    } else if (__pyx_PyAsyncGenASend_CheckExact(source)) {
+        retval = __Pyx_async_gen_asend_iternext(source);
+#endif
+    } else {
+        return __Pyx__Coroutine_Yield_From_Generic(gen, source);
+    }
+    if (retval) {
+        Py_INCREF(source);
+        gen->yieldfrom = source;
+    }
+    return retval;
+}
+
+/* JoinPyUnicode */
+  static PyObject* __Pyx_PyUnicode_Join(PyObject* value_tuple, Py_ssize_t value_count, Py_ssize_t result_ulength,
+                                      Py_UCS4 max_char) {
+#if CYTHON_USE_UNICODE_INTERNALS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    PyObject *result_uval;
+    int result_ukind, kind_shift;
+    Py_ssize_t i, char_pos;
+    void *result_udata;
+    CYTHON_MAYBE_UNUSED_VAR(max_char);
+#if CYTHON_PEP393_ENABLED
+    result_uval = PyUnicode_New(result_ulength, max_char);
+    if (unlikely(!result_uval)) return NULL;
+    result_ukind = (max_char <= 255) ? PyUnicode_1BYTE_KIND : (max_char <= 65535) ? PyUnicode_2BYTE_KIND : PyUnicode_4BYTE_KIND;
+    kind_shift = (result_ukind == PyUnicode_4BYTE_KIND) ? 2 : result_ukind - 1;
+    result_udata = PyUnicode_DATA(result_uval);
+#else
+    result_uval = PyUnicode_FromUnicode(NULL, result_ulength);
+    if (unlikely(!result_uval)) return NULL;
+    result_ukind = sizeof(Py_UNICODE);
+    kind_shift = (result_ukind == 4) ? 2 : result_ukind - 1;
+    result_udata = PyUnicode_AS_UNICODE(result_uval);
+#endif
+    assert(kind_shift == 2 || kind_shift == 1 || kind_shift == 0);
+    char_pos = 0;
+    for (i=0; i < value_count; i++) {
+        int ukind;
+        Py_ssize_t ulength;
+        void *udata;
+        PyObject *uval = PyTuple_GET_ITEM(value_tuple, i);
+        if (unlikely(__Pyx_PyUnicode_READY(uval)))
+            goto bad;
+        ulength = __Pyx_PyUnicode_GET_LENGTH(uval);
+        if (unlikely(!ulength))
+            continue;
+        if (unlikely((PY_SSIZE_T_MAX >> kind_shift) - ulength < char_pos))
+            goto overflow;
+        ukind = __Pyx_PyUnicode_KIND(uval);
+        udata = __Pyx_PyUnicode_DATA(uval);
+        if (!CYTHON_PEP393_ENABLED || ukind == result_ukind) {
+            memcpy((char *)result_udata + (char_pos << kind_shift), udata, (size_t) (ulength << kind_shift));
+        } else {
+            #if PY_VERSION_HEX >= 0x030d0000
+            if (unlikely(PyUnicode_CopyCharacters(result_uval, char_pos, uval, 0, ulength) < 0)) goto bad;
+            #elif CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030300F0 || defined(_PyUnicode_FastCopyCharacters)
+            _PyUnicode_FastCopyCharacters(result_uval, char_pos, uval, 0, ulength);
+            #else
+            Py_ssize_t j;
+            for (j=0; j < ulength; j++) {
+                Py_UCS4 uchar = __Pyx_PyUnicode_READ(ukind, udata, j);
+                __Pyx_PyUnicode_WRITE(result_ukind, result_udata, char_pos+j, uchar);
+            }
+            #endif
+        }
+        char_pos += ulength;
+    }
+    return result_uval;
+overflow:
+    PyErr_SetString(PyExc_OverflowError, "join() result is too long for a Python string");
+bad:
+    Py_DECREF(result_uval);
+    return NULL;
+#else
+    CYTHON_UNUSED_VAR(max_char);
+    CYTHON_UNUSED_VAR(result_ulength);
+    CYTHON_UNUSED_VAR(value_count);
+    return PyUnicode_Join(__pyx_empty_unicode, value_tuple);
+#endif
+}
+
+/* ErrOccurredWithGIL */
+  static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void) {
+  int err;
+  #ifdef WITH_THREAD
+  PyGILState_STATE _save = PyGILState_Ensure();
+  #endif
+  err = !!PyErr_Occurred();
+  #ifdef WITH_THREAD
+  PyGILState_Release(_save);
+  #endif
+  return err;
+}
+
+/* PyObjectCallMethod0 */
+  static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) {
+    PyObject *method = NULL, *result = NULL;
+    int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method);
+    if (likely(is_method)) {
+        result = __Pyx_PyObject_CallOneArg(method, obj);
+        Py_DECREF(method);
+        return result;
+    }
+    if (unlikely(!method)) goto bad;
+    result = __Pyx_PyObject_CallNoArg(method);
+    Py_DECREF(method);
+bad:
+    return result;
+}
+
+/* UnpackTupleError */
+  static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
+    if (t == Py_None) {
+      __Pyx_RaiseNoneNotIterableError();
+    } else if (PyTuple_GET_SIZE(t) < index) {
+      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
+    } else {
+      __Pyx_RaiseTooManyValuesError(index);
+    }
+}
+
+/* UnpackTuple2 */
+  static CYTHON_INLINE int __Pyx_unpack_tuple2_exact(
+        PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) {
+    PyObject *value1 = NULL, *value2 = NULL;
+#if CYTHON_COMPILING_IN_PYPY
+    value1 = PySequence_ITEM(tuple, 0);  if (unlikely(!value1)) goto bad;
+    value2 = PySequence_ITEM(tuple, 1);  if (unlikely(!value2)) goto bad;
+#else
+    value1 = PyTuple_GET_ITEM(tuple, 0);  Py_INCREF(value1);
+    value2 = PyTuple_GET_ITEM(tuple, 1);  Py_INCREF(value2);
+#endif
+    if (decref_tuple) {
+        Py_DECREF(tuple);
+    }
+    *pvalue1 = value1;
+    *pvalue2 = value2;
+    return 0;
+#if CYTHON_COMPILING_IN_PYPY
+bad:
+    Py_XDECREF(value1);
+    Py_XDECREF(value2);
+    if (decref_tuple) { Py_XDECREF(tuple); }
+    return -1;
+#endif
+}
+static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2,
+                                       int has_known_size, int decref_tuple) {
+    Py_ssize_t index;
+    PyObject *value1 = NULL, *value2 = NULL, *iter = NULL;
+    iternextfunc iternext;
+    iter = PyObject_GetIter(tuple);
+    if (unlikely(!iter)) goto bad;
+    if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; }
+    iternext = __Pyx_PyObject_GetIterNextFunc(iter);
+    value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; }
+    value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; }
+    if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad;
+    Py_DECREF(iter);
+    *pvalue1 = value1;
+    *pvalue2 = value2;
+    return 0;
+unpacking_failed:
+    if (!has_known_size && __Pyx_IterFinish() == 0)
+        __Pyx_RaiseNeedMoreValuesError(index);
+bad:
+    Py_XDECREF(iter);
+    Py_XDECREF(value1);
+    Py_XDECREF(value2);
+    if (decref_tuple) { Py_XDECREF(tuple); }
+    return -1;
+}
+
+/* dict_iter */
+  #if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+#include <string.h>
+#endif
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name,
+                                                   Py_ssize_t* p_orig_length, int* p_source_is_dict) {
+    is_dict = is_dict || likely(PyDict_CheckExact(iterable));
+    *p_source_is_dict = is_dict;
+    if (is_dict) {
+#if !CYTHON_COMPILING_IN_PYPY
+        *p_orig_length = PyDict_Size(iterable);
+        Py_INCREF(iterable);
+        return iterable;
+#elif PY_MAJOR_VERSION >= 3
+        static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL;
+        PyObject **pp = NULL;
+        if (method_name) {
+            const char *name = PyUnicode_AsUTF8(method_name);
+            if (strcmp(name, "iteritems") == 0) pp = &py_items;
+            else if (strcmp(name, "iterkeys") == 0) pp = &py_keys;
+            else if (strcmp(name, "itervalues") == 0) pp = &py_values;
+            if (pp) {
+                if (!*pp) {
+                    *pp = PyUnicode_FromString(name + 4);
+                    if (!*pp)
+                        return NULL;
+                }
+                method_name = *pp;
+            }
+        }
+#endif
+    }
+    *p_orig_length = 0;
+    if (method_name) {
+        PyObject* iter;
+        iterable = __Pyx_PyObject_CallMethod0(iterable, method_name);
+        if (!iterable)
+            return NULL;
+#if !CYTHON_COMPILING_IN_PYPY
+        if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable))
+            return iterable;
+#endif
+        iter = PyObject_GetIter(iterable);
+        Py_DECREF(iterable);
+        return iter;
+    }
+    return PyObject_GetIter(iterable);
+}
+static CYTHON_INLINE int __Pyx_dict_iter_next(
+        PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos,
+        PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
+    PyObject* next_item;
+#if !CYTHON_COMPILING_IN_PYPY
+    if (source_is_dict) {
+        PyObject *key, *value;
+        if (unlikely(orig_length != PyDict_Size(iter_obj))) {
+            PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration");
+            return -1;
+        }
+        if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) {
+            return 0;
+        }
+        if (pitem) {
+            PyObject* tuple = PyTuple_New(2);
+            if (unlikely(!tuple)) {
+                return -1;
+            }
+            Py_INCREF(key);
+            Py_INCREF(value);
+            PyTuple_SET_ITEM(tuple, 0, key);
+            PyTuple_SET_ITEM(tuple, 1, value);
+            *pitem = tuple;
+        } else {
+            if (pkey) {
+                Py_INCREF(key);
+                *pkey = key;
+            }
+            if (pvalue) {
+                Py_INCREF(value);
+                *pvalue = value;
+            }
+        }
+        return 1;
+    } else if (PyTuple_CheckExact(iter_obj)) {
+        Py_ssize_t pos = *ppos;
+        if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0;
+        *ppos = pos + 1;
+        next_item = PyTuple_GET_ITEM(iter_obj, pos);
+        Py_INCREF(next_item);
+    } else if (PyList_CheckExact(iter_obj)) {
+        Py_ssize_t pos = *ppos;
+        if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0;
+        *ppos = pos + 1;
+        next_item = PyList_GET_ITEM(iter_obj, pos);
+        Py_INCREF(next_item);
+    } else
+#endif
+    {
+        next_item = PyIter_Next(iter_obj);
+        if (unlikely(!next_item)) {
+            return __Pyx_IterFinish();
+        }
+    }
+    if (pitem) {
+        *pitem = next_item;
+    } else if (pkey && pvalue) {
+        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
+            return -1;
+    } else if (pkey) {
+        *pkey = next_item;
+    } else {
+        *pvalue = next_item;
+    }
+    return 1;
+}
+
+/* dict_getitem_default */
+  static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) {
+    PyObject* value;
+#if PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000)
+    value = PyDict_GetItemWithError(d, key);
+    if (unlikely(!value)) {
+        if (unlikely(PyErr_Occurred()))
+            return NULL;
+        value = default_value;
+    }
+    Py_INCREF(value);
+    if ((1));
+#else
+    if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) {
+        value = PyDict_GetItem(d, key);
+        if (unlikely(!value)) {
+            value = default_value;
+        }
+        Py_INCREF(value);
+    }
+#endif
+    else {
+        if (default_value == Py_None)
+            value = __Pyx_CallUnboundCMethod1(&__pyx_umethod_PyDict_Type_get, d, key);
+        else
+            value = __Pyx_CallUnboundCMethod2(&__pyx_umethod_PyDict_Type_get, d, key, default_value);
+    }
+    return value;
+}
+
+/* decode_c_string */
+  static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
+         const char* cstring, Py_ssize_t start, Py_ssize_t stop,
+         const char* encoding, const char* errors,
+         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
+    Py_ssize_t length;
+    if (unlikely((start < 0) | (stop < 0))) {
+        size_t slen = strlen(cstring);
+        if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "c-string too long to convert to Python");
+            return NULL;
+        }
+        length = (Py_ssize_t) slen;
+        if (start < 0) {
+            start += length;
+            if (start < 0)
+                start = 0;
+        }
+        if (stop < 0)
+            stop += length;
+    }
+    if (unlikely(stop <= start))
+        return __Pyx_NewRef(__pyx_empty_unicode);
+    length = stop - start;
+    cstring += start;
+    if (decode_func) {
+        return decode_func(cstring, length, errors);
+    } else {
+        return PyUnicode_Decode(cstring, length, encoding, errors);
+    }
+}
+
+/* ReturnWithStopIteration */
+  static void __Pyx__ReturnWithStopIteration(PyObject* value) {
+    PyObject *exc, *args;
+#if CYTHON_COMPILING_IN_CPYTHON
+    __Pyx_PyThreadState_declare
+    if (PY_VERSION_HEX >= 0x030C00A6
+            || unlikely(PyTuple_Check(value) || PyExceptionInstance_Check(value))) {
+        args = PyTuple_New(1);
+        if (unlikely(!args)) return;
+        Py_INCREF(value);
+        PyTuple_SET_ITEM(args, 0, value);
+        exc = PyType_Type.tp_call(PyExc_StopIteration, args, NULL);
+        Py_DECREF(args);
+        if (!exc) return;
+    } else {
+        Py_INCREF(value);
+        exc = value;
+    }
+    #if CYTHON_FAST_THREAD_STATE
+    __Pyx_PyThreadState_assign
+    #if CYTHON_USE_EXC_INFO_STACK
+    if (!__pyx_tstate->exc_info->exc_value)
+    #else
+    if (!__pyx_tstate->exc_type)
+    #endif
+    {
+        Py_INCREF(PyExc_StopIteration);
+        __Pyx_ErrRestore(PyExc_StopIteration, exc, NULL);
+        return;
+    }
+    #endif
+#else
+    args = PyTuple_Pack(1, value);
+    if (unlikely(!args)) return;
+    exc = PyObject_Call(PyExc_StopIteration, args, NULL);
+    Py_DECREF(args);
+    if (unlikely(!exc)) return;
+#endif
+    PyErr_SetObject(PyExc_StopIteration, exc);
+    Py_DECREF(exc);
+}
+
+/* ImportFrom */
+  static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
+    PyObject* value = __Pyx_PyObject_GetAttrStr(module, name);
+    if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) {
+        const char* module_name_str = 0;
+        PyObject* module_name = 0;
+        PyObject* module_dot = 0;
+        PyObject* full_name = 0;
+        PyErr_Clear();
+        module_name_str = PyModule_GetName(module);
+        if (unlikely(!module_name_str)) { goto modbad; }
+        module_name = PyUnicode_FromString(module_name_str);
+        if (unlikely(!module_name)) { goto modbad; }
+        module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__58);
+        if (unlikely(!module_dot)) { goto modbad; }
+        full_name = PyUnicode_Concat(module_dot, name);
+        if (unlikely(!full_name)) { goto modbad; }
+        #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM  < 0x07030400)
+        {
+            PyObject *modules = PyImport_GetModuleDict();
+            if (unlikely(!modules))
+                goto modbad;
+            value = PyObject_GetItem(modules, full_name);
+        }
+        #else
+        value = PyImport_GetModule(full_name);
+        #endif
+      modbad:
+        Py_XDECREF(full_name);
+        Py_XDECREF(module_dot);
+        Py_XDECREF(module_name);
+    }
+    if (unlikely(!value)) {
+        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;
+}
+
+/* ObjectGetItem */
+  #if CYTHON_USE_TYPE_SLOTS
+static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) {
+    PyObject *runerr = NULL;
+    Py_ssize_t key_value;
+    key_value = __Pyx_PyIndex_AsSsize_t(index);
+    if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) {
+        return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1);
+    }
+    if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) {
+        __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index));
+        PyErr_Clear();
+        PyErr_Format(PyExc_IndexError,
+            "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name);
+        __Pyx_DECREF_TypeName(index_type_name);
+    }
+    return NULL;
+}
+static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) {
+    __Pyx_TypeName obj_type_name;
+    if (likely(PyType_Check(obj))) {
+        PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem);
+        if (!meth) {
+            PyErr_Clear();
+        } else {
+            PyObject *result = __Pyx_PyObject_CallOneArg(meth, key);
+            Py_DECREF(meth);
+            return result;
+        }
+    }
+    obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj));
+    PyErr_Format(PyExc_TypeError,
+        "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name);
+    __Pyx_DECREF_TypeName(obj_type_name);
+    return NULL;
+}
+static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) {
+    PyTypeObject *tp = Py_TYPE(obj);
+    PyMappingMethods *mm = tp->tp_as_mapping;
+    PySequenceMethods *sm = tp->tp_as_sequence;
+    if (likely(mm && mm->mp_subscript)) {
+        return mm->mp_subscript(obj, key);
+    }
+    if (likely(sm && sm->sq_item)) {
+        return __Pyx_PyObject_GetIndex(obj, key);
+    }
+    return __Pyx_PyObject_GetItem_Slow(obj, key);
+}
+#endif
+
+/* AsyncIter */
+  static PyObject *__Pyx_Coroutine_GetAsyncIter_Generic(PyObject *obj) {
+    __Pyx_TypeName obj_type_name;
+#if PY_VERSION_HEX < 0x030500B1
+    {
+        PyObject *iter = __Pyx_PyObject_CallMethod0(obj, __pyx_n_s_aiter);
+        if (likely(iter))
+            return iter;
+        if (!PyErr_ExceptionMatches(PyExc_AttributeError))
+            return NULL;
+    }
+#else
+    (void)&__Pyx_PyObject_CallMethod0;
+#endif
+    obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj));
+    PyErr_Format(PyExc_TypeError,
+                 "'async for' requires an object with __aiter__ method, got " __Pyx_FMT_TYPENAME, obj_type_name);
+    __Pyx_DECREF_TypeName(obj_type_name);
+    return NULL;
+}
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_GetAsyncIter(PyObject *obj) {
+#ifdef __Pyx_AsyncGen_USED
+    if (__Pyx_AsyncGen_CheckExact(obj)) {
+        return __Pyx_NewRef(obj);
+    }
+#endif
+#if CYTHON_USE_ASYNC_SLOTS
+    {
+        __Pyx_PyAsyncMethodsStruct* am = __Pyx_PyType_AsAsync(obj);
+        if (likely(am && am->am_aiter)) {
+            return (*am->am_aiter)(obj);
+        }
+    }
+#endif
+    return __Pyx_Coroutine_GetAsyncIter_Generic(obj);
+}
+static PyObject *__Pyx__Coroutine_AsyncIterNext(PyObject *obj) {
+#if PY_VERSION_HEX < 0x030500B1
+    {
+        PyObject *value = __Pyx_PyObject_CallMethod0(obj, __pyx_n_s_anext);
+        if (likely(value))
+            return value;
+    }
+    if (PyErr_ExceptionMatches(PyExc_AttributeError))
+#endif
+    {
+        __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj));
+        PyErr_Format(PyExc_TypeError,
+            "'async for' requires an object with __anext__ method, got " __Pyx_FMT_TYPENAME, obj_type_name);
+        __Pyx_DECREF_TypeName(obj_type_name);
+    }
+    return NULL;
+}
+static CYTHON_INLINE PyObject *__Pyx_Coroutine_AsyncIterNext(PyObject *obj) {
+#ifdef __Pyx_AsyncGen_USED
+    if (__Pyx_AsyncGen_CheckExact(obj)) {
+        return __Pyx_async_gen_anext(obj);
+    }
+#endif
+#if CYTHON_USE_ASYNC_SLOTS
+    {
+        __Pyx_PyAsyncMethodsStruct* am = __Pyx_PyType_AsAsync(obj);
+        if (likely(am && am->am_anext)) {
+            return (*am->am_anext)(obj);
+        }
+    }
+#endif
+    return __Pyx__Coroutine_AsyncIterNext(obj);
+}
+
+/* CallNextTpTraverse */
+  static int __Pyx_call_next_tp_traverse(PyObject* obj, visitproc v, void *a, traverseproc current_tp_traverse) {
+    PyTypeObject* type = Py_TYPE(obj);
+    traverseproc tp_traverse = NULL;
+    while (type && __Pyx_PyType_GetSlot(type, tp_traverse, traverseproc) != current_tp_traverse)
+        type = __Pyx_PyType_GetSlot(type, tp_base, PyTypeObject*);
+    while (type && (tp_traverse = __Pyx_PyType_GetSlot(type, tp_traverse, traverseproc)) == current_tp_traverse)
+        type = __Pyx_PyType_GetSlot(type, tp_base, PyTypeObject*);
+    if (type && tp_traverse)
+        return tp_traverse(obj, v, a);
+    return 0;
+}
+
+/* CallNextTpClear */
+  static void __Pyx_call_next_tp_clear(PyObject* obj, inquiry current_tp_clear) {
+    PyTypeObject* type = Py_TYPE(obj);
+    inquiry tp_clear = NULL;
+    while (type && __Pyx_PyType_GetSlot(type, tp_clear, inquiry) != current_tp_clear)
+        type = __Pyx_PyType_GetSlot(type, tp_base, PyTypeObject*);
+    while (type && (tp_clear = __Pyx_PyType_GetSlot(type, tp_clear, inquiry)) == current_tp_clear)
+        type = __Pyx_PyType_GetSlot(type, tp_base, PyTypeObject*);
+    if (type && tp_clear)
+        tp_clear(obj);
+}
+
+/* ValidateBasesTuple */
+  #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS
+static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) {
+    Py_ssize_t i, n;
+#if CYTHON_ASSUME_SAFE_MACROS
+    n = PyTuple_GET_SIZE(bases);
+#else
+    n = PyTuple_Size(bases);
+    if (n < 0) return -1;
+#endif
+    for (i = 1; i < n; i++)
+    {
+#if CYTHON_AVOID_BORROWED_REFS
+        PyObject *b0 = PySequence_GetItem(bases, i);
+        if (!b0) return -1;
+#elif CYTHON_ASSUME_SAFE_MACROS
+        PyObject *b0 = PyTuple_GET_ITEM(bases, i);
+#else
+        PyObject *b0 = PyTuple_GetItem(bases, i);
+        if (!b0) return -1;
+#endif
+        PyTypeObject *b;
+#if PY_MAJOR_VERSION < 3
+        if (PyClass_Check(b0))
+        {
+            PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class",
+                         PyString_AS_STRING(((PyClassObject*)b0)->cl_name));
+#if CYTHON_AVOID_BORROWED_REFS
+            Py_DECREF(b0);
+#endif
+            return -1;
+        }
+#endif
+        b = (PyTypeObject*) b0;
+        if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE))
+        {
+            __Pyx_TypeName b_name = __Pyx_PyType_GetName(b);
+            PyErr_Format(PyExc_TypeError,
+                "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name);
+            __Pyx_DECREF_TypeName(b_name);
+#if CYTHON_AVOID_BORROWED_REFS
+            Py_DECREF(b0);
+#endif
+            return -1;
+        }
+        if (dictoffset == 0)
+        {
+            Py_ssize_t b_dictoffset = 0;
+#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY
+            b_dictoffset = b->tp_dictoffset;
+#else
+            PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__");
+            if (!py_b_dictoffset) goto dictoffset_return;
+            b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset);
+            Py_DECREF(py_b_dictoffset);
+            if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return;
+#endif
+            if (b_dictoffset) {
+                {
+                    __Pyx_TypeName b_name = __Pyx_PyType_GetName(b);
+                    PyErr_Format(PyExc_TypeError,
+                        "extension type '%.200s' has no __dict__ slot, "
+                        "but base type '" __Pyx_FMT_TYPENAME "' has: "
+                        "either add 'cdef dict __dict__' to the extension type "
+                        "or add '__slots__ = [...]' to the base type",
+                        type_name, b_name);
+                    __Pyx_DECREF_TypeName(b_name);
+                }
+#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY)
+              dictoffset_return:
+#endif
+#if CYTHON_AVOID_BORROWED_REFS
+                Py_DECREF(b0);
+#endif
+                return -1;
+            }
+        }
+#if CYTHON_AVOID_BORROWED_REFS
+        Py_DECREF(b0);
+#endif
+    }
+    return 0;
+}
+#endif
+
+/* PyType_Ready */
+  static int __Pyx_PyType_Ready(PyTypeObject *t) {
+#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION)
+    (void)__Pyx_PyObject_CallMethod0;
+#if CYTHON_USE_TYPE_SPECS
+    (void)__Pyx_validate_bases_tuple;
+#endif
+    return PyType_Ready(t);
+#else
+    int r;
+    PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*);
+    if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1))
+        return -1;
+#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION)
+    {
+        int gc_was_enabled;
+    #if PY_VERSION_HEX >= 0x030A00b1
+        gc_was_enabled = PyGC_Disable();
+        (void)__Pyx_PyObject_CallMethod0;
+    #else
+        PyObject *ret, *py_status;
+        PyObject *gc = NULL;
+        #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400)
+        gc = PyImport_GetModule(__pyx_kp_u_gc);
+        #endif
+        if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc);
+        if (unlikely(!gc)) return -1;
+        py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled);
+        if (unlikely(!py_status)) {
+            Py_DECREF(gc);
+            return -1;
+        }
+        gc_was_enabled = __Pyx_PyObject_IsTrue(py_status);
+        Py_DECREF(py_status);
+        if (gc_was_enabled > 0) {
+            ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable);
+            if (unlikely(!ret)) {
+                Py_DECREF(gc);
+                return -1;
+            }
+            Py_DECREF(ret);
+        } else if (unlikely(gc_was_enabled == -1)) {
+            Py_DECREF(gc);
+            return -1;
+        }
+    #endif
+        t->tp_flags |= Py_TPFLAGS_HEAPTYPE;
+#if PY_VERSION_HEX >= 0x030A0000
+        t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
+#endif
+#else
+        (void)__Pyx_PyObject_CallMethod0;
+#endif
+    r = PyType_Ready(t);
+#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION)
+        t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE;
+    #if PY_VERSION_HEX >= 0x030A00b1
+        if (gc_was_enabled)
+            PyGC_Enable();
+    #else
+        if (gc_was_enabled) {
+            PyObject *tp, *v, *tb;
+            PyErr_Fetch(&tp, &v, &tb);
+            ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable);
+            if (likely(ret || r == -1)) {
+                Py_XDECREF(ret);
+                PyErr_Restore(tp, v, tb);
+            } else {
+                Py_XDECREF(tp);
+                Py_XDECREF(v);
+                Py_XDECREF(tb);
+                r = -1;
+            }
+        }
+        Py_DECREF(gc);
+    #endif
+    }
+#endif
+    return r;
+#endif
+}
+
+/* PyObject_GenericGetAttr */
+  #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
+static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) {
+    if (unlikely(Py_TYPE(obj)->tp_dictoffset)) {
+        return PyObject_GenericGetAttr(obj, attr_name);
+    }
+    return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name);
+}
+#endif
+
+/* SetVTable */
+  static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) {
+    PyObject *ob = PyCapsule_New(vtable, 0, 0);
+    if (unlikely(!ob))
+        goto bad;
+#if CYTHON_COMPILING_IN_LIMITED_API
+    if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0))
+#else
+    if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0))
+#endif
+        goto bad;
+    Py_DECREF(ob);
+    return 0;
+bad:
+    Py_XDECREF(ob);
+    return -1;
+}
+
+/* GetVTable */
+  static void* __Pyx_GetVtable(PyTypeObject *type) {
+    void* ptr;
+#if CYTHON_COMPILING_IN_LIMITED_API
+    PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable);
+#else
+    PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable);
+#endif
+    if (!ob)
+        goto bad;
+    ptr = PyCapsule_GetPointer(ob, 0);
+    if (!ptr && !PyErr_Occurred())
+        PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type");
+    Py_DECREF(ob);
+    return ptr;
+bad:
+    Py_XDECREF(ob);
+    return NULL;
+}
+
+/* MergeVTables */
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+static int __Pyx_MergeVtables(PyTypeObject *type) {
+    int i;
+    void** base_vtables;
+    __Pyx_TypeName tp_base_name;
+    __Pyx_TypeName base_name;
+    void* unknown = (void*)-1;
+    PyObject* bases = type->tp_bases;
+    int base_depth = 0;
+    {
+        PyTypeObject* base = type->tp_base;
+        while (base) {
+            base_depth += 1;
+            base = base->tp_base;
+        }
+    }
+    base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1));
+    base_vtables[0] = unknown;
+    for (i = 1; i < PyTuple_GET_SIZE(bases); i++) {
+        void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i)));
+        if (base_vtable != NULL) {
+            int j;
+            PyTypeObject* base = type->tp_base;
+            for (j = 0; j < base_depth; j++) {
+                if (base_vtables[j] == unknown) {
+                    base_vtables[j] = __Pyx_GetVtable(base);
+                    base_vtables[j + 1] = unknown;
+                }
+                if (base_vtables[j] == base_vtable) {
+                    break;
+                } else if (base_vtables[j] == NULL) {
+                    goto bad;
+                }
+                base = base->tp_base;
+            }
+        }
+    }
+    PyErr_Clear();
+    free(base_vtables);
+    return 0;
+bad:
+    tp_base_name = __Pyx_PyType_GetName(type->tp_base);
+    base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i));
+    PyErr_Format(PyExc_TypeError,
+        "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name);
+    __Pyx_DECREF_TypeName(tp_base_name);
+    __Pyx_DECREF_TypeName(base_name);
+    free(base_vtables);
+    return -1;
+}
+#endif
+
+/* SetupReduce */
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) {
+  int ret;
+  PyObject *name_attr;
+  name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name_2);
+  if (likely(name_attr)) {
+      ret = PyObject_RichCompareBool(name_attr, name, Py_EQ);
+  } else {
+      ret = -1;
+  }
+  if (unlikely(ret < 0)) {
+      PyErr_Clear();
+      ret = 0;
+  }
+  Py_XDECREF(name_attr);
+  return ret;
+}
+static int __Pyx_setup_reduce(PyObject* type_obj) {
+    int ret = 0;
+    PyObject *object_reduce = NULL;
+    PyObject *object_getstate = NULL;
+    PyObject *object_reduce_ex = NULL;
+    PyObject *reduce = NULL;
+    PyObject *reduce_ex = NULL;
+    PyObject *reduce_cython = NULL;
+    PyObject *setstate = NULL;
+    PyObject *setstate_cython = NULL;
+    PyObject *getstate = NULL;
+#if CYTHON_USE_PYTYPE_LOOKUP
+    getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate);
+#else
+    getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate);
+    if (!getstate && PyErr_Occurred()) {
+        goto __PYX_BAD;
+    }
+#endif
+    if (getstate) {
+#if CYTHON_USE_PYTYPE_LOOKUP
+        object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate);
+#else
+        object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate);
+        if (!object_getstate && PyErr_Occurred()) {
+            goto __PYX_BAD;
+        }
+#endif
+        if (object_getstate != getstate) {
+            goto __PYX_GOOD;
+        }
+    }
+#if CYTHON_USE_PYTYPE_LOOKUP
+    object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD;
+#else
+    object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD;
+#endif
+    reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD;
+    if (reduce_ex == object_reduce_ex) {
+#if CYTHON_USE_PYTYPE_LOOKUP
+        object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD;
+#else
+        object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD;
+#endif
+        reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD;
+        if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) {
+            reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython);
+            if (likely(reduce_cython)) {
+                ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
+                ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
+            } else if (reduce == object_reduce || PyErr_Occurred()) {
+                goto __PYX_BAD;
+            }
+            setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate);
+            if (!setstate) PyErr_Clear();
+            if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) {
+                setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython);
+                if (likely(setstate_cython)) {
+                    ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
+                    ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
+                } else if (!setstate || PyErr_Occurred()) {
+                    goto __PYX_BAD;
+                }
+            }
+            PyType_Modified((PyTypeObject*)type_obj);
+        }
+    }
+    goto __PYX_GOOD;
+__PYX_BAD:
+    if (!PyErr_Occurred()) {
+        __Pyx_TypeName type_obj_name =
+            __Pyx_PyType_GetName((PyTypeObject*)type_obj);
+        PyErr_Format(PyExc_RuntimeError,
+            "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name);
+        __Pyx_DECREF_TypeName(type_obj_name);
+    }
+    ret = -1;
+__PYX_GOOD:
+#if !CYTHON_USE_PYTYPE_LOOKUP
+    Py_XDECREF(object_reduce);
+    Py_XDECREF(object_reduce_ex);
+    Py_XDECREF(object_getstate);
+    Py_XDECREF(getstate);
+#endif
+    Py_XDECREF(reduce);
+    Py_XDECREF(reduce_ex);
+    Py_XDECREF(reduce_cython);
+    Py_XDECREF(setstate);
+    Py_XDECREF(setstate_cython);
+    return ret;
+}
+#endif
+
+/* FormatTypeName */
+  #if CYTHON_COMPILING_IN_LIMITED_API
+static __Pyx_TypeName
+__Pyx_PyType_GetName(PyTypeObject* tp)
+{
+    PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp,
+                                               __pyx_n_s_name_2);
+    if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) {
+        PyErr_Clear();
+        Py_XDECREF(name);
+        name = __Pyx_NewRef(__pyx_n_s__107);
+    }
+    return name;
+}
+#endif
+
+/* ValidateExternBase */
+  static int __Pyx_validate_extern_base(PyTypeObject *base) {
+    Py_ssize_t itemsize;
+#if CYTHON_COMPILING_IN_LIMITED_API
+    PyObject *py_itemsize;
+#endif
+#if !CYTHON_COMPILING_IN_LIMITED_API
+    itemsize = ((PyTypeObject *)base)->tp_itemsize;
+#else
+    py_itemsize = PyObject_GetAttrString((PyObject*)base, "__itemsize__");
+    if (!py_itemsize)
+        return -1;
+    itemsize = PyLong_AsSsize_t(py_itemsize);
+    Py_DECREF(py_itemsize);
+    py_itemsize = 0;
+    if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred())
+        return -1;
+#endif
+    if (itemsize) {
+        __Pyx_TypeName b_name = __Pyx_PyType_GetName(base);
+        PyErr_Format(PyExc_TypeError,
+                "inheritance from PyVarObject types like '" __Pyx_FMT_TYPENAME "' not currently supported", b_name);
+        __Pyx_DECREF_TypeName(b_name);
+        return -1;
+    }
+    return 0;
+}
+
+/* TypeImport */
+  #ifndef __PYX_HAVE_RT_ImportType_3_0_11
+#define __PYX_HAVE_RT_ImportType_3_0_11
+static PyTypeObject *__Pyx_ImportType_3_0_11(PyObject *module, const char *module_name, const char *class_name,
+    size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_11 check_size)
+{
+    PyObject *result = 0;
+    char warning[200];
+    Py_ssize_t basicsize;
+    Py_ssize_t itemsize;
+#if CYTHON_COMPILING_IN_LIMITED_API
+    PyObject *py_basicsize;
+    PyObject *py_itemsize;
+#endif
+    result = PyObject_GetAttrString(module, class_name);
+    if (!result)
+        goto bad;
+    if (!PyType_Check(result)) {
+        PyErr_Format(PyExc_TypeError,
+            "%.200s.%.200s is not a type object",
+            module_name, class_name);
+        goto bad;
+    }
+#if !CYTHON_COMPILING_IN_LIMITED_API
+    basicsize = ((PyTypeObject *)result)->tp_basicsize;
+    itemsize = ((PyTypeObject *)result)->tp_itemsize;
+#else
+    py_basicsize = PyObject_GetAttrString(result, "__basicsize__");
+    if (!py_basicsize)
+        goto bad;
+    basicsize = PyLong_AsSsize_t(py_basicsize);
+    Py_DECREF(py_basicsize);
+    py_basicsize = 0;
+    if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred())
+        goto bad;
+    py_itemsize = PyObject_GetAttrString(result, "__itemsize__");
+    if (!py_itemsize)
+        goto bad;
+    itemsize = PyLong_AsSsize_t(py_itemsize);
+    Py_DECREF(py_itemsize);
+    py_itemsize = 0;
+    if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred())
+        goto bad;
+#endif
+    if (itemsize) {
+        if (size % alignment) {
+            alignment = size % alignment;
+        }
+        if (itemsize < (Py_ssize_t)alignment)
+            itemsize = (Py_ssize_t)alignment;
+    }
+    if ((size_t)(basicsize + itemsize) < size) {
+        PyErr_Format(PyExc_ValueError,
+            "%.200s.%.200s size changed, may indicate binary incompatibility. "
+            "Expected %zd from C header, got %zd from PyObject",
+            module_name, class_name, size, basicsize+itemsize);
+        goto bad;
+    }
+    if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_11 &&
+            ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) {
+        PyErr_Format(PyExc_ValueError,
+            "%.200s.%.200s size changed, may indicate binary incompatibility. "
+            "Expected %zd from C header, got %zd-%zd from PyObject",
+            module_name, class_name, size, basicsize, basicsize+itemsize);
+        goto bad;
+    }
+    else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_11 && (size_t)basicsize > size) {
+        PyOS_snprintf(warning, sizeof(warning),
+            "%s.%s size changed, may indicate binary incompatibility. "
+            "Expected %zd from C header, got %zd from PyObject",
+            module_name, class_name, size, basicsize);
+        if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;
+    }
+    return (PyTypeObject *)result;
+bad:
+    Py_XDECREF(result);
+    return NULL;
+}
+#endif
+
+/* PatchInspect */
+  static PyObject* __Pyx_patch_inspect(PyObject* module) {
+#if defined(__Pyx_Generator_USED) && (!defined(CYTHON_PATCH_INSPECT) || CYTHON_PATCH_INSPECT)
+    static int inspect_patched = 0;
+    if (unlikely((!inspect_patched) && module)) {
+        module = __Pyx_Coroutine_patch_module(
+            module, ""
+"old_types = getattr(_module.isgenerator, '_cython_generator_types', None)\n"
+"if old_types is None or not isinstance(old_types, set):\n"
+"    old_types = set()\n"
+"    def cy_wrap(orig_func, type=type, cython_generator_types=old_types):\n"
+"        def cy_isgenerator(obj): return type(obj) in cython_generator_types or orig_func(obj)\n"
+"        cy_isgenerator._cython_generator_types = cython_generator_types\n"
+"        return cy_isgenerator\n"
+"    _module.isgenerator = cy_wrap(_module.isgenerator)\n"
+"old_types.add(_cython_generator_type)\n"
+        );
+        inspect_patched = 1;
+    }
+#else
+    if ((0)) return __Pyx_Coroutine_patch_module(module, NULL);
+#endif
+    return module;
+}
+
+/* PatchAsyncIO */
+  static PyObject* __Pyx_patch_asyncio(PyObject* module) {
+#if PY_VERSION_HEX < 0x030500B2 &&\
+        (defined(__Pyx_Coroutine_USED) || defined(__Pyx_Generator_USED)) &&\
+        (!defined(CYTHON_PATCH_ASYNCIO) || CYTHON_PATCH_ASYNCIO)
+    PyObject *patch_module = NULL;
+    static int asyncio_patched = 0;
+    if (unlikely((!asyncio_patched) && module)) {
+        PyObject *package;
+        package = __Pyx_Import(__pyx_n_s_asyncio_coroutines, NULL, 0);
+        if (package) {
+            patch_module = __Pyx_Coroutine_patch_module(
+                PyObject_GetAttrString(package, "coroutines"), ""
+"try:\n"
+"    coro_types = _module._COROUTINE_TYPES\n"
+"except AttributeError: pass\n"
+"else:\n"
+"    if _cython_coroutine_type is not None and _cython_coroutine_type not in coro_types:\n"
+"        coro_types = tuple(coro_types) + (_cython_coroutine_type,)\n"
+"    if _cython_generator_type is not None and _cython_generator_type not in coro_types:\n"
+"        coro_types = tuple(coro_types) + (_cython_generator_type,)\n"
+"_module._COROUTINE_TYPES = coro_types\n"
+            );
+        } else {
+            PyErr_Clear();
+            package = __Pyx_Import(__pyx_n_s_asyncio_tasks, NULL, 0);
+            if (unlikely(!package)) goto asyncio_done;
+            patch_module = __Pyx_Coroutine_patch_module(
+                PyObject_GetAttrString(package, "tasks"), ""
+"if hasattr(_module, 'iscoroutine'):\n"
+"    old_types = getattr(_module.iscoroutine, '_cython_coroutine_types', None)\n"
+"    if old_types is None or not isinstance(old_types, set):\n"
+"        old_types = set()\n"
+"        def cy_wrap(orig_func, type=type, cython_coroutine_types=old_types):\n"
+"            def cy_iscoroutine(obj): return type(obj) in cython_coroutine_types or orig_func(obj)\n"
+"            cy_iscoroutine._cython_coroutine_types = cython_coroutine_types\n"
+"            return cy_iscoroutine\n"
+"        _module.iscoroutine = cy_wrap(_module.iscoroutine)\n"
+"    if _cython_coroutine_type is not None:\n"
+"        old_types.add(_cython_coroutine_type)\n"
+"    if _cython_generator_type is not None:\n"
+"        old_types.add(_cython_generator_type)\n"
+            );
+        }
+        Py_DECREF(package);
+        if (unlikely(!patch_module)) goto ignore;
+asyncio_done:
+        PyErr_Clear();
+        asyncio_patched = 1;
+#ifdef __Pyx_Generator_USED
+        {
+            PyObject *inspect_module;
+            if (patch_module) {
+                inspect_module = PyObject_GetAttr(patch_module, __pyx_n_s_inspect);
+                Py_DECREF(patch_module);
+            } else {
+                inspect_module = __Pyx_Import(__pyx_n_s_inspect, NULL, 0);
+            }
+            if (unlikely(!inspect_module)) goto ignore;
+            inspect_module = __Pyx_patch_inspect(inspect_module);
+            if (unlikely(!inspect_module)) {
+                Py_DECREF(module);
+                module = NULL;
+            }
+            Py_XDECREF(inspect_module);
+        }
+#else
+        if ((0)) return __Pyx_patch_inspect(module);
+#endif
+    }
+    return module;
+ignore:
+    PyErr_WriteUnraisable(module);
+    if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch asyncio package with custom generator type", 1) < 0)) {
+        Py_DECREF(module);
+        module = NULL;
+    }
+#else
+    if ((0)) return __Pyx_patch_inspect(__Pyx_Coroutine_patch_module(module, NULL));
+#endif
+    return module;
+}
+
+/* UnicodeConcatInPlace */
+  # if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+static int
+__Pyx_unicode_modifiable(PyObject *unicode)
+{
+    if (Py_REFCNT(unicode) != 1)
+        return 0;
+    if (!PyUnicode_CheckExact(unicode))
+        return 0;
+    if (PyUnicode_CHECK_INTERNED(unicode))
+        return 0;
+    return 1;
+}
+static CYTHON_INLINE PyObject *__Pyx_PyUnicode_ConcatInPlaceImpl(PyObject **p_left, PyObject *right
+        #if CYTHON_REFNANNY
+        , void* __pyx_refnanny
+        #endif
+    ) {
+    PyObject *left = *p_left;
+    Py_ssize_t left_len, right_len, new_len;
+    if (unlikely(__Pyx_PyUnicode_READY(left) == -1))
+        return NULL;
+    if (unlikely(__Pyx_PyUnicode_READY(right) == -1))
+        return NULL;
+    left_len = PyUnicode_GET_LENGTH(left);
+    if (left_len == 0) {
+        Py_INCREF(right);
+        return right;
+    }
+    right_len = PyUnicode_GET_LENGTH(right);
+    if (right_len == 0) {
+        Py_INCREF(left);
+        return left;
+    }
+    if (unlikely(left_len > PY_SSIZE_T_MAX - right_len)) {
+        PyErr_SetString(PyExc_OverflowError,
+                        "strings are too large to concat");
+        return NULL;
+    }
+    new_len = left_len + right_len;
+    if (__Pyx_unicode_modifiable(left)
+            && PyUnicode_CheckExact(right)
+            && PyUnicode_KIND(right) <= PyUnicode_KIND(left)
+            && !(PyUnicode_IS_ASCII(left) && !PyUnicode_IS_ASCII(right))) {
+        int ret;
+        __Pyx_GIVEREF(*p_left);
+        ret = PyUnicode_Resize(p_left, new_len);
+        __Pyx_GOTREF(*p_left);
+        if (unlikely(ret != 0))
+            return NULL;
+        #if PY_VERSION_HEX >= 0x030d0000
+        if (unlikely(PyUnicode_CopyCharacters(*p_left, left_len, right, 0, right_len) < 0)) return NULL;
+        #else
+        _PyUnicode_FastCopyCharacters(*p_left, left_len, right, 0, right_len);
+        #endif
+        __Pyx_INCREF(*p_left);
+        __Pyx_GIVEREF(*p_left);
+        return *p_left;
+    } else {
+        return __Pyx_PyUnicode_Concat(left, right);
+    }
+  }
+#endif
+
+/* CalculateMetaclass */
+  static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases) {
+    Py_ssize_t i, nbases;
+#if CYTHON_ASSUME_SAFE_MACROS
+    nbases = PyTuple_GET_SIZE(bases);
+#else
+    nbases = PyTuple_Size(bases);
+    if (nbases < 0) return NULL;
+#endif
+    for (i=0; i < nbases; i++) {
+        PyTypeObject *tmptype;
+#if CYTHON_ASSUME_SAFE_MACROS
+        PyObject *tmp = PyTuple_GET_ITEM(bases, i);
+#else
+        PyObject *tmp = PyTuple_GetItem(bases, i);
+        if (!tmp) return NULL;
+#endif
+        tmptype = Py_TYPE(tmp);
+#if PY_MAJOR_VERSION < 3
+        if (tmptype == &PyClass_Type)
+            continue;
+#endif
+        if (!metaclass) {
+            metaclass = tmptype;
+            continue;
+        }
+        if (PyType_IsSubtype(metaclass, tmptype))
+            continue;
+        if (PyType_IsSubtype(tmptype, metaclass)) {
+            metaclass = tmptype;
+            continue;
+        }
+        PyErr_SetString(PyExc_TypeError,
+                        "metaclass conflict: "
+                        "the metaclass of a derived class "
+                        "must be a (non-strict) subclass "
+                        "of the metaclasses of all its bases");
+        return NULL;
+    }
+    if (!metaclass) {
+#if PY_MAJOR_VERSION < 3
+        metaclass = &PyClass_Type;
+#else
+        metaclass = &PyType_Type;
+#endif
+    }
+    Py_INCREF((PyObject*) metaclass);
+    return (PyObject*) metaclass;
+}
+
+/* Py3ClassCreate */
+  static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name,
+                                           PyObject *qualname, PyObject *mkw, PyObject *modname, PyObject *doc) {
+    PyObject *ns;
+    if (metaclass) {
+        PyObject *prep = __Pyx_PyObject_GetAttrStrNoError(metaclass, __pyx_n_s_prepare);
+        if (prep) {
+            PyObject *pargs[3] = {NULL, name, bases};
+            ns = __Pyx_PyObject_FastCallDict(prep, pargs+1, 2 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET, mkw);
+            Py_DECREF(prep);
+        } else {
+            if (unlikely(PyErr_Occurred()))
+                return NULL;
+            ns = PyDict_New();
+        }
+    } else {
+        ns = PyDict_New();
+    }
+    if (unlikely(!ns))
+        return NULL;
+    if (unlikely(PyObject_SetItem(ns, __pyx_n_s_module, modname) < 0)) goto bad;
+#if PY_VERSION_HEX >= 0x03030000
+    if (unlikely(PyObject_SetItem(ns, __pyx_n_s_qualname, qualname) < 0)) goto bad;
+#else
+    CYTHON_MAYBE_UNUSED_VAR(qualname);
+#endif
+    if (unlikely(doc && PyObject_SetItem(ns, __pyx_n_s_doc, doc) < 0)) goto bad;
+    return ns;
+bad:
+    Py_DECREF(ns);
+    return NULL;
+}
+#if PY_VERSION_HEX < 0x030600A4 && CYTHON_PEP487_INIT_SUBCLASS
+static int __Pyx_SetNamesPEP487(PyObject *type_obj) {
+    PyTypeObject *type = (PyTypeObject*) type_obj;
+    PyObject *names_to_set, *key, *value, *set_name, *tmp;
+    Py_ssize_t i = 0;
+#if CYTHON_USE_TYPE_SLOTS
+    names_to_set = PyDict_Copy(type->tp_dict);
+#else
+    {
+        PyObject *d = PyObject_GetAttr(type_obj, __pyx_n_s_dict);
+        names_to_set = NULL;
+        if (likely(d)) {
+            PyObject *names_to_set = PyDict_New();
+            int ret = likely(names_to_set) ? PyDict_Update(names_to_set, d) : -1;
+            Py_DECREF(d);
+            if (unlikely(ret < 0))
+                Py_CLEAR(names_to_set);
+        }
+    }
+#endif
+    if (unlikely(names_to_set == NULL))
+        goto bad;
+    while (PyDict_Next(names_to_set, &i, &key, &value)) {
+        set_name = __Pyx_PyObject_LookupSpecialNoError(value, __pyx_n_s_set_name);
+        if (unlikely(set_name != NULL)) {
+            tmp = __Pyx_PyObject_Call2Args(set_name, type_obj, key);
+            Py_DECREF(set_name);
+            if (unlikely(tmp == NULL)) {
+                __Pyx_TypeName value_type_name =
+                    __Pyx_PyType_GetName(Py_TYPE(value));
+                __Pyx_TypeName type_name = __Pyx_PyType_GetName(type);
+                PyErr_Format(PyExc_RuntimeError,
+#if PY_MAJOR_VERSION >= 3
+                    "Error calling __set_name__ on '" __Pyx_FMT_TYPENAME "' instance %R " "in '" __Pyx_FMT_TYPENAME "'",
+                    value_type_name, key, type_name);
+#else
+                    "Error calling __set_name__ on '" __Pyx_FMT_TYPENAME "' instance %.100s in '" __Pyx_FMT_TYPENAME "'",
+                    value_type_name,
+                    PyString_Check(key) ? PyString_AS_STRING(key) : "?",
+                    type_name);
+#endif
+                goto bad;
+            } else {
+                Py_DECREF(tmp);
+            }
+        }
+        else if (unlikely(PyErr_Occurred())) {
+            goto bad;
+        }
+    }
+    Py_DECREF(names_to_set);
+    return 0;
+bad:
+    Py_XDECREF(names_to_set);
+    return -1;
+}
+static PyObject *__Pyx_InitSubclassPEP487(PyObject *type_obj, PyObject *mkw) {
+#if CYTHON_USE_TYPE_SLOTS && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    PyTypeObject *type = (PyTypeObject*) type_obj;
+    PyObject *mro = type->tp_mro;
+    Py_ssize_t i, nbases;
+    if (unlikely(!mro)) goto done;
+    (void) &__Pyx_GetBuiltinName;
+    Py_INCREF(mro);
+    nbases = PyTuple_GET_SIZE(mro);
+    assert(PyTuple_GET_ITEM(mro, 0) == type_obj);
+    for (i = 1; i < nbases-1; i++) {
+        PyObject *base, *dict, *meth;
+        base = PyTuple_GET_ITEM(mro, i);
+        dict = ((PyTypeObject *)base)->tp_dict;
+        meth = __Pyx_PyDict_GetItemStrWithError(dict, __pyx_n_s_init_subclass);
+        if (unlikely(meth)) {
+            descrgetfunc f = Py_TYPE(meth)->tp_descr_get;
+            PyObject *res;
+            Py_INCREF(meth);
+            if (likely(f)) {
+                res = f(meth, NULL, type_obj);
+                Py_DECREF(meth);
+                if (unlikely(!res)) goto bad;
+                meth = res;
+            }
+            res = __Pyx_PyObject_FastCallDict(meth, NULL, 0, mkw);
+            Py_DECREF(meth);
+            if (unlikely(!res)) goto bad;
+            Py_DECREF(res);
+            goto done;
+        } else if (unlikely(PyErr_Occurred())) {
+            goto bad;
+        }
+    }
+done:
+    Py_XDECREF(mro);
+    return type_obj;
+bad:
+    Py_XDECREF(mro);
+    Py_DECREF(type_obj);
+    return NULL;
+#else
+    PyObject *super_type, *super, *func, *res;
+#if CYTHON_COMPILING_IN_PYPY && !defined(PySuper_Type)
+    super_type = __Pyx_GetBuiltinName(__pyx_n_s_super);
+#else
+    super_type = (PyObject*) &PySuper_Type;
+    (void) &__Pyx_GetBuiltinName;
+#endif
+    super = likely(super_type) ? __Pyx_PyObject_Call2Args(super_type, type_obj, type_obj) : NULL;
+#if CYTHON_COMPILING_IN_PYPY && !defined(PySuper_Type)
+    Py_XDECREF(super_type);
+#endif
+    if (unlikely(!super)) {
+        Py_CLEAR(type_obj);
+        goto done;
+    }
+    func = __Pyx_PyObject_GetAttrStrNoError(super, __pyx_n_s_init_subclass);
+    Py_DECREF(super);
+    if (likely(!func)) {
+        if (unlikely(PyErr_Occurred()))
+            Py_CLEAR(type_obj);
+        goto done;
+    }
+    res = __Pyx_PyObject_FastCallDict(func, NULL, 0, mkw);
+    Py_DECREF(func);
+    if (unlikely(!res))
+        Py_CLEAR(type_obj);
+    Py_XDECREF(res);
+done:
+    return type_obj;
+#endif
+}
+#endif
+static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases,
+                                      PyObject *dict, PyObject *mkw,
+                                      int calculate_metaclass, int allow_py2_metaclass) {
+    PyObject *result;
+    PyObject *owned_metaclass = NULL;
+    PyObject *margs[4] = {NULL, name, bases, dict};
+    if (allow_py2_metaclass) {
+        owned_metaclass = PyObject_GetItem(dict, __pyx_n_s_metaclass);
+        if (owned_metaclass) {
+            metaclass = owned_metaclass;
+        } else if (likely(PyErr_ExceptionMatches(PyExc_KeyError))) {
+            PyErr_Clear();
+        } else {
+            return NULL;
+        }
+    }
+    if (calculate_metaclass && (!metaclass || PyType_Check(metaclass))) {
+        metaclass = __Pyx_CalculateMetaclass((PyTypeObject*) metaclass, bases);
+        Py_XDECREF(owned_metaclass);
+        if (unlikely(!metaclass))
+            return NULL;
+        owned_metaclass = metaclass;
+    }
+    result = __Pyx_PyObject_FastCallDict(metaclass, margs+1, 3 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET,
+#if PY_VERSION_HEX < 0x030600A4
+        (metaclass == (PyObject*)&PyType_Type) ? NULL : mkw
+#else
+        mkw
+#endif
+    );
+    Py_XDECREF(owned_metaclass);
+#if PY_VERSION_HEX < 0x030600A4 && CYTHON_PEP487_INIT_SUBCLASS
+    if (likely(result) && likely(PyType_Check(result))) {
+        if (unlikely(__Pyx_SetNamesPEP487(result) < 0)) {
+            Py_CLEAR(result);
+        } else {
+            result = __Pyx_InitSubclassPEP487(result, mkw);
+        }
+    }
+#else
+    (void) &__Pyx_GetBuiltinName;
+#endif
+    return result;
+}
+
+/* Py3UpdateBases */
+  static PyObject*
+__Pyx_PEP560_update_bases(PyObject *bases)
+{
+    Py_ssize_t i, j, size_bases;
+    PyObject *base, *meth, *new_base, *result, *new_bases = NULL;
+    size_bases = PyTuple_GET_SIZE(bases);
+    for (i = 0; i < size_bases; i++) {
+        base  = PyTuple_GET_ITEM(bases, i);
+        if (PyType_Check(base)) {
+            if (new_bases) {
+                if (PyList_Append(new_bases, base) < 0) {
+                    goto error;
+                }
+            }
+            continue;
+        }
+        meth = __Pyx_PyObject_GetAttrStrNoError(base, __pyx_n_s_mro_entries);
+        if (!meth && PyErr_Occurred()) {
+            goto error;
+        }
+        if (!meth) {
+            if (new_bases) {
+                if (PyList_Append(new_bases, base) < 0) {
+                    goto error;
+                }
+            }
+            continue;
+        }
+        new_base = __Pyx_PyObject_CallOneArg(meth, bases);
+        Py_DECREF(meth);
+        if (!new_base) {
+            goto error;
+        }
+        if (!PyTuple_Check(new_base)) {
+            PyErr_SetString(PyExc_TypeError,
+                            "__mro_entries__ must return a tuple");
+            Py_DECREF(new_base);
+            goto error;
+        }
+        if (!new_bases) {
+            if (!(new_bases = PyList_New(i))) {
+                goto error;
+            }
+            for (j = 0; j < i; j++) {
+                base = PyTuple_GET_ITEM(bases, j);
+                PyList_SET_ITEM(new_bases, j, base);
+                Py_INCREF(base);
+            }
+        }
+        j = PyList_GET_SIZE(new_bases);
+        if (PyList_SetSlice(new_bases, j, j, new_base) < 0) {
+            goto error;
+        }
+        Py_DECREF(new_base);
+    }
+    if (!new_bases) {
+        Py_INCREF(bases);
+        return bases;
+    }
+    result = PyList_AsTuple(new_bases);
+    Py_DECREF(new_bases);
+    return result;
+error:
+    Py_XDECREF(new_bases);
+    return NULL;
+}
+
+/* CLineInTraceback */
+  #ifndef CYTHON_CLINE_IN_TRACEBACK
+static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) {
+    PyObject *use_cline;
+    PyObject *ptype, *pvalue, *ptraceback;
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyObject **cython_runtime_dict;
+#endif
+    CYTHON_MAYBE_UNUSED_VAR(tstate);
+    if (unlikely(!__pyx_cython_runtime)) {
+        return c_line;
+    }
+    __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback);
+#if CYTHON_COMPILING_IN_CPYTHON
+    cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime);
+    if (likely(cython_runtime_dict)) {
+        __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
+            use_cline, *cython_runtime_dict,
+            __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback))
+    } else
+#endif
+    {
+      PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback);
+      if (use_cline_obj) {
+        use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True;
+        Py_DECREF(use_cline_obj);
+      } else {
+        PyErr_Clear();
+        use_cline = NULL;
+      }
+    }
+    if (!use_cline) {
+        c_line = 0;
+        (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
+    }
+    else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) {
+        c_line = 0;
+    }
+    __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback);
+    return c_line;
+}
+#endif
+
+/* CodeObjectCache */
+  #if !CYTHON_COMPILING_IN_LIMITED_API
+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 - start) / 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);
+}
+#endif
+
+/* AddTraceback */
+  #include "compile.h"
+#include "frameobject.h"
+#include "traceback.h"
+#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
+#if CYTHON_COMPILING_IN_LIMITED_API
+static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict,
+                                                       PyObject *firstlineno, PyObject *name) {
+    PyObject *replace = NULL;
+    if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL;
+    if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL;
+    replace = PyObject_GetAttrString(code, "replace");
+    if (likely(replace)) {
+        PyObject *result;
+        result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict);
+        Py_DECREF(replace);
+        return result;
+    }
+    PyErr_Clear();
+    #if __PYX_LIMITED_VERSION_HEX < 0x030780000
+    {
+        PyObject *compiled = NULL, *result = NULL;
+        if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL;
+        if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL;
+        compiled = Py_CompileString(
+            "out = type(code)(\n"
+            "  code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n"
+            "  code.co_flags, code.co_code, code.co_consts, code.co_names,\n"
+            "  code.co_varnames, code.co_filename, co_name, co_firstlineno,\n"
+            "  code.co_lnotab)\n", "<dummy>", Py_file_input);
+        if (!compiled) return NULL;
+        result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict);
+        Py_DECREF(compiled);
+        if (!result) PyErr_Print();
+        Py_DECREF(result);
+        result = PyDict_GetItemString(scratch_dict, "out");
+        if (result) Py_INCREF(result);
+        return result;
+    }
+    #else
+    return NULL;
+    #endif
+}
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename) {
+    PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL;
+    PyObject *replace = NULL, *getframe = NULL, *frame = NULL;
+    PyObject *exc_type, *exc_value, *exc_traceback;
+    int success = 0;
+    if (c_line) {
+        (void) __pyx_cfilenm;
+        (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line);
+    }
+    PyErr_Fetch(&exc_type, &exc_value, &exc_traceback);
+    code_object = Py_CompileString("_getframe()", filename, Py_eval_input);
+    if (unlikely(!code_object)) goto bad;
+    py_py_line = PyLong_FromLong(py_line);
+    if (unlikely(!py_py_line)) goto bad;
+    py_funcname = PyUnicode_FromString(funcname);
+    if (unlikely(!py_funcname)) goto bad;
+    dict = PyDict_New();
+    if (unlikely(!dict)) goto bad;
+    {
+        PyObject *old_code_object = code_object;
+        code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname);
+        Py_DECREF(old_code_object);
+    }
+    if (unlikely(!code_object)) goto bad;
+    getframe = PySys_GetObject("_getframe");
+    if (unlikely(!getframe)) goto bad;
+    if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad;
+    frame = PyEval_EvalCode(code_object, dict, dict);
+    if (unlikely(!frame) || frame == Py_None) goto bad;
+    success = 1;
+  bad:
+    PyErr_Restore(exc_type, exc_value, exc_traceback);
+    Py_XDECREF(code_object);
+    Py_XDECREF(py_py_line);
+    Py_XDECREF(py_funcname);
+    Py_XDECREF(dict);
+    Py_XDECREF(replace);
+    if (success) {
+        PyTraceBack_Here(
+            (struct _frame*)frame);
+    }
+    Py_XDECREF(frame);
+}
+#else
+static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
+            const char *funcname, int c_line,
+            int py_line, const char *filename) {
+    PyCodeObject *py_code = NULL;
+    PyObject *py_funcname = NULL;
+    #if PY_MAJOR_VERSION < 3
+    PyObject *py_srcfile = NULL;
+    py_srcfile = PyString_FromString(filename);
+    if (!py_srcfile) goto bad;
+    #endif
+    if (c_line) {
+        #if PY_MAJOR_VERSION < 3
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        if (!py_funcname) goto bad;
+        #else
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        if (!py_funcname) goto bad;
+        funcname = PyUnicode_AsUTF8(py_funcname);
+        if (!funcname) goto bad;
+        #endif
+    }
+    else {
+        #if PY_MAJOR_VERSION < 3
+        py_funcname = PyString_FromString(funcname);
+        if (!py_funcname) goto bad;
+        #endif
+    }
+    #if PY_MAJOR_VERSION < 3
+    py_code = __Pyx_PyCode_New(
+        0,
+        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);
+    #else
+    py_code = PyCode_NewEmpty(filename, funcname, py_line);
+    #endif
+    Py_XDECREF(py_funcname);
+    return py_code;
+bad:
+    Py_XDECREF(py_funcname);
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(py_srcfile);
+    #endif
+    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;
+    PyThreadState *tstate = __Pyx_PyThreadState_Current;
+    PyObject *ptype, *pvalue, *ptraceback;
+    if (c_line) {
+        c_line = __Pyx_CLineForTraceback(tstate, c_line);
+    }
+    py_code = __pyx_find_code_object(c_line ? -c_line : py_line);
+    if (!py_code) {
+        __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback);
+        py_code = __Pyx_CreateCodeObjectForTraceback(
+            funcname, c_line, py_line, filename);
+        if (!py_code) {
+            /* If the code object creation fails, then we should clear the
+               fetched exception references and propagate the new exception */
+            Py_XDECREF(ptype);
+            Py_XDECREF(pvalue);
+            Py_XDECREF(ptraceback);
+            goto bad;
+        }
+        __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback);
+        __pyx_insert_code_object(c_line ? -c_line : py_line, py_code);
+    }
+    py_frame = PyFrame_New(
+        tstate,            /*PyThreadState *tstate,*/
+        py_code,           /*PyCodeObject *code,*/
+        __pyx_d,    /*PyObject *globals,*/
+        0                  /*PyObject *locals*/
+    );
+    if (!py_frame) goto bad;
+    __Pyx_PyFrame_SetLineNumber(py_frame, py_line);
+    PyTraceBack_Here(py_frame);
+bad:
+    Py_XDECREF(py_code);
+    Py_XDECREF(py_frame);
+}
+#endif
+
+/* CIntFromPyVerify */
+  #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\
+    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
+#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\
+    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
+#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\
+    {\
+        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 (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\
+                    return (target_type) -1;\
+                if (is_unsigned && unlikely(value < zero))\
+                    goto raise_neg_overflow;\
+                else\
+                    goto raise_overflow;\
+            }\
+        }\
+        return (target_type) value;\
+    }
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum____pyx_t_7_cython_6cygrpc_AioServerStatus(enum __pyx_t_7_cython_6cygrpc_AioServerStatus value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const enum __pyx_t_7_cython_6cygrpc_AioServerStatus neg_one = (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) -1, const_zero = (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE enum __pyx_t_7_cython_6cygrpc_AioServerStatus __Pyx_PyInt_As_enum____pyx_t_7_cython_6cygrpc_AioServerStatus(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const enum __pyx_t_7_cython_6cygrpc_AioServerStatus neg_one = (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) -1, const_zero = (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        enum __pyx_t_7_cython_6cygrpc_AioServerStatus val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) -1;
+        val = __Pyx_PyInt_As_enum____pyx_t_7_cython_6cygrpc_AioServerStatus(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) >= 2 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) (((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) >= 3 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) (((((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) >= 4 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) (((((((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[3]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 2 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) (((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)-1)*(((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 2 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) ((((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 3 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) (((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)-1)*(((((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 3 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) ((((((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 4 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) (((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)-1)*(((((((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[3]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) - 1 > 4 * PyLong_SHIFT)) {
+                            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) ((((((((((enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[3]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[2]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[1]) << PyLong_SHIFT) | (enum __pyx_t_7_cython_6cygrpc_AioServerStatus)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(enum __pyx_t_7_cython_6cygrpc_AioServerStatus) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(enum __pyx_t_7_cython_6cygrpc_AioServerStatus, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        enum __pyx_t_7_cython_6cygrpc_AioServerStatus val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyErr_SetString(PyExc_RuntimeError,
+                        "_PyLong_AsByteArray() or PyLong_AsNativeBytes() not available, cannot convert large enums");
+        val = (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) -1;
+#endif
+        if (unlikely(ret))
+            return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to enum __pyx_t_7_cython_6cygrpc_AioServerStatus");
+    return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to enum __pyx_t_7_cython_6cygrpc_AioServerStatus");
+    return (enum __pyx_t_7_cython_6cygrpc_AioServerStatus) -1;
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE grpc_status_code __Pyx_PyInt_As_grpc_status_code(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_status_code neg_one = (grpc_status_code) -1, const_zero = (grpc_status_code) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(grpc_status_code) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(grpc_status_code, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (grpc_status_code) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        grpc_status_code val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (grpc_status_code) -1;
+        val = __Pyx_PyInt_As_grpc_status_code(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_status_code, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(grpc_status_code) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) >= 2 * PyLong_SHIFT)) {
+                            return (grpc_status_code) (((((grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_status_code) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) >= 3 * PyLong_SHIFT)) {
+                            return (grpc_status_code) (((((((grpc_status_code)digits[2]) << PyLong_SHIFT) | (grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_status_code) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) >= 4 * PyLong_SHIFT)) {
+                            return (grpc_status_code) (((((((((grpc_status_code)digits[3]) << PyLong_SHIFT) | (grpc_status_code)digits[2]) << PyLong_SHIFT) | (grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (grpc_status_code) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(grpc_status_code) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_status_code, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_status_code) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_status_code, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_status_code, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(grpc_status_code) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_status_code) (((grpc_status_code)-1)*(((((grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(grpc_status_code) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_status_code) ((((((grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(grpc_status_code) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_status_code) (((grpc_status_code)-1)*(((((((grpc_status_code)digits[2]) << PyLong_SHIFT) | (grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_status_code) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_status_code) ((((((((grpc_status_code)digits[2]) << PyLong_SHIFT) | (grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(grpc_status_code) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_status_code) (((grpc_status_code)-1)*(((((((((grpc_status_code)digits[3]) << PyLong_SHIFT) | (grpc_status_code)digits[2]) << PyLong_SHIFT) | (grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_status_code) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_status_code, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_status_code) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_status_code) ((((((((((grpc_status_code)digits[3]) << PyLong_SHIFT) | (grpc_status_code)digits[2]) << PyLong_SHIFT) | (grpc_status_code)digits[1]) << PyLong_SHIFT) | (grpc_status_code)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(grpc_status_code) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_status_code, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_status_code) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_status_code, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        grpc_status_code val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyErr_SetString(PyExc_RuntimeError,
+                        "_PyLong_AsByteArray() or PyLong_AsNativeBytes() not available, cannot convert large enums");
+        val = (grpc_status_code) -1;
+#endif
+        if (unlikely(ret))
+            return (grpc_status_code) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to grpc_status_code");
+    return (grpc_status_code) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to grpc_status_code");
+    return (grpc_status_code) -1;
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_status_code(grpc_status_code value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_status_code neg_one = (grpc_status_code) -1, const_zero = (grpc_status_code) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(grpc_status_code) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(grpc_status_code) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_status_code) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(grpc_status_code) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_status_code) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(grpc_status_code),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(grpc_status_code));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const int neg_one = (int) -1, const_zero = (int) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    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;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        int val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (int) -1;
+        val = __Pyx_PyInt_As_int(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) {
+                            return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) {
+                            return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) {
+                            return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (int) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(int) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) {
+                            return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) {
+                            return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) {
+                            return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) {
+                            return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) {
+                            return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) {
+                            return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(int) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        int val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyObject *v;
+        PyObject *stepval = NULL, *mask = NULL, *shift = NULL;
+        int bits, remaining_bits, is_negative = 0;
+        int chunk_size = (sizeof(long) < 8) ? 30 : 62;
+        if (likely(PyLong_CheckExact(x))) {
+            v = __Pyx_NewRef(x);
+        } else {
+            v = PyNumber_Long(x);
+            if (unlikely(!v)) return (int) -1;
+            assert(PyLong_CheckExact(v));
+        }
+        {
+            int result = PyObject_RichCompareBool(v, Py_False, Py_LT);
+            if (unlikely(result < 0)) {
+                Py_DECREF(v);
+                return (int) -1;
+            }
+            is_negative = result == 1;
+        }
+        if (is_unsigned && unlikely(is_negative)) {
+            Py_DECREF(v);
+            goto raise_neg_overflow;
+        } else if (is_negative) {
+            stepval = PyNumber_Invert(v);
+            Py_DECREF(v);
+            if (unlikely(!stepval))
+                return (int) -1;
+        } else {
+            stepval = v;
+        }
+        v = NULL;
+        val = (int) 0;
+        mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done;
+        shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done;
+        for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) {
+            PyObject *tmp, *digit;
+            long idigit;
+            digit = PyNumber_And(stepval, mask);
+            if (unlikely(!digit)) goto done;
+            idigit = PyLong_AsLong(digit);
+            Py_DECREF(digit);
+            if (unlikely(idigit < 0)) goto done;
+            val |= ((int) idigit) << bits;
+            tmp = PyNumber_Rshift(stepval, shift);
+            if (unlikely(!tmp)) goto done;
+            Py_DECREF(stepval); stepval = tmp;
+        }
+        Py_DECREF(shift); shift = NULL;
+        Py_DECREF(mask); mask = NULL;
+        {
+            long idigit = PyLong_AsLong(stepval);
+            if (unlikely(idigit < 0)) goto done;
+            remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1);
+            if (unlikely(idigit >= (1L << remaining_bits)))
+                goto raise_overflow;
+            val |= ((int) idigit) << bits;
+        }
+        if (!is_unsigned) {
+            if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1))))
+                goto raise_overflow;
+            if (is_negative)
+                val = ~val;
+        }
+        ret = 0;
+    done:
+        Py_XDECREF(shift);
+        Py_XDECREF(mask);
+        Py_XDECREF(stepval);
+#endif
+        if (unlikely(ret))
+            return (int) -1;
+        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;
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE grpc_connectivity_state __Pyx_PyInt_As_grpc_connectivity_state(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_connectivity_state neg_one = (grpc_connectivity_state) -1, const_zero = (grpc_connectivity_state) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(grpc_connectivity_state) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (grpc_connectivity_state) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        grpc_connectivity_state val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (grpc_connectivity_state) -1;
+        val = __Pyx_PyInt_As_grpc_connectivity_state(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(grpc_connectivity_state) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) >= 2 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) (((((grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_connectivity_state) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) >= 3 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) (((((((grpc_connectivity_state)digits[2]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_connectivity_state) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) >= 4 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) (((((((((grpc_connectivity_state)digits[3]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[2]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (grpc_connectivity_state) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(grpc_connectivity_state) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_connectivity_state, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_connectivity_state) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_connectivity_state, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(grpc_connectivity_state) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) (((grpc_connectivity_state)-1)*(((((grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(grpc_connectivity_state) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) ((((((grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(grpc_connectivity_state) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) (((grpc_connectivity_state)-1)*(((((((grpc_connectivity_state)digits[2]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_connectivity_state) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) ((((((((grpc_connectivity_state)digits[2]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(grpc_connectivity_state) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) (((grpc_connectivity_state)-1)*(((((((((grpc_connectivity_state)digits[3]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[2]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_connectivity_state) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_connectivity_state, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_connectivity_state) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_connectivity_state) ((((((((((grpc_connectivity_state)digits[3]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[2]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[1]) << PyLong_SHIFT) | (grpc_connectivity_state)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(grpc_connectivity_state) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_connectivity_state, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_connectivity_state) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_connectivity_state, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        grpc_connectivity_state val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyErr_SetString(PyExc_RuntimeError,
+                        "_PyLong_AsByteArray() or PyLong_AsNativeBytes() not available, cannot convert large enums");
+        val = (grpc_connectivity_state) -1;
+#endif
+        if (unlikely(ret))
+            return (grpc_connectivity_state) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to grpc_connectivity_state");
+    return (grpc_connectivity_state) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to grpc_connectivity_state");
+    return (grpc_connectivity_state) -1;
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_local_connect_type(grpc_local_connect_type value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_local_connect_type neg_one = (grpc_local_connect_type) -1, const_zero = (grpc_local_connect_type) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(grpc_local_connect_type) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(grpc_local_connect_type) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_local_connect_type) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(grpc_local_connect_type) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_local_connect_type) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(grpc_local_connect_type),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(grpc_local_connect_type));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE grpc_local_connect_type __Pyx_PyInt_As_grpc_local_connect_type(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_local_connect_type neg_one = (grpc_local_connect_type) -1, const_zero = (grpc_local_connect_type) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(grpc_local_connect_type) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (grpc_local_connect_type) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        grpc_local_connect_type val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (grpc_local_connect_type) -1;
+        val = __Pyx_PyInt_As_grpc_local_connect_type(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(grpc_local_connect_type) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) >= 2 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) (((((grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_local_connect_type) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) >= 3 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) (((((((grpc_local_connect_type)digits[2]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_local_connect_type) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) >= 4 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) (((((((((grpc_local_connect_type)digits[3]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[2]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (grpc_local_connect_type) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(grpc_local_connect_type) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_local_connect_type, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_local_connect_type) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_local_connect_type, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(grpc_local_connect_type) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) (((grpc_local_connect_type)-1)*(((((grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(grpc_local_connect_type) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) ((((((grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(grpc_local_connect_type) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) (((grpc_local_connect_type)-1)*(((((((grpc_local_connect_type)digits[2]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_local_connect_type) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) ((((((((grpc_local_connect_type)digits[2]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(grpc_local_connect_type) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) (((grpc_local_connect_type)-1)*(((((((((grpc_local_connect_type)digits[3]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[2]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_local_connect_type) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_local_connect_type, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_local_connect_type) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_local_connect_type) ((((((((((grpc_local_connect_type)digits[3]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[2]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[1]) << PyLong_SHIFT) | (grpc_local_connect_type)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(grpc_local_connect_type) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_local_connect_type, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_local_connect_type) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_local_connect_type, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        grpc_local_connect_type val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyErr_SetString(PyExc_RuntimeError,
+                        "_PyLong_AsByteArray() or PyLong_AsNativeBytes() not available, cannot convert large enums");
+        val = (grpc_local_connect_type) -1;
+#endif
+        if (unlikely(ret))
+            return (grpc_local_connect_type) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to grpc_local_connect_type");
+    return (grpc_local_connect_type) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to grpc_local_connect_type");
+    return (grpc_local_connect_type) -1;
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE grpc_completion_type __Pyx_PyInt_As_grpc_completion_type(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_completion_type neg_one = (grpc_completion_type) -1, const_zero = (grpc_completion_type) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(grpc_completion_type) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(grpc_completion_type, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (grpc_completion_type) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        grpc_completion_type val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (grpc_completion_type) -1;
+        val = __Pyx_PyInt_As_grpc_completion_type(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_completion_type, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(grpc_completion_type) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) >= 2 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) (((((grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_completion_type) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) >= 3 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) (((((((grpc_completion_type)digits[2]) << PyLong_SHIFT) | (grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_completion_type) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) >= 4 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) (((((((((grpc_completion_type)digits[3]) << PyLong_SHIFT) | (grpc_completion_type)digits[2]) << PyLong_SHIFT) | (grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (grpc_completion_type) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(grpc_completion_type) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_completion_type, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_completion_type) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_completion_type, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_completion_type, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(grpc_completion_type) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) (((grpc_completion_type)-1)*(((((grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(grpc_completion_type) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) ((((((grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(grpc_completion_type) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) (((grpc_completion_type)-1)*(((((((grpc_completion_type)digits[2]) << PyLong_SHIFT) | (grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_completion_type) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) ((((((((grpc_completion_type)digits[2]) << PyLong_SHIFT) | (grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(grpc_completion_type) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) (((grpc_completion_type)-1)*(((((((((grpc_completion_type)digits[3]) << PyLong_SHIFT) | (grpc_completion_type)digits[2]) << PyLong_SHIFT) | (grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_completion_type) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_completion_type, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_completion_type) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_completion_type) ((((((((((grpc_completion_type)digits[3]) << PyLong_SHIFT) | (grpc_completion_type)digits[2]) << PyLong_SHIFT) | (grpc_completion_type)digits[1]) << PyLong_SHIFT) | (grpc_completion_type)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(grpc_completion_type) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_completion_type, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_completion_type) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_completion_type, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        grpc_completion_type val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyErr_SetString(PyExc_RuntimeError,
+                        "_PyLong_AsByteArray() or PyLong_AsNativeBytes() not available, cannot convert large enums");
+        val = (grpc_completion_type) -1;
+#endif
+        if (unlikely(ret))
+            return (grpc_completion_type) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to grpc_completion_type");
+    return (grpc_completion_type) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to grpc_completion_type");
+    return (grpc_completion_type) -1;
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const int neg_one = (int) -1, const_zero = (int) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    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);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(int) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(int),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_connectivity_state(grpc_connectivity_state value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_connectivity_state neg_one = (grpc_connectivity_state) -1, const_zero = (grpc_connectivity_state) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(grpc_connectivity_state) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(grpc_connectivity_state) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_connectivity_state) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(grpc_connectivity_state) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_connectivity_state) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(grpc_connectivity_state),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(grpc_connectivity_state));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_call_error(grpc_call_error value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_call_error neg_one = (grpc_call_error) -1, const_zero = (grpc_call_error) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(grpc_call_error) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(grpc_call_error) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_call_error) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(grpc_call_error) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_call_error) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(grpc_call_error),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(grpc_call_error));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_completion_type(grpc_completion_type value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_completion_type neg_one = (grpc_completion_type) -1, const_zero = (grpc_completion_type) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(grpc_completion_type) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(grpc_completion_type) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_completion_type) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(grpc_completion_type) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_completion_type) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(grpc_completion_type),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(grpc_completion_type));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_op_type(grpc_op_type value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_op_type neg_one = (grpc_op_type) -1, const_zero = (grpc_op_type) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(grpc_op_type) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(grpc_op_type) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_op_type) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(grpc_op_type) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_op_type) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(grpc_op_type),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(grpc_op_type));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_compression_algorithm(grpc_compression_algorithm value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_compression_algorithm neg_one = (grpc_compression_algorithm) -1, const_zero = (grpc_compression_algorithm) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(grpc_compression_algorithm) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(grpc_compression_algorithm) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_compression_algorithm) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(grpc_compression_algorithm) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_compression_algorithm) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(grpc_compression_algorithm),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(grpc_compression_algorithm));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_grpc_compression_level(grpc_compression_level value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_compression_level neg_one = (grpc_compression_level) -1, const_zero = (grpc_compression_level) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(grpc_compression_level) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(grpc_compression_level) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_compression_level) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(grpc_compression_level) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(grpc_compression_level) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(grpc_compression_level),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(grpc_compression_level));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE grpc_compression_algorithm __Pyx_PyInt_As_grpc_compression_algorithm(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_compression_algorithm neg_one = (grpc_compression_algorithm) -1, const_zero = (grpc_compression_algorithm) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(grpc_compression_algorithm) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (grpc_compression_algorithm) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        grpc_compression_algorithm val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (grpc_compression_algorithm) -1;
+        val = __Pyx_PyInt_As_grpc_compression_algorithm(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(grpc_compression_algorithm) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) >= 2 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) (((((grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_compression_algorithm) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) >= 3 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) (((((((grpc_compression_algorithm)digits[2]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_compression_algorithm) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) >= 4 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) (((((((((grpc_compression_algorithm)digits[3]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[2]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (grpc_compression_algorithm) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(grpc_compression_algorithm) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_compression_algorithm, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_compression_algorithm) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_compression_algorithm, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(grpc_compression_algorithm) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) (((grpc_compression_algorithm)-1)*(((((grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(grpc_compression_algorithm) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) ((((((grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(grpc_compression_algorithm) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) (((grpc_compression_algorithm)-1)*(((((((grpc_compression_algorithm)digits[2]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_compression_algorithm) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) ((((((((grpc_compression_algorithm)digits[2]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(grpc_compression_algorithm) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) (((grpc_compression_algorithm)-1)*(((((((((grpc_compression_algorithm)digits[3]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[2]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_compression_algorithm) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_compression_algorithm, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_compression_algorithm) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_compression_algorithm) ((((((((((grpc_compression_algorithm)digits[3]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[2]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[1]) << PyLong_SHIFT) | (grpc_compression_algorithm)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(grpc_compression_algorithm) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_compression_algorithm, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_compression_algorithm) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_compression_algorithm, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        grpc_compression_algorithm val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyErr_SetString(PyExc_RuntimeError,
+                        "_PyLong_AsByteArray() or PyLong_AsNativeBytes() not available, cannot convert large enums");
+        val = (grpc_compression_algorithm) -1;
+#endif
+        if (unlikely(ret))
+            return (grpc_compression_algorithm) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to grpc_compression_algorithm");
+    return (grpc_compression_algorithm) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to grpc_compression_algorithm");
+    return (grpc_compression_algorithm) -1;
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const long neg_one = (long) -1, const_zero = (long) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    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;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        long val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (long) -1;
+        val = __Pyx_PyInt_As_long(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) {
+                            return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) {
+                            return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) {
+                            return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (long) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(long) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) {
+                            return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) {
+                            return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) {
+                            return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) {
+                            return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) {
+                            return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) {
+                            return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(long) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        long val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyObject *v;
+        PyObject *stepval = NULL, *mask = NULL, *shift = NULL;
+        int bits, remaining_bits, is_negative = 0;
+        int chunk_size = (sizeof(long) < 8) ? 30 : 62;
+        if (likely(PyLong_CheckExact(x))) {
+            v = __Pyx_NewRef(x);
+        } else {
+            v = PyNumber_Long(x);
+            if (unlikely(!v)) return (long) -1;
+            assert(PyLong_CheckExact(v));
+        }
+        {
+            int result = PyObject_RichCompareBool(v, Py_False, Py_LT);
+            if (unlikely(result < 0)) {
+                Py_DECREF(v);
+                return (long) -1;
+            }
+            is_negative = result == 1;
+        }
+        if (is_unsigned && unlikely(is_negative)) {
+            Py_DECREF(v);
+            goto raise_neg_overflow;
+        } else if (is_negative) {
+            stepval = PyNumber_Invert(v);
+            Py_DECREF(v);
+            if (unlikely(!stepval))
+                return (long) -1;
+        } else {
+            stepval = v;
+        }
+        v = NULL;
+        val = (long) 0;
+        mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done;
+        shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done;
+        for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) {
+            PyObject *tmp, *digit;
+            long idigit;
+            digit = PyNumber_And(stepval, mask);
+            if (unlikely(!digit)) goto done;
+            idigit = PyLong_AsLong(digit);
+            Py_DECREF(digit);
+            if (unlikely(idigit < 0)) goto done;
+            val |= ((long) idigit) << bits;
+            tmp = PyNumber_Rshift(stepval, shift);
+            if (unlikely(!tmp)) goto done;
+            Py_DECREF(stepval); stepval = tmp;
+        }
+        Py_DECREF(shift); shift = NULL;
+        Py_DECREF(mask); mask = NULL;
+        {
+            long idigit = PyLong_AsLong(stepval);
+            if (unlikely(idigit < 0)) goto done;
+            remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1);
+            if (unlikely(idigit >= (1L << remaining_bits)))
+                goto raise_overflow;
+            val |= ((long) idigit) << bits;
+        }
+        if (!is_unsigned) {
+            if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1))))
+                goto raise_overflow;
+            if (is_negative)
+                val = ~val;
+        }
+        ret = 0;
+    done:
+        Py_XDECREF(shift);
+        Py_XDECREF(mask);
+        Py_XDECREF(stepval);
+#endif
+        if (unlikely(ret))
+            return (long) -1;
+        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;
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const long neg_one = (long) -1, const_zero = (long) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    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);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(long) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(long),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE grpc_call_error __Pyx_PyInt_As_grpc_call_error(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const grpc_call_error neg_one = (grpc_call_error) -1, const_zero = (grpc_call_error) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(grpc_call_error) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(grpc_call_error, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (grpc_call_error) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        grpc_call_error val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (grpc_call_error) -1;
+        val = __Pyx_PyInt_As_grpc_call_error(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_call_error, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(grpc_call_error) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) >= 2 * PyLong_SHIFT)) {
+                            return (grpc_call_error) (((((grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_call_error) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) >= 3 * PyLong_SHIFT)) {
+                            return (grpc_call_error) (((((((grpc_call_error)digits[2]) << PyLong_SHIFT) | (grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_call_error) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) >= 4 * PyLong_SHIFT)) {
+                            return (grpc_call_error) (((((((((grpc_call_error)digits[3]) << PyLong_SHIFT) | (grpc_call_error)digits[2]) << PyLong_SHIFT) | (grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (grpc_call_error) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(grpc_call_error) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_call_error, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_call_error) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_call_error, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(grpc_call_error, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(grpc_call_error) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_call_error) (((grpc_call_error)-1)*(((((grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(grpc_call_error) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) - 1 > 2 * PyLong_SHIFT)) {
+                            return (grpc_call_error) ((((((grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(grpc_call_error) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_call_error) (((grpc_call_error)-1)*(((((((grpc_call_error)digits[2]) << PyLong_SHIFT) | (grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(grpc_call_error) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) - 1 > 3 * PyLong_SHIFT)) {
+                            return (grpc_call_error) ((((((((grpc_call_error)digits[2]) << PyLong_SHIFT) | (grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(grpc_call_error) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_call_error) (((grpc_call_error)-1)*(((((((((grpc_call_error)digits[3]) << PyLong_SHIFT) | (grpc_call_error)digits[2]) << PyLong_SHIFT) | (grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(grpc_call_error) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(grpc_call_error, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(grpc_call_error) - 1 > 4 * PyLong_SHIFT)) {
+                            return (grpc_call_error) ((((((((((grpc_call_error)digits[3]) << PyLong_SHIFT) | (grpc_call_error)digits[2]) << PyLong_SHIFT) | (grpc_call_error)digits[1]) << PyLong_SHIFT) | (grpc_call_error)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(grpc_call_error) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_call_error, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(grpc_call_error) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(grpc_call_error, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        grpc_call_error val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyErr_SetString(PyExc_RuntimeError,
+                        "_PyLong_AsByteArray() or PyLong_AsNativeBytes() not available, cannot convert large enums");
+        val = (grpc_call_error) -1;
+#endif
+        if (unlikely(ret))
+            return (grpc_call_error) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to grpc_call_error");
+    return (grpc_call_error) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to grpc_call_error");
+    return (grpc_call_error) -1;
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const size_t neg_one = (size_t) -1, const_zero = (size_t) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(size_t) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (size_t) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        size_t val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (size_t) -1;
+        val = __Pyx_PyInt_As_size_t(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(size_t, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(size_t) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) >= 2 * PyLong_SHIFT)) {
+                            return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(size_t) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) >= 3 * PyLong_SHIFT)) {
+                            return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(size_t) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) >= 4 * PyLong_SHIFT)) {
+                            return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (size_t) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(size_t) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(size_t, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT)) {
+                            return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(size_t) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT)) {
+                            return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT)) {
+                            return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(size_t) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT)) {
+                            return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT)) {
+                            return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(size_t) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT)) {
+                            return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(size_t) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(size_t) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        size_t val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyObject *v;
+        PyObject *stepval = NULL, *mask = NULL, *shift = NULL;
+        int bits, remaining_bits, is_negative = 0;
+        int chunk_size = (sizeof(long) < 8) ? 30 : 62;
+        if (likely(PyLong_CheckExact(x))) {
+            v = __Pyx_NewRef(x);
+        } else {
+            v = PyNumber_Long(x);
+            if (unlikely(!v)) return (size_t) -1;
+            assert(PyLong_CheckExact(v));
+        }
+        {
+            int result = PyObject_RichCompareBool(v, Py_False, Py_LT);
+            if (unlikely(result < 0)) {
+                Py_DECREF(v);
+                return (size_t) -1;
+            }
+            is_negative = result == 1;
+        }
+        if (is_unsigned && unlikely(is_negative)) {
+            Py_DECREF(v);
+            goto raise_neg_overflow;
+        } else if (is_negative) {
+            stepval = PyNumber_Invert(v);
+            Py_DECREF(v);
+            if (unlikely(!stepval))
+                return (size_t) -1;
+        } else {
+            stepval = v;
+        }
+        v = NULL;
+        val = (size_t) 0;
+        mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done;
+        shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done;
+        for (bits = 0; bits < (int) sizeof(size_t) * 8 - chunk_size; bits += chunk_size) {
+            PyObject *tmp, *digit;
+            long idigit;
+            digit = PyNumber_And(stepval, mask);
+            if (unlikely(!digit)) goto done;
+            idigit = PyLong_AsLong(digit);
+            Py_DECREF(digit);
+            if (unlikely(idigit < 0)) goto done;
+            val |= ((size_t) idigit) << bits;
+            tmp = PyNumber_Rshift(stepval, shift);
+            if (unlikely(!tmp)) goto done;
+            Py_DECREF(stepval); stepval = tmp;
+        }
+        Py_DECREF(shift); shift = NULL;
+        Py_DECREF(mask); mask = NULL;
+        {
+            long idigit = PyLong_AsLong(stepval);
+            if (unlikely(idigit < 0)) goto done;
+            remaining_bits = ((int) sizeof(size_t) * 8) - bits - (is_unsigned ? 0 : 1);
+            if (unlikely(idigit >= (1L << remaining_bits)))
+                goto raise_overflow;
+            val |= ((size_t) idigit) << bits;
+        }
+        if (!is_unsigned) {
+            if (unlikely(val & (((size_t) 1) << (sizeof(size_t) * 8 - 1))))
+                goto raise_overflow;
+            if (is_negative)
+                val = ~val;
+        }
+        ret = 0;
+    done:
+        Py_XDECREF(shift);
+        Py_XDECREF(mask);
+        Py_XDECREF(stepval);
+#endif
+        if (unlikely(ret))
+            return (size_t) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to size_t");
+    return (size_t) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to size_t");
+    return (size_t) -1;
+}
+
+/* CIntToPy */
+  static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+    if (is_unsigned) {
+        if (sizeof(unsigned int) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(unsigned int) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+        }
+    } else {
+        if (sizeof(unsigned int) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+        } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+        }
+    }
+    {
+        unsigned char *bytes = (unsigned char *)&value;
+#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX >= 0x030d00A4
+        if (is_unsigned) {
+            return PyLong_FromUnsignedNativeBytes(bytes, sizeof(value), -1);
+        } else {
+            return PyLong_FromNativeBytes(bytes, sizeof(value), -1);
+        }
+#elif !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        return _PyLong_FromByteArray(bytes, sizeof(unsigned int),
+                                     little, !is_unsigned);
+#else
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        PyObject *from_bytes, *result = NULL;
+        PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL;
+        from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes");
+        if (!from_bytes) return NULL;
+        py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(unsigned int));
+        if (!py_bytes) goto limited_bad;
+        order_str = PyUnicode_FromString(little ? "little" : "big");
+        if (!order_str) goto limited_bad;
+        arg_tuple = PyTuple_Pack(2, py_bytes, order_str);
+        if (!arg_tuple) goto limited_bad;
+        if (!is_unsigned) {
+            kwds = PyDict_New();
+            if (!kwds) goto limited_bad;
+            if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad;
+        }
+        result = PyObject_Call(from_bytes, arg_tuple, kwds);
+        limited_bad:
+        Py_XDECREF(kwds);
+        Py_XDECREF(arg_tuple);
+        Py_XDECREF(order_str);
+        Py_XDECREF(py_bytes);
+        Py_XDECREF(from_bytes);
+        return result;
+#endif
+    }
+}
+
+/* CIntFromPy */
+  static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) {
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0;
+#ifdef __Pyx_HAS_GCC_DIAGNOSTIC
+#pragma GCC diagnostic pop
+#endif
+    const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+    if (likely(PyInt_Check(x))) {
+        if ((sizeof(unsigned int) < sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT(unsigned int, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (unsigned int) val;
+        }
+    }
+#endif
+    if (unlikely(!PyLong_Check(x))) {
+        unsigned int val;
+        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+        if (!tmp) return (unsigned int) -1;
+        val = __Pyx_PyInt_As_unsigned_int(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+    if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (unlikely(__Pyx_PyLong_IsNeg(x))) {
+            goto raise_neg_overflow;
+        } else if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(unsigned int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_DigitCount(x)) {
+                case 2:
+                    if ((8 * sizeof(unsigned int) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) >= 2 * PyLong_SHIFT)) {
+                            return (unsigned int) (((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(unsigned int) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) >= 3 * PyLong_SHIFT)) {
+                            return (unsigned int) (((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(unsigned int) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) >= 4 * PyLong_SHIFT)) {
+                            return (unsigned int) (((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7
+        if (unlikely(Py_SIZE(x) < 0)) {
+            goto raise_neg_overflow;
+        }
+#else
+        {
+            int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+            if (unlikely(result < 0))
+                return (unsigned int) -1;
+            if (unlikely(result == 1))
+                goto raise_neg_overflow;
+        }
+#endif
+        if ((sizeof(unsigned int) <= sizeof(unsigned long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+        }
+    } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+        if (__Pyx_PyLong_IsCompact(x)) {
+            __PYX_VERIFY_RETURN_INT(unsigned int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x))
+        } else {
+            const digit* digits = __Pyx_PyLong_Digits(x);
+            assert(__Pyx_PyLong_DigitCount(x) > 1);
+            switch (__Pyx_PyLong_SignedDigitCount(x)) {
+                case -2:
+                    if ((8 * sizeof(unsigned int) - 1 > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT)) {
+                            return (unsigned int) (((unsigned int)-1)*(((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])));
+                        }
+                    }
+                    break;
+                case 2:
+                    if ((8 * sizeof(unsigned int) > 1 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT)) {
+                            return (unsigned int) ((((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])));
+                        }
+                    }
+                    break;
+                case -3:
+                    if ((8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT)) {
+                            return (unsigned int) (((unsigned int)-1)*(((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])));
+                        }
+                    }
+                    break;
+                case 3:
+                    if ((8 * sizeof(unsigned int) > 2 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT)) {
+                            return (unsigned int) ((((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])));
+                        }
+                    }
+                    break;
+                case -4:
+                    if ((8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) - 1 > 4 * PyLong_SHIFT)) {
+                            return (unsigned int) (((unsigned int)-1)*(((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])));
+                        }
+                    }
+                    break;
+                case 4:
+                    if ((8 * sizeof(unsigned int) > 3 * PyLong_SHIFT)) {
+                        if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) {
+                            __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+                        } else if ((8 * sizeof(unsigned int) - 1 > 4 * PyLong_SHIFT)) {
+                            return (unsigned int) ((((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])));
+                        }
+                    }
+                    break;
+            }
+        }
+#endif
+        if ((sizeof(unsigned int) <= sizeof(long))) {
+            __PYX_VERIFY_RETURN_INT_EXC(unsigned int, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+        } else if ((sizeof(unsigned int) <= sizeof(PY_LONG_LONG))) {
+            __PYX_VERIFY_RETURN_INT_EXC(unsigned int, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+        }
+    }
+    {
+        unsigned int val;
+        int ret = -1;
+#if PY_VERSION_HEX >= 0x030d00A6 && !CYTHON_COMPILING_IN_LIMITED_API
+        Py_ssize_t bytes_copied = PyLong_AsNativeBytes(
+            x, &val, sizeof(val), Py_ASNATIVEBYTES_NATIVE_ENDIAN | (is_unsigned ? Py_ASNATIVEBYTES_UNSIGNED_BUFFER | Py_ASNATIVEBYTES_REJECT_NEGATIVE : 0));
+        if (unlikely(bytes_copied == -1)) {
+        } else if (unlikely(bytes_copied > (Py_ssize_t) sizeof(val))) {
+            goto raise_overflow;
+        } else {
+            ret = 0;
+        }
+#elif PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray)
+        int one = 1; int is_little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&val;
+        ret = _PyLong_AsByteArray((PyLongObject *)x,
+                                    bytes, sizeof(val),
+                                    is_little, !is_unsigned);
+#else
+        PyObject *v;
+        PyObject *stepval = NULL, *mask = NULL, *shift = NULL;
+        int bits, remaining_bits, is_negative = 0;
+        int chunk_size = (sizeof(long) < 8) ? 30 : 62;
+        if (likely(PyLong_CheckExact(x))) {
+            v = __Pyx_NewRef(x);
+        } else {
+            v = PyNumber_Long(x);
+            if (unlikely(!v)) return (unsigned int) -1;
+            assert(PyLong_CheckExact(v));
+        }
+        {
+            int result = PyObject_RichCompareBool(v, Py_False, Py_LT);
+            if (unlikely(result < 0)) {
+                Py_DECREF(v);
+                return (unsigned int) -1;
+            }
+            is_negative = result == 1;
+        }
+        if (is_unsigned && unlikely(is_negative)) {
+            Py_DECREF(v);
+            goto raise_neg_overflow;
+        } else if (is_negative) {
+            stepval = PyNumber_Invert(v);
+            Py_DECREF(v);
+            if (unlikely(!stepval))
+                return (unsigned int) -1;
+        } else {
+            stepval = v;
+        }
+        v = NULL;
+        val = (unsigned int) 0;
+        mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done;
+        shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done;
+        for (bits = 0; bits < (int) sizeof(unsigned int) * 8 - chunk_size; bits += chunk_size) {
+            PyObject *tmp, *digit;
+            long idigit;
+            digit = PyNumber_And(stepval, mask);
+            if (unlikely(!digit)) goto done;
+            idigit = PyLong_AsLong(digit);
+            Py_DECREF(digit);
+            if (unlikely(idigit < 0)) goto done;
+            val |= ((unsigned int) idigit) << bits;
+            tmp = PyNumber_Rshift(stepval, shift);
+            if (unlikely(!tmp)) goto done;
+            Py_DECREF(stepval); stepval = tmp;
+        }
+        Py_DECREF(shift); shift = NULL;
+        Py_DECREF(mask); mask = NULL;
+        {
+            long idigit = PyLong_AsLong(stepval);
+            if (unlikely(idigit < 0)) goto done;
+            remaining_bits = ((int) sizeof(unsigned int) * 8) - bits - (is_unsigned ? 0 : 1);
+            if (unlikely(idigit >= (1L << remaining_bits)))
+                goto raise_overflow;
+            val |= ((unsigned int) idigit) << bits;
+        }
+        if (!is_unsigned) {
+            if (unlikely(val & (((unsigned int) 1) << (sizeof(unsigned int) * 8 - 1))))
+                goto raise_overflow;
+            if (is_negative)
+                val = ~val;
+        }
+        ret = 0;
+    done:
+        Py_XDECREF(shift);
+        Py_XDECREF(mask);
+        Py_XDECREF(stepval);
+#endif
+        if (unlikely(ret))
+            return (unsigned int) -1;
+        return val;
+    }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to unsigned int");
+    return (unsigned int) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to unsigned int");
+    return (unsigned int) -1;
+}
+
+/* Generator */
+  static PyMethodDef __pyx_Generator_methods[] = {
+    {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
+     (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")},
+    {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
+     (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")},
+    {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS,
+     (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")},
+    {0, 0, 0, 0}
+};
+static PyMemberDef __pyx_Generator_memberlist[] = {
+    {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
+    {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
+     (char*) PyDoc_STR("object being iterated by 'yield from', or None")},
+    {(char*) "gi_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL},
+    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_modulename), 0, 0},
+#if CYTHON_USE_TYPE_SPECS
+    {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CoroutineObject, gi_weakreflist), READONLY, 0},
+#endif
+    {0, 0, 0, 0, 0}
+};
+static PyGetSetDef __pyx_Generator_getsets[] = {
+    {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
+     (char*) PyDoc_STR("name of the generator"), 0},
+    {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
+     (char*) PyDoc_STR("qualified name of the generator"), 0},
+    {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL,
+     (char*) PyDoc_STR("Frame of the generator"), 0},
+    {0, 0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_GeneratorType_slots[] = {
+    {Py_tp_dealloc, (void *)__Pyx_Coroutine_dealloc},
+    {Py_tp_traverse, (void *)__Pyx_Coroutine_traverse},
+    {Py_tp_iter, (void *)PyObject_SelfIter},
+    {Py_tp_iternext, (void *)__Pyx_Generator_Next},
+    {Py_tp_methods, (void *)__pyx_Generator_methods},
+    {Py_tp_members, (void *)__pyx_Generator_memberlist},
+    {Py_tp_getset, (void *)__pyx_Generator_getsets},
+    {Py_tp_getattro, (void *) __Pyx_PyObject_GenericGetAttrNoDict},
+#if CYTHON_USE_TP_FINALIZE
+    {Py_tp_finalize, (void *)__Pyx_Coroutine_del},
+#endif
+    {0, 0},
+};
+static PyType_Spec __pyx_GeneratorType_spec = {
+    __PYX_TYPE_MODULE_PREFIX "generator",
+    sizeof(__pyx_CoroutineObject),
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
+    __pyx_GeneratorType_slots
+};
+#else
+static PyTypeObject __pyx_GeneratorType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __PYX_TYPE_MODULE_PREFIX "generator",
+    sizeof(__pyx_CoroutineObject),
+    0,
+    (destructor) __Pyx_Coroutine_dealloc,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
+    0,
+    (traverseproc) __Pyx_Coroutine_traverse,
+    0,
+    0,
+    offsetof(__pyx_CoroutineObject, 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 CYTHON_USE_TP_FINALIZE
+    0,
+#else
+    __Pyx_Coroutine_del,
+#endif
+    0,
+#if CYTHON_USE_TP_FINALIZE
+    __Pyx_Coroutine_del,
+#elif PY_VERSION_HEX >= 0x030400a1
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+    0,
+#endif
+#if __PYX_NEED_TP_PRINT_SLOT
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030C0000
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030d00A4
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+    0,
+#endif
+};
+#endif
+static int __pyx_Generator_init(PyObject *module) {
+#if CYTHON_USE_TYPE_SPECS
+    __pyx_GeneratorType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_GeneratorType_spec, NULL);
+#else
+    CYTHON_UNUSED_VAR(module);
+    __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
+    __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
+#endif
+    if (unlikely(!__pyx_GeneratorType)) {
+        return -1;
+    }
+    return 0;
+}
+
+/* AsyncGeneratorInitFinalizer */
+  #if PY_VERSION_HEX < 0x030600B0
+static int __Pyx_async_gen_init_hooks(__pyx_PyAsyncGenObject *o) {
+#if 0
+    PyThreadState *tstate;
+    PyObject *finalizer;
+    PyObject *firstiter;
+#endif
+    if (likely(o->ag_hooks_inited)) {
+        return 0;
+    }
+    o->ag_hooks_inited = 1;
+#if 0
+    tstate = __Pyx_PyThreadState_Current;
+    finalizer = tstate->async_gen_finalizer;
+    if (finalizer) {
+        Py_INCREF(finalizer);
+        o->ag_finalizer = finalizer;
+    }
+    firstiter = tstate->async_gen_firstiter;
+    if (firstiter) {
+        PyObject *res;
+        Py_INCREF(firstiter);
+        res = __Pyx_PyObject_CallOneArg(firstiter, (PyObject*)o);
+        Py_DECREF(firstiter);
+        if (res == NULL) {
+            return 1;
+        }
+        Py_DECREF(res);
+    }
+#endif
+    return 0;
+}
+#endif
+
+/* AsyncGenerator */
+  PyDoc_STRVAR(__Pyx_async_gen_send_doc,
+"send(arg) -> send 'arg' into generator,\n\
+return next yielded value or raise StopIteration.");
+PyDoc_STRVAR(__Pyx_async_gen_close_doc,
+"close() -> raise GeneratorExit inside generator.");
+PyDoc_STRVAR(__Pyx_async_gen_throw_doc,
+"throw(typ[,val[,tb]]) -> raise exception in generator,\n\
+return next yielded value or raise StopIteration.");
+PyDoc_STRVAR(__Pyx_async_gen_await_doc,
+"__await__() -> return a representation that can be passed into the 'await' expression.");
+static PyObject *__Pyx_async_gen_asend_new(__pyx_PyAsyncGenObject *, PyObject *);
+static PyObject *__Pyx_async_gen_athrow_new(__pyx_PyAsyncGenObject *, PyObject *);
+static const char *__Pyx_NON_INIT_CORO_MSG = "can't send non-None value to a just-started coroutine";
+static const char *__Pyx_ASYNC_GEN_IGNORED_EXIT_MSG = "async generator ignored GeneratorExit";
+static const char *__Pyx_ASYNC_GEN_CANNOT_REUSE_SEND_MSG = "cannot reuse already awaited __anext__()/asend()";
+static const char *__Pyx_ASYNC_GEN_CANNOT_REUSE_CLOSE_MSG = "cannot reuse already awaited aclose()/athrow()";
+typedef enum {
+    __PYX_AWAITABLE_STATE_INIT,
+    __PYX_AWAITABLE_STATE_ITER,
+    __PYX_AWAITABLE_STATE_CLOSED,
+} __pyx_AwaitableState;
+typedef struct {
+    PyObject_HEAD
+    __pyx_PyAsyncGenObject *ags_gen;
+    PyObject *ags_sendval;
+    __pyx_AwaitableState ags_state;
+} __pyx_PyAsyncGenASend;
+typedef struct {
+    PyObject_HEAD
+    __pyx_PyAsyncGenObject *agt_gen;
+    PyObject *agt_args;
+    __pyx_AwaitableState agt_state;
+} __pyx_PyAsyncGenAThrow;
+typedef struct {
+    PyObject_HEAD
+    PyObject *agw_val;
+} __pyx__PyAsyncGenWrappedValue;
+#ifndef _PyAsyncGen_MAXFREELIST
+#define _PyAsyncGen_MAXFREELIST 80
+#endif
+static __pyx__PyAsyncGenWrappedValue *__Pyx_ag_value_freelist[_PyAsyncGen_MAXFREELIST];
+static int __Pyx_ag_value_freelist_free = 0;
+static __pyx_PyAsyncGenASend *__Pyx_ag_asend_freelist[_PyAsyncGen_MAXFREELIST];
+static int __Pyx_ag_asend_freelist_free = 0;
+#define __pyx__PyAsyncGenWrappedValue_CheckExact(o)\
+                    __Pyx_IS_TYPE(o, __pyx__PyAsyncGenWrappedValueType)
+static int
+__Pyx_async_gen_traverse(__pyx_PyAsyncGenObject *gen, visitproc visit, void *arg)
+{
+    Py_VISIT(gen->ag_finalizer);
+    return __Pyx_Coroutine_traverse((__pyx_CoroutineObject*)gen, visit, arg);
+}
+static PyObject *
+__Pyx_async_gen_repr(__pyx_CoroutineObject *o)
+{
+    return PyUnicode_FromFormat("<async_generator object %S at %p>",
+                                o->gi_qualname ? o->gi_qualname : Py_None, o);
+}
+#if PY_VERSION_HEX >= 0x030600B0
+static int
+__Pyx_async_gen_init_hooks(__pyx_PyAsyncGenObject *o)
+{
+#if !CYTHON_COMPILING_IN_PYPY
+    PyThreadState *tstate;
+#endif
+    PyObject *finalizer;
+    PyObject *firstiter;
+    if (o->ag_hooks_inited) {
+        return 0;
+    }
+    o->ag_hooks_inited = 1;
+#if CYTHON_COMPILING_IN_PYPY
+    finalizer = _PyEval_GetAsyncGenFinalizer();
+#else
+    tstate = __Pyx_PyThreadState_Current;
+    finalizer = tstate->async_gen_finalizer;
+#endif
+    if (finalizer) {
+        Py_INCREF(finalizer);
+        o->ag_finalizer = finalizer;
+    }
+#if CYTHON_COMPILING_IN_PYPY
+    firstiter = _PyEval_GetAsyncGenFirstiter();
+#else
+    firstiter = tstate->async_gen_firstiter;
+#endif
+    if (firstiter) {
+        PyObject *res;
+#if CYTHON_UNPACK_METHODS
+        PyObject *self;
+#endif
+        Py_INCREF(firstiter);
+#if CYTHON_UNPACK_METHODS
+        if (likely(PyMethod_Check(firstiter)) && likely((self = PyMethod_GET_SELF(firstiter)) != NULL)) {
+            PyObject *function = PyMethod_GET_FUNCTION(firstiter);
+            res = __Pyx_PyObject_Call2Args(function, self, (PyObject*)o);
+        } else
+#endif
+        res = __Pyx_PyObject_CallOneArg(firstiter, (PyObject*)o);
+        Py_DECREF(firstiter);
+        if (unlikely(res == NULL)) {
+            return 1;
+        }
+        Py_DECREF(res);
+    }
+    return 0;
+}
+#endif
+static PyObject *
+__Pyx_async_gen_anext(PyObject *g)
+{
+    __pyx_PyAsyncGenObject *o = (__pyx_PyAsyncGenObject*) g;
+    if (unlikely(__Pyx_async_gen_init_hooks(o))) {
+        return NULL;
+    }
+    return __Pyx_async_gen_asend_new(o, NULL);
+}
+static PyObject *
+__Pyx_async_gen_anext_method(PyObject *g, PyObject *arg) {
+    CYTHON_UNUSED_VAR(arg);
+    return __Pyx_async_gen_anext(g);
+}
+static PyObject *
+__Pyx_async_gen_asend(__pyx_PyAsyncGenObject *o, PyObject *arg)
+{
+    if (unlikely(__Pyx_async_gen_init_hooks(o))) {
+        return NULL;
+    }
+    return __Pyx_async_gen_asend_new(o, arg);
+}
+static PyObject *
+__Pyx_async_gen_aclose(__pyx_PyAsyncGenObject *o, PyObject *arg)
+{
+    CYTHON_UNUSED_VAR(arg);
+    if (unlikely(__Pyx_async_gen_init_hooks(o))) {
+        return NULL;
+    }
+    return __Pyx_async_gen_athrow_new(o, NULL);
+}
+static PyObject *
+__Pyx_async_gen_athrow(__pyx_PyAsyncGenObject *o, PyObject *args)
+{
+    if (unlikely(__Pyx_async_gen_init_hooks(o))) {
+        return NULL;
+    }
+    return __Pyx_async_gen_athrow_new(o, args);
+}
+static PyObject *
+__Pyx_async_gen_self_method(PyObject *g, PyObject *arg) {
+    CYTHON_UNUSED_VAR(arg);
+    return __Pyx_NewRef(g);
+}
+static PyGetSetDef __Pyx_async_gen_getsetlist[] = {
+    {(char*) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
+     (char*) PyDoc_STR("name of the async generator"), 0},
+    {(char*) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
+     (char*) PyDoc_STR("qualified name of the async generator"), 0},
+    {0, 0, 0, 0, 0}
+};
+static PyMemberDef __Pyx_async_gen_memberlist[] = {
+    {(char*) "ag_running", T_BOOL,   offsetof(__pyx_PyAsyncGenObject, ag_running_async), READONLY, NULL},
+    {(char*) "ag_await", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
+     (char*) PyDoc_STR("object being awaited on, or None")},
+    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_modulename), 0, 0},
+#if CYTHON_USE_TYPE_SPECS
+    {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CoroutineObject, gi_weakreflist), READONLY, 0},
+#endif
+    {0, 0, 0, 0, 0}
+};
+PyDoc_STRVAR(__Pyx_async_aclose_doc,
+"aclose() -> raise GeneratorExit inside generator.");
+PyDoc_STRVAR(__Pyx_async_asend_doc,
+"asend(v) -> send 'v' in generator.");
+PyDoc_STRVAR(__Pyx_async_athrow_doc,
+"athrow(typ[,val[,tb]]) -> raise exception in generator.");
+PyDoc_STRVAR(__Pyx_async_aiter_doc,
+"__aiter__(v) -> return an asynchronous iterator.");
+PyDoc_STRVAR(__Pyx_async_anext_doc,
+"__anext__(v) -> continue asynchronous iteration and return the next element.");
+static PyMethodDef __Pyx_async_gen_methods[] = {
+    {"asend", (PyCFunction)__Pyx_async_gen_asend, METH_O, __Pyx_async_asend_doc},
+    {"athrow",(PyCFunction)__Pyx_async_gen_athrow, METH_VARARGS, __Pyx_async_athrow_doc},
+    {"aclose", (PyCFunction)__Pyx_async_gen_aclose, METH_NOARGS, __Pyx_async_aclose_doc},
+    {"__aiter__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_aiter_doc},
+    {"__anext__", (PyCFunction)__Pyx_async_gen_anext_method, METH_NOARGS, __Pyx_async_anext_doc},
+    {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx_AsyncGenType_slots[] = {
+    {Py_tp_dealloc, (void *)__Pyx_Coroutine_dealloc},
+    {Py_am_aiter, (void *)PyObject_SelfIter},
+    {Py_am_anext, (void *)__Pyx_async_gen_anext},
+    {Py_tp_repr, (void *)__Pyx_async_gen_repr},
+    {Py_tp_traverse, (void *)__Pyx_async_gen_traverse},
+    {Py_tp_methods, (void *)__Pyx_async_gen_methods},
+    {Py_tp_members, (void *)__Pyx_async_gen_memberlist},
+    {Py_tp_getset, (void *)__Pyx_async_gen_getsetlist},
+#if CYTHON_USE_TP_FINALIZE
+    {Py_tp_finalize, (void *)__Pyx_Coroutine_del},
+#endif
+    {0, 0},
+};
+static PyType_Spec __pyx_AsyncGenType_spec = {
+    __PYX_TYPE_MODULE_PREFIX "async_generator",
+    sizeof(__pyx_PyAsyncGenObject),
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
+    __pyx_AsyncGenType_slots
+};
+#else
+#if CYTHON_USE_ASYNC_SLOTS
+static __Pyx_PyAsyncMethodsStruct __Pyx_async_gen_as_async = {
+    0,
+    PyObject_SelfIter,
+    (unaryfunc)__Pyx_async_gen_anext,
+#if PY_VERSION_HEX >= 0x030A00A3
+    0,
+#endif
+};
+#endif
+static PyTypeObject __pyx_AsyncGenType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    "async_generator",
+    sizeof(__pyx_PyAsyncGenObject),
+    0,
+    (destructor)__Pyx_Coroutine_dealloc,
+    0,
+    0,
+    0,
+#if CYTHON_USE_ASYNC_SLOTS
+    &__Pyx_async_gen_as_async,
+#else
+    0,
+#endif
+    (reprfunc)__Pyx_async_gen_repr,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
+        Py_TPFLAGS_HAVE_FINALIZE,
+    0,
+    (traverseproc)__Pyx_async_gen_traverse,
+    0,
+#if CYTHON_USE_ASYNC_SLOTS && CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x030500B1
+    __Pyx_Coroutine_compare,
+#else
+    0,
+#endif
+    offsetof(__pyx_CoroutineObject, gi_weakreflist),
+    0,
+    0,
+    __Pyx_async_gen_methods,
+    __Pyx_async_gen_memberlist,
+    __Pyx_async_gen_getsetlist,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if CYTHON_USE_TP_FINALIZE
+    0,
+#else
+    __Pyx_Coroutine_del,
+#endif
+    0,
+#if CYTHON_USE_TP_FINALIZE
+    __Pyx_Coroutine_del,
+#elif PY_VERSION_HEX >= 0x030400a1
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+    0,
+#endif
+#if __PYX_NEED_TP_PRINT_SLOT
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030C0000
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030d00A4
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+    0,
+#endif
+};
+#endif
+static int
+__Pyx_PyAsyncGen_ClearFreeLists(void)
+{
+    int ret = __Pyx_ag_value_freelist_free + __Pyx_ag_asend_freelist_free;
+    while (__Pyx_ag_value_freelist_free) {
+        __pyx__PyAsyncGenWrappedValue *o;
+        o = __Pyx_ag_value_freelist[--__Pyx_ag_value_freelist_free];
+        assert(__pyx__PyAsyncGenWrappedValue_CheckExact(o));
+        __Pyx_PyHeapTypeObject_GC_Del(o);
+    }
+    while (__Pyx_ag_asend_freelist_free) {
+        __pyx_PyAsyncGenASend *o;
+        o = __Pyx_ag_asend_freelist[--__Pyx_ag_asend_freelist_free];
+        assert(__Pyx_IS_TYPE(o, __pyx__PyAsyncGenASendType));
+        __Pyx_PyHeapTypeObject_GC_Del(o);
+    }
+    return ret;
+}
+static void
+__Pyx_PyAsyncGen_Fini(void)
+{
+    __Pyx_PyAsyncGen_ClearFreeLists();
+}
+static PyObject *
+__Pyx_async_gen_unwrap_value(__pyx_PyAsyncGenObject *gen, PyObject *result)
+{
+    if (result == NULL) {
+        PyObject *exc_type = PyErr_Occurred();
+        if (!exc_type) {
+            PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration);
+            gen->ag_closed = 1;
+        } else if (__Pyx_PyErr_GivenExceptionMatches2(exc_type, __Pyx_PyExc_StopAsyncIteration, PyExc_GeneratorExit)) {
+            gen->ag_closed = 1;
+        }
+        gen->ag_running_async = 0;
+        return NULL;
+    }
+    if (__pyx__PyAsyncGenWrappedValue_CheckExact(result)) {
+        __Pyx_ReturnWithStopIteration(((__pyx__PyAsyncGenWrappedValue*)result)->agw_val);
+        Py_DECREF(result);
+        gen->ag_running_async = 0;
+        return NULL;
+    }
+    return result;
+}
+static void
+__Pyx_async_gen_asend_dealloc(__pyx_PyAsyncGenASend *o)
+{
+    PyObject_GC_UnTrack((PyObject *)o);
+    Py_CLEAR(o->ags_gen);
+    Py_CLEAR(o->ags_sendval);
+    if (likely(__Pyx_ag_asend_freelist_free < _PyAsyncGen_MAXFREELIST)) {
+        assert(__pyx_PyAsyncGenASend_CheckExact(o));
+        __Pyx_ag_asend_freelist[__Pyx_ag_asend_freelist_free++] = o;
+    } else {
+        __Pyx_PyHeapTypeObject_GC_Del(o);
+    }
+}
+static int
+__Pyx_async_gen_asend_traverse(__pyx_PyAsyncGenASend *o, visitproc visit, void *arg)
+{
+    Py_VISIT(o->ags_gen);
+    Py_VISIT(o->ags_sendval);
+    return 0;
+}
+static PyObject *
+__Pyx_async_gen_asend_send(PyObject *g, PyObject *arg)
+{
+    __pyx_PyAsyncGenASend *o = (__pyx_PyAsyncGenASend*) g;
+    PyObject *result;
+    if (unlikely(o->ags_state == __PYX_AWAITABLE_STATE_CLOSED)) {
+        PyErr_SetString(PyExc_RuntimeError, __Pyx_ASYNC_GEN_CANNOT_REUSE_SEND_MSG);
+        return NULL;
+    }
+    if (o->ags_state == __PYX_AWAITABLE_STATE_INIT) {
+        if (unlikely(o->ags_gen->ag_running_async)) {
+            PyErr_SetString(
+                PyExc_RuntimeError,
+                "anext(): asynchronous generator is already running");
+            return NULL;
+        }
+        if (arg == NULL || arg == Py_None) {
+            arg = o->ags_sendval ? o->ags_sendval : Py_None;
+        }
+        o->ags_state = __PYX_AWAITABLE_STATE_ITER;
+    }
+    o->ags_gen->ag_running_async = 1;
+    result = __Pyx_Coroutine_Send((PyObject*)o->ags_gen, arg);
+    result = __Pyx_async_gen_unwrap_value(o->ags_gen, result);
+    if (result == NULL) {
+        o->ags_state = __PYX_AWAITABLE_STATE_CLOSED;
+    }
+    return result;
+}
+static CYTHON_INLINE PyObject *
+__Pyx_async_gen_asend_iternext(PyObject *o)
+{
+    return __Pyx_async_gen_asend_send(o, Py_None);
+}
+static PyObject *
+__Pyx_async_gen_asend_throw(__pyx_PyAsyncGenASend *o, PyObject *args)
+{
+    PyObject *result;
+    if (unlikely(o->ags_state == __PYX_AWAITABLE_STATE_CLOSED)) {
+        PyErr_SetString(PyExc_RuntimeError, __Pyx_ASYNC_GEN_CANNOT_REUSE_SEND_MSG);
+        return NULL;
+    }
+    result = __Pyx_Coroutine_Throw((PyObject*)o->ags_gen, args);
+    result = __Pyx_async_gen_unwrap_value(o->ags_gen, result);
+    if (result == NULL) {
+        o->ags_state = __PYX_AWAITABLE_STATE_CLOSED;
+    }
+    return result;
+}
+static PyObject *
+__Pyx_async_gen_asend_close(PyObject *g, PyObject *args)
+{
+    __pyx_PyAsyncGenASend *o = (__pyx_PyAsyncGenASend*) g;
+    CYTHON_UNUSED_VAR(args);
+    o->ags_state = __PYX_AWAITABLE_STATE_CLOSED;
+    Py_RETURN_NONE;
+}
+static PyMethodDef __Pyx_async_gen_asend_methods[] = {
+    {"send", (PyCFunction)__Pyx_async_gen_asend_send, METH_O, __Pyx_async_gen_send_doc},
+    {"throw", (PyCFunction)__Pyx_async_gen_asend_throw, METH_VARARGS, __Pyx_async_gen_throw_doc},
+    {"close", (PyCFunction)__Pyx_async_gen_asend_close, METH_NOARGS, __Pyx_async_gen_close_doc},
+    {"__await__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_gen_await_doc},
+    {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx__PyAsyncGenASendType_slots[] = {
+    {Py_tp_dealloc, (void *)__Pyx_async_gen_asend_dealloc},
+    {Py_am_await, (void *)PyObject_SelfIter},
+    {Py_tp_traverse, (void *)__Pyx_async_gen_asend_traverse},
+    {Py_tp_methods, (void *)__Pyx_async_gen_asend_methods},
+    {Py_tp_iter, (void *)PyObject_SelfIter},
+    {Py_tp_iternext, (void *)__Pyx_async_gen_asend_iternext},
+    {0, 0},
+};
+static PyType_Spec __pyx__PyAsyncGenASendType_spec = {
+    __PYX_TYPE_MODULE_PREFIX "async_generator_asend",
+    sizeof(__pyx_PyAsyncGenASend),
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    __pyx__PyAsyncGenASendType_slots
+};
+#else
+#if CYTHON_USE_ASYNC_SLOTS
+static __Pyx_PyAsyncMethodsStruct __Pyx_async_gen_asend_as_async = {
+    PyObject_SelfIter,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030A00A3
+    0,
+#endif
+};
+#endif
+static PyTypeObject __pyx__PyAsyncGenASendType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    "async_generator_asend",
+    sizeof(__pyx_PyAsyncGenASend),
+    0,
+    (destructor)__Pyx_async_gen_asend_dealloc,
+    0,
+    0,
+    0,
+#if CYTHON_USE_ASYNC_SLOTS
+    &__Pyx_async_gen_asend_as_async,
+#else
+    0,
+#endif
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    0,
+    (traverseproc)__Pyx_async_gen_asend_traverse,
+    0,
+#if CYTHON_USE_ASYNC_SLOTS && CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x030500B1
+    __Pyx_Coroutine_compare,
+#else
+    0,
+#endif
+    0,
+    PyObject_SelfIter,
+    (iternextfunc)__Pyx_async_gen_asend_iternext,
+    __Pyx_async_gen_asend_methods,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+    0,
+#endif
+#if __PYX_NEED_TP_PRINT_SLOT
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030C0000
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030d00A4
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+    0,
+#endif
+};
+#endif
+static PyObject *
+__Pyx_async_gen_asend_new(__pyx_PyAsyncGenObject *gen, PyObject *sendval)
+{
+    __pyx_PyAsyncGenASend *o;
+    if (likely(__Pyx_ag_asend_freelist_free)) {
+        __Pyx_ag_asend_freelist_free--;
+        o = __Pyx_ag_asend_freelist[__Pyx_ag_asend_freelist_free];
+        _Py_NewReference((PyObject *)o);
+    } else {
+        o = PyObject_GC_New(__pyx_PyAsyncGenASend, __pyx__PyAsyncGenASendType);
+        if (unlikely(o == NULL)) {
+            return NULL;
+        }
+    }
+    Py_INCREF(gen);
+    o->ags_gen = gen;
+    Py_XINCREF(sendval);
+    o->ags_sendval = sendval;
+    o->ags_state = __PYX_AWAITABLE_STATE_INIT;
+    PyObject_GC_Track((PyObject*)o);
+    return (PyObject*)o;
+}
+static void
+__Pyx_async_gen_wrapped_val_dealloc(__pyx__PyAsyncGenWrappedValue *o)
+{
+    PyObject_GC_UnTrack((PyObject *)o);
+    Py_CLEAR(o->agw_val);
+    if (likely(__Pyx_ag_value_freelist_free < _PyAsyncGen_MAXFREELIST)) {
+        assert(__pyx__PyAsyncGenWrappedValue_CheckExact(o));
+        __Pyx_ag_value_freelist[__Pyx_ag_value_freelist_free++] = o;
+    } else {
+        __Pyx_PyHeapTypeObject_GC_Del(o);
+    }
+}
+static int
+__Pyx_async_gen_wrapped_val_traverse(__pyx__PyAsyncGenWrappedValue *o,
+                                     visitproc visit, void *arg)
+{
+    Py_VISIT(o->agw_val);
+    return 0;
+}
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx__PyAsyncGenWrappedValueType_slots[] = {
+    {Py_tp_dealloc, (void *)__Pyx_async_gen_wrapped_val_dealloc},
+    {Py_tp_traverse, (void *)__Pyx_async_gen_wrapped_val_traverse},
+    {0, 0},
+};
+static PyType_Spec __pyx__PyAsyncGenWrappedValueType_spec = {
+    __PYX_TYPE_MODULE_PREFIX "async_generator_wrapped_value",
+    sizeof(__pyx__PyAsyncGenWrappedValue),
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    __pyx__PyAsyncGenWrappedValueType_slots
+};
+#else
+static PyTypeObject __pyx__PyAsyncGenWrappedValueType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    "async_generator_wrapped_value",
+    sizeof(__pyx__PyAsyncGenWrappedValue),
+    0,
+    (destructor)__Pyx_async_gen_wrapped_val_dealloc,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    0,
+    (traverseproc)__Pyx_async_gen_wrapped_val_traverse,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+    0,
+#endif
+#if __PYX_NEED_TP_PRINT_SLOT
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030C0000
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030d00A4
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+    0,
+#endif
+};
+#endif
+static PyObject *
+__Pyx__PyAsyncGenValueWrapperNew(PyObject *val)
+{
+    __pyx__PyAsyncGenWrappedValue *o;
+    assert(val);
+    if (likely(__Pyx_ag_value_freelist_free)) {
+        __Pyx_ag_value_freelist_free--;
+        o = __Pyx_ag_value_freelist[__Pyx_ag_value_freelist_free];
+        assert(__pyx__PyAsyncGenWrappedValue_CheckExact(o));
+        _Py_NewReference((PyObject*)o);
+    } else {
+        o = PyObject_GC_New(__pyx__PyAsyncGenWrappedValue, __pyx__PyAsyncGenWrappedValueType);
+        if (unlikely(!o)) {
+            Py_DECREF(val);
+            return NULL;
+        }
+    }
+    o->agw_val = val;
+    PyObject_GC_Track((PyObject*)o);
+    return (PyObject*)o;
+}
+static void
+__Pyx_async_gen_athrow_dealloc(__pyx_PyAsyncGenAThrow *o)
+{
+    PyObject_GC_UnTrack((PyObject *)o);
+    Py_CLEAR(o->agt_gen);
+    Py_CLEAR(o->agt_args);
+    __Pyx_PyHeapTypeObject_GC_Del(o);
+}
+static int
+__Pyx_async_gen_athrow_traverse(__pyx_PyAsyncGenAThrow *o, visitproc visit, void *arg)
+{
+    Py_VISIT(o->agt_gen);
+    Py_VISIT(o->agt_args);
+    return 0;
+}
+static PyObject *
+__Pyx_async_gen_athrow_send(__pyx_PyAsyncGenAThrow *o, PyObject *arg)
+{
+    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*)o->agt_gen;
+    PyObject *retval, *exc_type;
+    if (unlikely(o->agt_state == __PYX_AWAITABLE_STATE_CLOSED)) {
+        PyErr_SetString(PyExc_RuntimeError, __Pyx_ASYNC_GEN_CANNOT_REUSE_CLOSE_MSG);
+        return NULL;
+    }
+    if (unlikely(gen->resume_label == -1)) {
+        o->agt_state = __PYX_AWAITABLE_STATE_CLOSED;
+        PyErr_SetNone(PyExc_StopIteration);
+        return NULL;
+    }
+    if (o->agt_state == __PYX_AWAITABLE_STATE_INIT) {
+        if (unlikely(o->agt_gen->ag_running_async)) {
+            o->agt_state = __PYX_AWAITABLE_STATE_CLOSED;
+            if (o->agt_args == NULL) {
+                PyErr_SetString(
+                    PyExc_RuntimeError,
+                    "aclose(): asynchronous generator is already running");
+            } else {
+                PyErr_SetString(
+                    PyExc_RuntimeError,
+                    "athrow(): asynchronous generator is already running");
+            }
+            return NULL;
+        }
+        if (unlikely(o->agt_gen->ag_closed)) {
+            o->agt_state = __PYX_AWAITABLE_STATE_CLOSED;
+            PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration);
+            return NULL;
+        }
+        if (unlikely(arg != Py_None)) {
+            PyErr_SetString(PyExc_RuntimeError, __Pyx_NON_INIT_CORO_MSG);
+            return NULL;
+        }
+        o->agt_state = __PYX_AWAITABLE_STATE_ITER;
+        o->agt_gen->ag_running_async = 1;
+        if (o->agt_args == NULL) {
+            o->agt_gen->ag_closed = 1;
+            retval = __Pyx__Coroutine_Throw((PyObject*)gen,
+                PyExc_GeneratorExit, NULL, NULL, NULL, 0);
+            if (retval && __pyx__PyAsyncGenWrappedValue_CheckExact(retval)) {
+                Py_DECREF(retval);
+                goto yield_close;
+            }
+        } else {
+            PyObject *typ;
+            PyObject *tb = NULL;
+            PyObject *val = NULL;
+            if (unlikely(!PyArg_UnpackTuple(o->agt_args, "athrow", 1, 3, &typ, &val, &tb))) {
+                return NULL;
+            }
+            retval = __Pyx__Coroutine_Throw((PyObject*)gen,
+                typ, val, tb, o->agt_args, 0);
+            retval = __Pyx_async_gen_unwrap_value(o->agt_gen, retval);
+        }
+        if (retval == NULL) {
+            goto check_error;
+        }
+        return retval;
+    }
+    assert (o->agt_state == __PYX_AWAITABLE_STATE_ITER);
+    retval = __Pyx_Coroutine_Send((PyObject *)gen, arg);
+    if (o->agt_args) {
+        return __Pyx_async_gen_unwrap_value(o->agt_gen, retval);
+    } else {
+        if (retval) {
+            if (unlikely(__pyx__PyAsyncGenWrappedValue_CheckExact(retval))) {
+                Py_DECREF(retval);
+                goto yield_close;
+            }
+            else {
+                return retval;
+            }
+        }
+        else {
+            goto check_error;
+        }
+    }
+yield_close:
+    o->agt_gen->ag_running_async = 0;
+    o->agt_state = __PYX_AWAITABLE_STATE_CLOSED;
+    PyErr_SetString(
+        PyExc_RuntimeError, __Pyx_ASYNC_GEN_IGNORED_EXIT_MSG);
+    return NULL;
+check_error:
+    o->agt_gen->ag_running_async = 0;
+    o->agt_state = __PYX_AWAITABLE_STATE_CLOSED;
+    exc_type = PyErr_Occurred();
+    if (__Pyx_PyErr_GivenExceptionMatches2(exc_type, __Pyx_PyExc_StopAsyncIteration, PyExc_GeneratorExit)) {
+        if (o->agt_args == NULL) {
+            PyErr_Clear();
+            PyErr_SetNone(PyExc_StopIteration);
+        }
+    }
+    return NULL;
+}
+static PyObject *
+__Pyx_async_gen_athrow_throw(__pyx_PyAsyncGenAThrow *o, PyObject *args)
+{
+    PyObject *retval;
+    if (unlikely(o->agt_state == __PYX_AWAITABLE_STATE_CLOSED)) {
+        PyErr_SetString(PyExc_RuntimeError, __Pyx_ASYNC_GEN_CANNOT_REUSE_CLOSE_MSG);
+        return NULL;
+    }
+    retval = __Pyx_Coroutine_Throw((PyObject*)o->agt_gen, args);
+    if (o->agt_args) {
+        return __Pyx_async_gen_unwrap_value(o->agt_gen, retval);
+    } else {
+        PyObject *exc_type;
+        if (unlikely(retval && __pyx__PyAsyncGenWrappedValue_CheckExact(retval))) {
+            o->agt_gen->ag_running_async = 0;
+            o->agt_state = __PYX_AWAITABLE_STATE_CLOSED;
+            Py_DECREF(retval);
+            PyErr_SetString(PyExc_RuntimeError, __Pyx_ASYNC_GEN_IGNORED_EXIT_MSG);
+            return NULL;
+        }
+        exc_type = PyErr_Occurred();
+        if (__Pyx_PyErr_GivenExceptionMatches2(exc_type, __Pyx_PyExc_StopAsyncIteration, PyExc_GeneratorExit)) {
+            PyErr_Clear();
+            PyErr_SetNone(PyExc_StopIteration);
+        }
+        return retval;
+    }
+}
+static PyObject *
+__Pyx_async_gen_athrow_iternext(__pyx_PyAsyncGenAThrow *o)
+{
+    return __Pyx_async_gen_athrow_send(o, Py_None);
+}
+static PyObject *
+__Pyx_async_gen_athrow_close(PyObject *g, PyObject *args)
+{
+    __pyx_PyAsyncGenAThrow *o = (__pyx_PyAsyncGenAThrow*) g;
+    CYTHON_UNUSED_VAR(args);
+    o->agt_state = __PYX_AWAITABLE_STATE_CLOSED;
+    Py_RETURN_NONE;
+}
+static PyMethodDef __Pyx_async_gen_athrow_methods[] = {
+    {"send", (PyCFunction)__Pyx_async_gen_athrow_send, METH_O, __Pyx_async_gen_send_doc},
+    {"throw", (PyCFunction)__Pyx_async_gen_athrow_throw, METH_VARARGS, __Pyx_async_gen_throw_doc},
+    {"close", (PyCFunction)__Pyx_async_gen_athrow_close, METH_NOARGS, __Pyx_async_gen_close_doc},
+    {"__await__", (PyCFunction)__Pyx_async_gen_self_method, METH_NOARGS, __Pyx_async_gen_await_doc},
+    {0, 0, 0, 0}
+};
+#if CYTHON_USE_TYPE_SPECS
+static PyType_Slot __pyx__PyAsyncGenAThrowType_slots[] = {
+    {Py_tp_dealloc, (void *)__Pyx_async_gen_athrow_dealloc},
+    {Py_am_await, (void *)PyObject_SelfIter},
+    {Py_tp_traverse, (void *)__Pyx_async_gen_athrow_traverse},
+    {Py_tp_iter, (void *)PyObject_SelfIter},
+    {Py_tp_iternext, (void *)__Pyx_async_gen_athrow_iternext},
+    {Py_tp_methods, (void *)__Pyx_async_gen_athrow_methods},
+    {Py_tp_getattro, (void *)__Pyx_PyObject_GenericGetAttrNoDict},
+    {0, 0},
+};
+static PyType_Spec __pyx__PyAsyncGenAThrowType_spec = {
+    __PYX_TYPE_MODULE_PREFIX "async_generator_athrow",
+    sizeof(__pyx_PyAsyncGenAThrow),
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    __pyx__PyAsyncGenAThrowType_slots
+};
+#else
+#if CYTHON_USE_ASYNC_SLOTS
+static __Pyx_PyAsyncMethodsStruct __Pyx_async_gen_athrow_as_async = {
+    PyObject_SelfIter,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030A00A3
+    0,
+#endif
+};
+#endif
+static PyTypeObject __pyx__PyAsyncGenAThrowType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    "async_generator_athrow",
+    sizeof(__pyx_PyAsyncGenAThrow),
+    0,
+    (destructor)__Pyx_async_gen_athrow_dealloc,
+    0,
+    0,
+    0,
+#if CYTHON_USE_ASYNC_SLOTS
+    &__Pyx_async_gen_athrow_as_async,
+#else
+    0,
+#endif
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+    0,
+    (traverseproc)__Pyx_async_gen_athrow_traverse,
+    0,
+#if CYTHON_USE_ASYNC_SLOTS && CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x030500B1
+    __Pyx_Coroutine_compare,
+#else
+    0,
+#endif
+    0,
+    PyObject_SelfIter,
+    (iternextfunc)__Pyx_async_gen_athrow_iternext,
+    __Pyx_async_gen_athrow_methods,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+#if PY_VERSION_HEX >= 0x030400a1
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
+    0,
+#endif
+#if __PYX_NEED_TP_PRINT_SLOT
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030C0000
+    0,
+#endif
+#if PY_VERSION_HEX >= 0x030d00A4
+    0,
+#endif
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000
+    0,
+#endif
+};
+#endif
+static PyObject *
+__Pyx_async_gen_athrow_new(__pyx_PyAsyncGenObject *gen, PyObject *args)
+{
+    __pyx_PyAsyncGenAThrow *o;
+    o = PyObject_GC_New(__pyx_PyAsyncGenAThrow, __pyx__PyAsyncGenAThrowType);
+    if (unlikely(o == NULL)) {
+        return NULL;
+    }
+    o->agt_gen = gen;
+    o->agt_args = args;
+    o->agt_state = __PYX_AWAITABLE_STATE_INIT;
+    Py_INCREF(gen);
+    Py_XINCREF(args);
+    PyObject_GC_Track((PyObject*)o);
+    return (PyObject*)o;
+}
+static int __pyx_AsyncGen_init(PyObject *module) {
+#if CYTHON_USE_TYPE_SPECS
+    __pyx_AsyncGenType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_AsyncGenType_spec, NULL);
+#else
+    CYTHON_MAYBE_UNUSED_VAR(module);
+    __pyx_AsyncGenType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+    __pyx_AsyncGenType = __Pyx_FetchCommonType(&__pyx_AsyncGenType_type);
+#endif
+    if (unlikely(!__pyx_AsyncGenType))
+        return -1;
+#if CYTHON_USE_TYPE_SPECS
+    __pyx__PyAsyncGenAThrowType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx__PyAsyncGenAThrowType_spec, NULL);
+#else
+    __pyx__PyAsyncGenAThrowType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+    __pyx__PyAsyncGenAThrowType = __Pyx_FetchCommonType(&__pyx__PyAsyncGenAThrowType_type);
+#endif
+    if (unlikely(!__pyx__PyAsyncGenAThrowType))
+        return -1;
+#if CYTHON_USE_TYPE_SPECS
+    __pyx__PyAsyncGenWrappedValueType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx__PyAsyncGenWrappedValueType_spec, NULL);
+#else
+    __pyx__PyAsyncGenWrappedValueType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+    __pyx__PyAsyncGenWrappedValueType = __Pyx_FetchCommonType(&__pyx__PyAsyncGenWrappedValueType_type);
+#endif
+    if (unlikely(!__pyx__PyAsyncGenWrappedValueType))
+        return -1;
+#if CYTHON_USE_TYPE_SPECS
+    __pyx__PyAsyncGenASendType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx__PyAsyncGenASendType_spec, NULL);
+#else
+    __pyx__PyAsyncGenASendType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict;
+    __pyx__PyAsyncGenASendType = __Pyx_FetchCommonType(&__pyx__PyAsyncGenASendType_type);
+#endif
+    if (unlikely(!__pyx__PyAsyncGenASendType))
+        return -1;
+    return 0;
+}
+
+/* AsyncGen */
+  
+
+/* CheckBinaryVersion */
+  static unsigned long __Pyx_get_runtime_version(void) {
+#if __PYX_LIMITED_VERSION_HEX >= 0x030B00A4
+    return Py_Version & ~0xFFUL;
+#else
+    const char* rt_version = Py_GetVersion();
+    unsigned long version = 0;
+    unsigned long factor = 0x01000000UL;
+    unsigned int digit = 0;
+    int i = 0;
+    while (factor) {
+        while ('0' <= rt_version[i] && rt_version[i] <= '9') {
+            digit = digit * 10 + (unsigned int) (rt_version[i] - '0');
+            ++i;
+        }
+        version += factor * digit;
+        if (rt_version[i] != '.')
+            break;
+        digit = 0;
+        factor >>= 8;
+        ++i;
+    }
+    return version;
+#endif
+}
+static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) {
+    const unsigned long MAJOR_MINOR = 0xFFFF0000UL;
+    if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR))
+        return 0;
+    if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR)))
+        return 1;
+    {
+        char message[200];
+        PyOS_snprintf(message, sizeof(message),
+                      "compile time Python version %d.%d "
+                      "of module '%.100s' "
+                      "%s "
+                      "runtime version %d.%d",
+                       (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF),
+                       __Pyx_MODULE_NAME,
+                       (allow_newer) ? "was newer than" : "does not match",
+                       (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF)
+       );
+        return PyErr_WarnEx(NULL, message, 1);
+    }
+}
+
+/* VoidPtrExport */
+  static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig) {
+    PyObject *d;
+    PyObject *cobj = 0;
+    d = PyDict_GetItem(__pyx_d, __pyx_n_s_pyx_capi);
+    Py_XINCREF(d);
+    if (!d) {
+        d = PyDict_New();
+        if (!d)
+            goto bad;
+        if (__Pyx_PyObject_SetAttrStr(__pyx_m, __pyx_n_s_pyx_capi, d) < 0)
+            goto bad;
+    }
+    cobj = PyCapsule_New(p, sig, 0);
+    if (!cobj)
+        goto bad;
+    if (PyDict_SetItem(d, name, cobj) < 0)
+        goto bad;
+    Py_DECREF(cobj);
+    Py_DECREF(d);
+    return 0;
+bad:
+    Py_XDECREF(cobj);
+    Py_XDECREF(d);
+    return -1;
+}
+
+/* FunctionExport */
+  static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) {
+    PyObject *d = 0;
+    PyObject *cobj = 0;
+    union {
+        void (*fp)(void);
+        void *p;
+    } tmp;
+    d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
+    if (!d) {
+        PyErr_Clear();
+        d = PyDict_New();
+        if (!d)
+            goto bad;
+        Py_INCREF(d);
+        if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0)
+            goto bad;
+    }
+    tmp.fp = f;
+    cobj = PyCapsule_New(tmp.p, sig, 0);
+    if (!cobj)
+        goto bad;
+    if (PyDict_SetItemString(d, name, cobj) < 0)
+        goto bad;
+    Py_DECREF(cobj);
+    Py_DECREF(d);
+    return 0;
+bad:
+    Py_XDECREF(cobj);
+    Py_XDECREF(d);
+    return -1;
+}
+
+/* InitStrings */
+  #if PY_MAJOR_VERSION >= 3
+static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) {
+    if (t.is_unicode | t.is_str) {
+        if (t.intern) {
+            *str = PyUnicode_InternFromString(t.s);
+        } else if (t.encoding) {
+            *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL);
+        } else {
+            *str = PyUnicode_FromStringAndSize(t.s, t.n - 1);
+        }
+    } else {
+        *str = PyBytes_FromStringAndSize(t.s, t.n - 1);
+    }
+    if (!*str)
+        return -1;
+    if (PyObject_Hash(*str) == -1)
+        return -1;
+    return 0;
+}
+#endif
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
+    while (t->p) {
+        #if PY_MAJOR_VERSION >= 3
+        __Pyx_InitString(*t, t->p);
+        #else
+        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);
+        }
+        if (!*t->p)
+            return -1;
+        if (PyObject_Hash(*t->p) == -1)
+            return -1;
+        #endif
+        ++t;
+    }
+    return 0;
+}
+
+#include <string.h>
+static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) {
+    size_t len = strlen(s);
+    if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) {
+        PyErr_SetString(PyExc_OverflowError, "byte string is too long");
+        return -1;
+    }
+    return (Py_ssize_t) len;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
+    Py_ssize_t len = __Pyx_ssize_strlen(c_str);
+    if (unlikely(len < 0)) return NULL;
+    return __Pyx_PyUnicode_FromStringAndSize(c_str, len);
+}
+static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) {
+    Py_ssize_t len = __Pyx_ssize_strlen(c_str);
+    if (unlikely(len < 0)) return NULL;
+    return PyByteArray_FromStringAndSize(c_str, len);
+}
+static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) {
+    Py_ssize_t ignore;
+    return __Pyx_PyObject_AsStringAndSize(o, &ignore);
+}
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
+#if !CYTHON_PEP393_ENABLED
+static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
+    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
+static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
+    if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL;
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
+    if (likely(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
+#endif
+static CYTHON_INLINE const 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)) {
+        return __Pyx_PyUnicode_AsStringAndSize(o, length);
+    } else
+#endif
+#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
+    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 int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) {
+    int retval;
+    if (unlikely(!x)) return -1;
+    retval = __Pyx_PyObject_IsTrue(x);
+    Py_DECREF(x);
+    return retval;
+}
+static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) {
+    __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result));
+#if PY_MAJOR_VERSION >= 3
+    if (PyLong_Check(result)) {
+        if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
+                "__int__ returned non-int (type " __Pyx_FMT_TYPENAME ").  "
+                "The ability to return an instance of a strict subclass of int is deprecated, "
+                "and may be removed in a future version of Python.",
+                result_type_name)) {
+            __Pyx_DECREF_TypeName(result_type_name);
+            Py_DECREF(result);
+            return NULL;
+        }
+        __Pyx_DECREF_TypeName(result_type_name);
+        return result;
+    }
+#endif
+    PyErr_Format(PyExc_TypeError,
+                 "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")",
+                 type_name, type_name, result_type_name);
+    __Pyx_DECREF_TypeName(result_type_name);
+    Py_DECREF(result);
+    return NULL;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
+#if CYTHON_USE_TYPE_SLOTS
+  PyNumberMethods *m;
+#endif
+  const char *name = NULL;
+  PyObject *res = NULL;
+#if PY_MAJOR_VERSION < 3
+  if (likely(PyInt_Check(x) || PyLong_Check(x)))
+#else
+  if (likely(PyLong_Check(x)))
+#endif
+    return __Pyx_NewRef(x);
+#if CYTHON_USE_TYPE_SLOTS
+  m = Py_TYPE(x)->tp_as_number;
+  #if PY_MAJOR_VERSION < 3
+  if (m && m->nb_int) {
+    name = "int";
+    res = m->nb_int(x);
+  }
+  else if (m && m->nb_long) {
+    name = "long";
+    res = m->nb_long(x);
+  }
+  #else
+  if (likely(m && m->nb_int)) {
+    name = "int";
+    res = m->nb_int(x);
+  }
+  #endif
+#else
+  if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) {
+    res = PyNumber_Int(x);
+  }
+#endif
+  if (likely(res)) {
+#if PY_MAJOR_VERSION < 3
+    if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) {
+#else
+    if (unlikely(!PyLong_CheckExact(res))) {
+#endif
+        return __Pyx_PyNumber_IntOrLongWrongResultType(res, name);
+    }
+  }
+  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))) {
+    if (sizeof(Py_ssize_t) >= sizeof(long))
+        return PyInt_AS_LONG(b);
+    else
+        return PyInt_AsSsize_t(b);
+  }
+#endif
+  if (likely(PyLong_CheckExact(b))) {
+    #if CYTHON_USE_PYLONG_INTERNALS
+    if (likely(__Pyx_PyLong_IsCompact(b))) {
+        return __Pyx_PyLong_CompactValue(b);
+    } else {
+      const digit* digits = __Pyx_PyLong_Digits(b);
+      const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b);
+      switch (size) {
+         case 2:
+           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case -2:
+           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case 3:
+           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case -3:
+           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case 4:
+           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+         case -4:
+           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+           }
+           break;
+      }
+    }
+    #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 Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) {
+  if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) {
+    return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o);
+#if PY_MAJOR_VERSION < 3
+  } else if (likely(PyInt_CheckExact(o))) {
+    return PyInt_AS_LONG(o);
+#endif
+  } else {
+    Py_ssize_t ival;
+    PyObject *x;
+    x = PyNumber_Index(o);
+    if (!x) return -1;
+    ival = PyInt_AsLong(x);
+    Py_DECREF(x);
+    return ival;
+  }
+}
+static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
+  return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False);
+}
+static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
+    return PyInt_FromSize_t(ival);
+}
+
+
+/* #### Code section: utility_code_pragmas_end ### */
+#ifdef _MSC_VER
+#pragma warning( pop )
+#endif
+
+
+
+/* #### Code section: end ### */
+#endif /* Py_PYTHON_H */
diff --git a/update_android_bp.sh b/update_android_bp.sh
index c367ecd..051eca6 100755
--- a/update_android_bp.sh
+++ b/update_android_bp.sh
@@ -58,6 +58,16 @@
 cat $TEMP/grpc_unsecure_srcs.txt >> $OUT
 echo ']' >> $OUT
 
+# update the cython cpp file
+BAZEL_ROOT="/tmp/grpc_bazel"
+BAZEL_OUT="${BAZEL_ROOT}/output"
+mkdir -p "${BAZEL_OUT}"
+
+if ! /usr/bin/bazel --output_base="${BAZEL_OUT}" --output_user_root="${BAZEL_ROOT}" build --experimental_convenience_symlinks=ignore //src/python/grpcio/grpc/_cython:cygrpc.pyx_cython_translation; then
+  echo "Failed to build cygrpc.pyx_cython_translation"
+  exit 1
+fi
+
 popd
 
 BPOUT=Android.bp
@@ -72,3 +82,7 @@
         }; \@$LIST_END@p; d }" $BPOUT
 
 echo "Android.bp file lists updated."
+
+
+cp "$(find "${BAZEL_OUT}" -name 'cygrpc.cpp')" "${GRPC_PATH}/src/python/grpcio/grpc/_cython/cygrpc.cpp"
+echo "cygrpc.cpp file updated."
